Как я могу создать прослушиватели событий JS, которые переживают document.write? - PullRequest
3 голосов
/ 30 декабря 2011

Я прикрепляю прослушиватель событий к объекту окна.Затем в скрипте используется document.write.(Я знаю, это зло. У меня нет выбора в этом вопросе.) Проблема в том, что document.write уничтожает моих слушателей.Можно ли этого избежать?

Вот скрипка, которая иллюстрирует проблему: http://jsfiddle.net/Fuhzu/

Ответы [ 4 ]

3 голосов
/ 30 декабря 2011

Это невозможно.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 голосов
/ 30 декабря 2011

Обходной путь, который я нашел, состоит в том, чтобы просто повторно присоединить слушателей после того, как 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/

0 голосов
/ 30 декабря 2011

Я не пробовал это с document.write, но, возможно, это поможет: http://api.jquery.com/live/

Присоединить обработчик событий для всех элементов, которые соответствуют текущему селектору, сейчас и в будущем

0 голосов
/ 30 декабря 2011

Как насчет замены document.write на вашу собственную функцию, чтобы она не разрушила страницу.

Примерно так:

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

Или, если вы не хотите стирать всю страницу:

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

ДЕМО: http://jsfiddle.net/Fuhzu/1/

...