我正在将事件侦听器附加到窗口对象。然后在脚本的后面,正在使用 document.write。(我知道,这是邪恶的。我在这件事上别无选择。)问题是,document.write 消灭了我的听众。有可能避免这种情况吗?
这是一个说明问题的小提琴:http: //jsfiddle.net/Fuhzu/
我正在将事件侦听器附加到窗口对象。然后在脚本的后面,正在使用 document.write。(我知道,这是邪恶的。我在这件事上别无选择。)问题是,document.write 消灭了我的听众。有可能避免这种情况吗?
这是一个说明问题的小提琴:http: //jsfiddle.net/Fuhzu/
这是不可能的。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.";
我发现的解决方法是在 document.write 之后简单地重新附加侦听器。
更新:Doh!这适用于 Chrome,但 FF 会引发错误:
attempt to run compile-and-go script on a cleared scope
也许如果我在 document.writing 之前取消附加处理程序......
更新 2:不:http: //jsfiddle.net/sprugman/KzNbX/1/
用你自己的函数替换怎么样document.write
,这样它就不会破坏页面。
像这样的东西:
document.write = function(str){
document.body.innerHTML = str;
};
或者,如果您不想擦除整个页面:
document.write = function(str){
document.body.innerHTML += str;
};
演示:http: //jsfiddle.net/Fuhzu/1/
我没有用 document.write 试过这个,但也许它有帮助: http ://api.jquery.com/live/
为现在和将来匹配当前选择器的所有元素附加一个事件处理程序