Почему этот скрипт chrome / Greasemonkey не выполняется? - PullRequest
1 голос
/ 02 августа 2011

У меня есть следующий простой скрипт Greasemonkey:

// ==UserScript==
// @name MetaCPAN Everywhere
// @description Add to every link to CPAN a link to MetaCPAN on a Google results page.
// @namespace http://ajct.info
// @match http://*/*
// @version 0.1
// ==/UserScript==

(function() {

    var page_links = document.links;
    for (var i=0; i<page_links.length; i++){
        if (page_links[i].href.match(/http:\/\/search\.cpan\.org\/perldoc\?(.*?)$/i)) {
            var match = page_links[i].href.match(/http:\/\/search\.cpan\.org\/perldoc\?(.*?)$/i);
            var span = document.createElement("span");
            span.innerHTML = "&nbsp; <a href=\"http://www.metacpan.org/module/"+match[1]+"\">MetaCPAN</a>";
            page_links[i].parentNode.insertBefore(span, page_links[i].nextSibling);
        }
    }

})();

Если я запускаю фрагмент JavaScript через firebug, он делает все правильно, но если я его устанавливаю и захожу на страницу результатов поиска, похоже,выполнить сценарий.

Это, вероятно, что-то тривиальное, но кто-нибудь может указать, что я пропустил?

Ответы [ 2 ]

1 голос
/ 02 августа 2011

Главное, что Google ajax-in почти во всех своих результатах, поэтому вам нужен способ дождаться первой партии и проверить, есть ли последующие партии.

Есть множество техник. Проще всего использовать таймер:

//--- This handles both page-load delays, and AJAX changes.
var chkInterval = setInterval (checkForResultsLinks, 500);

function checkForResultsLinks () {
    var links = document.querySelectorAll ('#search a');
    if (links) {

        for (var J = links.length - 1;  J >= 0;  --J) {
            var link    = links[J];

            if (link.weHaveProcessed) 
                continue;

            if (link.href.match (/http:\/\/search\.cpan\.org\/perldoc\?(.*?)$/i) ) {
                var match   = link.href.match (/http:\/\/search\.cpan\.org\/perldoc\?(.*?)$/i);
                var span    = document.createElement("span");
                span.innerHTML = "&nbsp; <a href=\"http://www.metacpan.org/module/"+match[1]+"\">MetaCPAN</a>";
                link.parentNode.insertBefore (span, link.nextSibling);
                link.weHaveProcessed = true;
            }
        }
    }
}


Примечания:

  1. Результаты поиска Google отображаются внутри div с идентификатором "search".
  2. Лучше всего добавить директиву // @run-at document-end к этому виду сценария.
  3. Директива @match текущего скрипта слишком широка, скрипт будет запускаться на каждой веб-странице!
    Вы, вероятно, хотите ограничить это:

    // @match http://www.google.com/*
    // @match http://google.com/*
    
  4. Нет необходимости или смысла заключать код в анонимную функцию, например: (function() { ... })();.

1 голос
/ 02 августа 2011

Я обнаружил, что некоторые скрипты, хотя и очень простые, не работают в chrome, однако я нашел расширение chrome, которое полностью поддерживает скрипты greasemonkey, оно называется Tampermonkey

...