为什么这个chrome / Greasemonkey脚本没有执行?

时间:2011-08-02 07:53:58

标签: javascript google-chrome greasemonkey

我有以下简单的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);
        }
    }

})();

如果我通过firebug运行JavaScript代码段,它会做正确的事情,但如果我安装它并访问搜索结果页面,它似乎不会执行脚本。

这可能是微不足道的,但任何人都可以指出我错过的东西吗?

2 个答案:

答案 0 :(得分:1)

我发现一些脚本虽然非常简单但不能在chrome中运行,但是我确实找到了一个完全支持greasemonkey脚本的chrome扩展,它被称为Tampermonkey

答案 1 :(得分:1)

主要的是Google ajaxes-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内,ID为“search”。
  2. 最好将// @run-at document-end指令添加到此类脚本中。
  3. 当前脚本的@match指令过于宽泛,脚本将在每个网页上触发!
    您可能希望将其限制为:

    // @match http://www.google.com/*
    // @match http://google.com/*
    
  4. 没有必要或指向将代码包装在匿名函数中,例如:(function() { ... })();