1

我试图让代码每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 脚本中的代码。谢谢你。

4

2 回答 2

1

更新(现在给出了目标页面):问题代码与实际页面
的结构不匹配。它通常会抛出错误。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 的错误控制台,ControlShiftJ显示设置为“错误”或“全部”。
  • 脚本中的其他内容,您没有向我们展示,是问题所在。 包含或链接到完整的 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节点的结构),我们无法提供特定的替代方案。

于 2013-07-12T12:52:44.907 回答
0

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

var e = window.addEventListener ? window.addEventListener : window.attachEvent;
e('load',function(){ ... };
于 2013-07-12T12:55:31.733 回答