Usercript не работает должным образом [дублировать]

nth-of-type работает в соответствии с индексом того же типа элемента, но nth-child работает только в соответствии с индексом независимо от того, какой тип элементов сиблингов.

Например

<div class="one">...</div>
<div class="two">...</div>
<div class="three">...</div>
<div class="four">...</div>
<div class="five">...</div>
<div class="rest">...</div>
<div class="rest">...</div>
<div class="rest">...</div>
<div class="rest">...</div>
<div class="rest">...</div>

Предположим, что в выше html мы хотим скрыть все элементы, имеющие класс отдыха.

В этом случае nth-child и nth-of-type будут работать точно так же, как и все элементы одного типа, <div>, поэтому css должен быть

.rest:nth-child(6), .rest:nth-child(7), .rest:nth-child(8), .rest:nth-child(9), .rest:nth-child(10){
    display:none;
}

OR

.rest:nth-of-type(6), .rest:nth-of-type(7), .rest:nth-of-type(8), .rest:nth-of-type(9), .rest:nth-of-type(10){
    display:none;
}

Теперь вам должно быть интересно узнать, в чем разница между nth-child и nth-of-type, так что это разница

Предположим, что html is

<div class="one">...</div>
<div class="two">...</div>
<div class="three">...</div>
<div class="four">...</div>
<div class="five">...</div>
<p class="rest">...</p>
<p class="rest">...</p>
<p class="rest">...</p>
<p class="rest">...</p>
<p class="rest">...</p>

В приведенном выше html тип элемента .rest отличается от других .rest - это абзацы, а другие - div, поэтому в этом случае if вы используете nth-child, вы должны писать так

.rest:nth-child(6), .rest:nth-child(7), .rest:nth-child(8), .rest:nth-child(9), .rest:nth-child(10){
    display:none;
}

, но если вы используете nss-тип css, это может быть

.rest:nth-of-type(1), .rest:nth-of-type(2), .rest:nth-of-type(3), .rest:nth-of-type(4), .rest:nth-of-type(5){
    display:none;
}

Как тип Элементом .rest является <p>, поэтому здесь nth-of-type обнаруживает тип .rest, а затем он накладывает css на 1-й, 2-й, 3-й, 4-й, 5-й элементы <p>.

7
задан Brock Adams 15 July 2012 в 05:53
поделиться

1 ответ

Чтобы AJAX смог «дождаться, пока страница будет отображаться», на самом деле нужно будет полностью обработать страницу, извлечь и запустить все включенные файлы CSS и javascript. Это непросто и не рекомендуется. К счастью, вам все равно не нужно это делать.

Вот три лучших способа подхода к этой проблеме:

  1. Страница ресурсов (mpdining.rewardsnetwork.com, для этого вопроса) может иметь API. Если это так, найдите его и используйте. Это ваш лучший выбор, если он доступен.
  2. Проанализируйте javascript и / или AJAX-запросы страницы ресурса. Используйте GM_xmlhttpRequest(), чтобы напрямую извлекать только данные полезной нагрузки, а не пытаться проанализировать страницу ресурсов. Иногда этот процесс довольно прост, но для некоторых сайтов требуется сложное взаимодействие и / или аутентификация.
  3. Загрузите страницу ресурса в скрытом iframe; установите сценарий Greasemonkey для запуска как на странице ресурсов, так и на главной странице и для передачи желаемых данных с помощью postMessage() . Этот подход почти всегда будет работать, хотя вам, возможно, придется помешать некоторым страницам пытаться «выкинуть» iframe.

Использование скрытого iframe для получения данных из междоменной страницы ресурсов:

Сценарии Greasemonkey будут запускаться как на обычной странице, так и на страницах внутри iframe. Фактически, вы можете установить один и тот же сценарий для работы как на двух, так и на нескольких доменах.

Если главная страница и страница ресурса iframed оба сценария сценариев GM, экземпляры сценария могут связываться друг с другом, кросс-домен, используя postMessage() .

