4

我正在将事件侦听器附加到窗口对象。然后在脚本的后面,正在使用 document.write。(我知道,这是邪恶的。我在这件事上别无选择。)问题是,document.write 消灭了我的听众。有可能避免这种情况吗?

这是一个说明问题的小提琴:http: //jsfiddle.net/Fuhzu/

4

4 回答 4

3

这是不可能的。document.write卸载当前文档,并创建一个新文档。

确认演示:http: //jsfiddle.net/Gk3cX/

window.test = document; //Cache document
document.write('<button onclick="alert(window.test===document)">CLick</button>');
// Clicking shows false! The document has changed!

在不卸载的情况下覆盖当前文档的唯一选择是innerHTML

document.body.innerHTML = "Overwritten document's content, kept events.";
于 2011-12-29T20:14:26.553 回答
2

我发现的解决方法是在 document.write 之后简单地重新附加侦听器。

更新:Doh!这适用于 Chrome,但 FF 会引发错误:

attempt to run compile-and-go script on a cleared scope

http://jsfiddle.net/NYyKH/

也许如果我在 document.writing 之前取消附加处理程序......

更新 2:不:http: //jsfiddle.net/sprugman/KzNbX/1/

于 2011-12-29T21:13:15.560 回答
0

用你自己的函数替换怎么样document.write,这样它就不会破坏页面。

像这样的东西:

document.write = function(str){
    document.body.innerHTML = str;
};

或者,如果您不想擦除整个页面:

document.write = function(str){
    document.body.innerHTML += str;
};

演示:http: //jsfiddle.net/Fuhzu/1/

于 2011-12-29T21:22:36.967 回答
0

我没有用 document.write 试过这个,但也许它有帮助: http ://api.jquery.com/live/

为现在和将来匹配当前选择器的所有元素附加一个事件处理程序

于 2011-12-29T22:21:54.380 回答