1

以下注入在 Chrome 中完美运行,但是在最新的 Firefox(版本 21)中,文档永远保持“正在连接...”,甚至它的元素(如<img>负载)都没有。(但是,如果您单击重新加载它们,它们会显示得很好...)

截屏:
问题截图

脚本:

// ==UserScript==
// @name            Test
// @namespace       Test
// @author          Owyn
// @match           http://*
// ==/UserScript==

function inject(func) {
    var source = func.toString();
    var script = document.createElement('script');
    script.innerHTML = "("+ source +")()";
    document.body.appendChild(script);
}

function myf() {
  document.write('<html>TEST</html>');
}

inject(myf);

任何修复,任何解决方法?我应该就错误联系 Mozilla 吗?

PS - 我使用 document.write 删除所有事件侦听器(我不知道),但还没有找到替代方法。

4

1 回答 1

4

最聪明/最好(est)的事情是避免document.write(). 使用 DOM 技术。这是一个完整的脚本

// ==UserScript==
// @name     _Replace a target page using DOM techniques
// @include  http://YOUR_SERVER.COM/YOUR_PATH/*
// @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 D       = document;
var newDoc  = D.implementation.createHTMLDocument ("");

D.replaceChild (
    D.importNode (newDoc.documentElement, true),
    D.documentElement
);

D.body.innerHTML = '<h1>TEST</h1>'



Greasemonkey 通常会触发DOMContentLoaded而不是在页面完全加载完成时触发。默认情况下,Chrome 会在此之后触发。

无论如何,DOMContentLoaded在 Firefox 中;当您丢弃当前文档时,某些东西会变得孤立。因此,“悸动者”永远不会停止,可能会错过其他一些清理工作。

document.write()这可能是一个错误,但无论如何您都不应该使用。此外,根据DOC,您应该致电document.close()

一个肮脏的解决方法是等到页面加载后再触发。所以,不要inject(myf);直接调用,而是这样调用它:

function myf () {
  document.write ('<html>TEST</html>');
  document.close ();
}

window.addEventListener ("load", function () { inject(myf); }, false);


而是使用 DOM 方法! 它们会更快,并且不会触发边缘情况错误和安全违规。

于 2013-06-03T11:34:39.590 回答