Например, предположим, что у нас есть сайт, fiddle.jshell.net/9ttvF/show , который содержит данные о путешествии, и мы хотим mash-up , чтобы сайт с соответствующими данными с ресурсного сайта , jsbin.com/ahacab , который использует AJAX для получения своих полезных данных.

Целевой (основной) сайт выглядит так: target site [/g13]

Сначала сайт ресурса выглядит следующим образом: resource site, start [/g14]

Затем заканчивается следующим образом: resource site, finish [/g15]

Следующий скрипт:

  1. Загружает страницу ресурса в скрытом iframe.
  2. Запускает второй экземпляр, который выполняется на iframed page.
  3. Ожидает завершение страницы iframed, обработка результатов по желанию .
  4. Отправляет требуемые данные полезной нагрузки в GM-скрипт, запущенный на целевой (главной) странице.
  5. Затем скрипт целевой страницы вставляет данные полезной нагрузки для завершения разметки.
// ==UserScript==
// @name     _Cross-site, AJAX scrape demo
// @include  http://fiddle.jshell.net/9ttvF/show/
// @include  http://jsbin.com/ahacab*
// @require  http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js
// @require  https://gist.github.com/raw/2625891/waitForKeyElements.js
// @grant    GM_addStyle
// ==/UserScript==

if (/fiddle\.jshell\.net/i.test (location.host) ) {
    console.log ("***Master-page start...");

    /*--- Inform the user.
    */
    $("#plainResults").before (
        '<div id="gmFetchRez">Greasemonkey is fetching results from jsbin.com...</div>'
    );

    /*--- Setup to process messages from the GM instance running on the iFrame:
    */
    window.addEventListener ("message", receiveMessage, false);

    /*--- Load the resource site in a hidden iframe.
    */
    $("body").append ('<iframe src="http://jsbin.com/ahacab" id="gmIframe"></iframe>');
}
else {
    console.log ("***Framed start...");
    /*--- Wait for the AJAXed-in content...
    */
    waitForKeyElements ("#results table.rezTable", sendResourcePageData);
}

function sendResourcePageData (jNode) {
    console.log ("Results found!  Sending them to the main window...");

    window.top.postMessage (jNode.html(), "*");
}

function receiveMessage (event) {
    if (event.origin != "http://jsbin.com")     return;

    $("#gmFetchRez").html (event.data);
}

//--- Use CSS to control appearances.
GM_addStyle ( "                                 \
    #gmIframe {                                 \
        display:            none;               \
    }                                           \
    #gmFetchRez {                               \
        background:         lightYellow;        \
        border:             3px double red;     \
        padding:            1em;                \
    }                                           \
" );

Окончательный результат выглядит следующим образом: скрипт установлен и запущен: mashup result [/g16]

9
ответ дан Brock Adams 18 August 2018 в 09:38
поделиться
  • 1
    Брок .. прежде чем я скажу что-нибудь еще. Пожалуйста, позвольте мне сказать это. Это чистая и неразбавленная удивительность. Я благодарю вас за изысканные детали. Огромное спасибо. Я пропустил упоминание о том, что у меня на втором сайте нет API, и я потратил часы, пытаясь понять, что это запросы ресурсов, с помощью Firebug, безрезультатно. Последнее осложнялось тем, что второй сайт использует DWR. Я очень рад третьему варианту, отчитаюсь как можно скорее. Спасибо, что нашли время, чтобы составить такое замечательное объяснение. – Ashutosh Jindal 15 July 2012 в 21:24
  • 2
    Брок, это работает !!!! :) Большое спасибо !! Я немного почищу свой скрипт и отправлю его, чтобы другие могли ссылаться на него! Приветствия! – Ashutosh Jindal 15 July 2012 в 22:06
  • 3
    Отлично! У вас это работает! Рад помочь. – Brock Adams 16 July 2012 в 00:16
Другие вопросы по тегам:

Похожие вопросы: