我的Greasemonkey脚本没有在页面上找到元素(链接)?

时间:2012-03-14 14:17:06

标签: javascript dom greasemonkey tampermonkey getelementsbytagname

网站是: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个链接。

为什么我无法从文档中获取正确数量的链接?为什么我要两次收到警报?

2 个答案:

答案 0 :(得分:3)

  1. 警告会多次触发,因为该页面包含iFrame(事实上,与主页面的URL相同)。 Greasemonkey将iFrame视为独立网页。使用@noframes来阻止它。

  2. 脚本没有找到链接,因为在页面加载和GM脚本触发后很久就会通过javascript添加它们。这是脚本和AJAX的常见问题。一个简单而强大的解决方案是使用waitForKeyElements()(和jQuery)。

  3. 以下是完整的示例脚本,它可以避免使用iFrame并显示如何获取动态链接:

    // ==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);
        }
    }
    

答案 1 :(得分:0)

由于.getElementsByTagName返回了HTMLcollection,因此,您必须使用.getElementsByTagName声明HTMLcollection,然后找到长度并发出警报。看起来像这样...

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

我添加了IIFE或立即调用功能表达式 more on IIFEs here,因此您不必调用该函数,因此代码很小,可以被“吞噬”。最后,它正在警告2个警告框,因为该函数中有一个[alert box](警告框),而您正在调用该函数,因此它将执行相同的操作。