如何创建在document.write中存活的JS事件侦听器?

时间:2011-12-29 20:09:10

标签: javascript events document.write

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

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

4 个答案:

答案 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

http://jsfiddle.net/NYyKH/

也许如果我在document.writing ....

之前取消附加处理程序

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

答案 2 :(得分:0)

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

这样的事情:

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

或者如果你不想删除整个页面:

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

DEMO:http://jsfiddle.net/Fuhzu/1/

答案 3 :(得分:0)

我没有尝试过使用document.write,但它可能会有所帮助: http://api.jquery.com/live/

  

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