0

我正在尝试编写一个简单的用户脚本,它对 twitter 中的 textarea 做一些事情。

在 Chrome 中使用调试控制台时,“document.getElementsByTagName('textarea')”返回一个包含文本框的数组(您在其中键入推文),但在我的用户脚本中它只返回一个空数组。我在这里做一些非常基本和错误的事情吗?我已经尝试过使用和不使用“@run-at document-end”,但两者都无法进入文本区域。

谢谢阅读!

// ==UserScript==
// @name twitter-edit
// @namespace foo
// @description twitter
// @match http://www.twitter.com/*
// @match https://www.twitter.com/*
// @match https://twitter.com/*
// @match http://twitter.com/*
// @run-at document-end
// ==/UserScript==

(function() {
    var textareas = document.getElementsByTagName('textarea');
    window.alert('textareas len ' + textareas.length); // <-- **THIS SOMEHOW RETURNS 0**
    if (textareas.length != 1) {
        window.alert('error');  
    } else {
        var tweetbox = textareas[0];
            window.alert('tweetbox: ' + tweetbox);
    }
}());   
4

2 回答 2

0

您确定脚本执行时 textarea 已经存在吗?

我可以在 twitter 上的 DOM 中找到 textarea,但在页面静态 html 代码中找不到,所以它可能是在页面收费后加载的。您的脚本应该在 textarea 出现后加载。

于 2011-07-24T21:40:25.197 回答
0

因为该站点充满了 ajax,并且因为它潜入了至少 1 个 iFrame,所以您必须稍等片刻,您的脚本才能看到该文本框。

此外,当在 Twitter 上关注链接时,页面通常只是由 AJAX 方法更改。在这种情况下,普通脚本不会触发。

作为补偿,只需设置一个计时器,它会不断检查该 Twitter 框,并在页面被 ajax“重新加载”时捕获新框。

该脚本有效:

// ==UserScript==
// @name twitter-edit
// @namespace foo
// @description twitter
// @match http://www.twitter.com/*
// @match https://www.twitter.com/*
// @match https://twitter.com/*
// @match http://twitter.com/*
// @run-at document-end
// ==/UserScript==

//--- This handles both page-load delays, and AJAX changes.
setInterval (function() { checkForTweetbox (); }, 500);

function checkForTweetbox () {
    var tweetbox = document.querySelector ('div.tweet-box textarea');
    if (tweetbox) {
        if (! tweetbox.weHaveProcessed) {
            tweetbox.weHaveProcessed    = true;
            alert ('New tweet-box found!');
        }
    }
}
于 2011-07-25T00:25:43.137 回答