Мой скрипт Greasemonkey не находит элементы (ссылки) на странице? - PullRequest
1 голос
/ 14 марта 2012

Веб-сайт: lexin.nada.kth.se / lexin / # searchinfo = both, swe_gre, hej;

Мой скрипт:

function main(){
  var links=document.getElementsByTagName("a");
  alert("There are " + links.length + "links.");
}

main();

Запуск сценария дает мне два предупреждающих сообщения, говорящих

0 ссылок.

Есть идеи, почему я не могу получить нужное количество ссылок из документа? И почему я получаю предупреждение дважды?

1 Ответ

3 голосов
/ 15 марта 2012
  1. Предупреждение срабатывает более одного раза, потому что эта страница содержит iFrames (де-факто тот же URL-адрес, что и главная страница). Greasemonkey рассматривает iFrames, как если бы они были автономными веб-страницами. Используйте @noframes, чтобы остановить это.

  2. Скрипт не находит ссылки, потому что они добавляются javascript спустя много времени после загрузки страницы и запуска скрипта GM. Это общая проблема со скриптами и AJAX. Простое и надежное решение - использовать waitForKeyElements() (и jQuery).

Вот полный пример сценария , который избегает iFrames и показывает, как получить динамические ссылки:

// ==UserScript==
// @name     _Find elements added by AJAX
// @include  http://YOUR_SERVER.COM/YOUR_PATH/*
// @match    http://stackoverflow.com/questions/*
// @require  http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js
// @require  https://gist.github.com/raw/2625891/waitForKeyElements.js
// @noframes
// @grant    GM_addStyle
// ==/UserScript==
/*- The @grant directive is needed to work around a design change
    introduced in GM 1.0.   It restores the sandbox.
*/
var totalUsrLinks   = 0;

waitForKeyElements ("a[href*='/users/']", listLinks);

function listLinks (jNode) {
    var usrMtch     = jNode.attr ("href").match (/^.*\/users\/(\d+)\/.*$/);
    if (usrMtch  &&  usrMtch.length > 1) {
        totalUsrLinks++;
        var usrId   = usrMtch[1];
        console.log ("Found link for user: ", usrId, "Total links = ", totalUsrLinks);
    }
}
...