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