addEventListener和setInterval在Greasemonkey脚本中以静默方式失败

时间:2013-07-12 11:36:06

标签: javascript greasemonkey setinterval addeventlistener

我正在尝试让代码执行每x个时间,并在第一次加载页面后开始这样做,而我的调试没有抛出错误,脚本实际上没有做任何事情。

所以,我有点失落,我认为它与语法或嵌套代码的方式有关。你是否可以如此善良地查看下面的代码并告诉我,我做错了什么,以及是否有更好的方法来解决它?

window.addEventListener('load', function()  {
setInterval(function setTitle(){
    var sInfo = document.getElementById("play_info");
    var iTags = sInfo.innerHTML.split("\">");
    var pTags = iTags[3].split("<");
    document.title = pTags[0];
    return setTitle;
},5000);
});

这是将在Firefox中运行的Greasemonkey脚本中的代码。谢谢。

2 个答案:

答案 0 :(得分:1)

更新(现在已提供目标页面):
问题代码与the actual page的结构不匹配。它通常会抛出TypeError: iTags[3] is undefined个错误。

使用DOM方法获取所需信息,完成工作。工作脚本是:

// ==UserScript==
// @name     _KROQ, song info to page title
// @include  http://betaplayer.radio.com/player/*
// @grant    GM_addStyle
// ==/UserScript==
/*- The @grant directive is needed to work around a design change
    introduced in GM 1.0.   It restores the sandbox.
*/
if (window.top != window.self)  //-- Don't run on frames or iframes.
    return;

window.addEventListener ('load', function () {
    setInterval (setTitle, 5000);
}, false);

function setTitle () {
    var songInfoNode = document.querySelector (
        "#play_info #oflw_shield div.sleeve.hori"
    );
    if (songInfoNode) {
        var songInfoText = songInfoNode.textContent.trim ();

        //console.log ("songInfoText", songInfoText);
        document.title = songInfoText;
    }
}



该代码“脆弱”,但它可以在具有您期望的结构的网站上正常工作。但是,唯一的“输出”是页面标题可能更改。那不会发生吗?

以下一项或多项是脚本的立即问题:

  • 页面没有您期望的结构,因此代码会抛出异常。你说,“我的调试没有错误”。确认您已检查Firefox的错误控制台 Control Shift J ,显示设置为“错误”或“全部”。
  • 脚本中的其他内容,即您没有向我们展示,是问题所在。 包含或链接到完整的Greasemonkey脚本。
  • 该脚本正在对<iframe> d内容进行操作,因此更改document.title将不起作用。 链接到目标网页。

作为参考,这里是该代码的更强大版本,它还有一个控制台消息,以便您可以验证操作:

window.addEventListener ('load', function () {
    setInterval (setTitle, 5000);
}, false);

function setTitle () {
    console.log ("Running setTitle()."); 
    var sInfo = document.getElementById ("play_info");
    if (sInfo) {
        var iTags = sInfo.innerHTML.split ("\">");
        if (iTags  &&  iTags.length > 3) {
            var pTags = iTags[3].split ("<");
            if (pTags  &&  pTags.length) {
                document.title = pTags[0];
            }
        }
    }
}

请注意,以这种方式解析HTML并不好,但是没有看到实际的目标页面(或者至少是play_info节点的结构),我们无法提供特定的替代方案。

答案 1 :(得分:0)

正如Brandon Boone所说,如果您正在寻找纯JS解决方案来查找addEventListener的跨浏览器解决方案,我建议您使用这样的解决方案。

var e = window.addEventListener ? window.addEventListener : window.attachEvent;
e('load',function(){ ... };