2011-12-29 78 views
3

我將一個事件偵聽器附加到窗口對象。然後在腳本中使用document.write。 (我知道,這是邪惡的,我在這件事上沒有選擇。)問題是,document.write消除了我的聽衆。有可能避免這種情況嗎?如何創建生存於document.write的JS事件偵聽器?

這裏是一個說明該問題的小提琴:http://jsfiddle.net/Fuhzu/

+2

沒有選擇?不能使用div id = me me.innerHTML =「hah」?或者hah = document.createElement(span)me.appendChild(hah)? – 2011-12-29 20:18:16

+0

否 - 我必須使用其他一些現有的代碼。這可能有一天會改變,但不會立即。 – sprugman 2011-12-29 21:11:00

回答

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."; 
2

我已經找到了解決辦法是簡單地再在document.write之後附加監聽器。

更新:Doh!這一工程在Chrome,但FF拋出一個錯誤:如果我document.writing之前在卸裝處理

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

http://jsfiddle.net/NYyKH/

也許....

更新2:都能跟得上:http://jsfiddle.net/sprugman/KzNbX/1/

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/

+0

說起來容易做起來難,當你的腳本是一個廣告鏈的一部分時,它會調用更多可能包含或不包含document.write的腳本。 – sprugman 2012-01-05 21:20:04

+0

@sprugman:如果你在頁面頂部聲明瞭這些腳本,那麼在這些腳本運行之前呢? – 2012-01-05 21:21:44

+0

我無法控制頁面。我正在創建一個腳本,其他人在他們的頁面中嵌入,並且有許多可能的嵌入情況,因此覆蓋document.write可能很容易在我不知情的情況下破壞某些內容。 – sprugman 2012-01-06 16:18:38

0

,我沒有使用文件試過這種.write,但也許它有幫助: http://api.jquery.com/live/

Attach an event handler for all elements which match the current selector, now and in the future

+0

似乎不起作用http://jsfiddle.net/Fuhzu/2/ =( – 2012-01-06 16:31:36