2011-12-29 1 views
3

윈도우 리스너에 이벤트 리스너를 연결하려고합니다. 그런 다음 나중에 스크립트에서 document.write가 사용됩니다. (나는 악의가있다. 나는 그 문제에 대해 선택의 여지가 없다.) 문제는, document.write가 청취자를 지워 버린다는 것이다. 그것을 피할 수 있습니까? 수 없습니다 http://jsfiddle.net/Fuhzu/document.write에서 생존하는 JS 이벤트 리스너를 어떻게 만듭니 까?

+2

선택하지 않았습니까? div id = me를 사용할 수 없습니다. me.innerHTML = "hah"? 아니면 hah = document.createElement (span) me.appendChild (hah)? –

+0

아니요 - 다른 기존 코드로 작업해야합니다. 그것은 언젠가는 바뀔 수 있지만 즉시 변할 수는 없습니다. – sprugman

답변

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!

업데이트 .... 2 내가 document.writing 전에 핸들러를 unattach 경우 어쩌면

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

http://jsfiddle.net/NYyKH/

: 그건 크롬에서 작동하지만, FF에서 오류가 발생 아니 : 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

+0

@sprugman : 스크립트를 실행하기 전에 페이지 상단에 이것을 선언하면 어떨까요? –

+0

페이지를 제어 할 권한이 없습니다. 저는 다른 사람들이 자신의 페이지에 삽입하는 스크립트를 만들고 있습니다. 가능한 많은 embedding 상황이 있으므로, document.write를 덮어 쓰면 내 지식없이 쉽게 무언가가 깨질 수 있습니다. – sprugman

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/ = ( –

관련 문제