Что происходит с событиями окна при смене документов?
Привет, у меня есть следующее событие statechange
, установленное в окне:
History.Adapter.bind(window,'statechange',function(e){
console.log("statechange event occured ");
//more code
var newDoc = document.open();
newDoc.write(file);
newDoc.close();
});
Я использую history.js, но это не имеет значения в этом случае, поскольку он связывает переменную statechange, я получаю значение file
, как должно быть, и работает нормально.
Теперь у меня есть этот код (и другой код) внутри внешнего js файла,
внутри файла я повторяю все теги a
и применяю следующее событие click:
$(element).on("click",function(e){
e.preventDefault();
//more code
History.pushState({file : file},title, fullHref);
});
Теперь, когда я нажимаю, документ становится измененным, как ожидалось, но при попытке использовать кнопки "назад/вперед" statechange
событие не срабатывает.
Следует отметить, что этот js также включен в файлы im. Загрузка.
Итак, моя первоначальная мысль заключалась в том, что по мере изменения документа, но окна нет, событие остается. что неверно, так как оно применяет многозначное время события statechange. Поэтому я попытался применить событие один раз, используя cookie, но все равно делает то же самое.
Теперь, если вместо изменения документа я просто применил его с помощью jQuerys .html()
, событие statechange будет запущено как exepected, поэтому я предполагаю, что оно связано с документом.
Почему это могло произойти? Я считаю, что если бы я больше понял, что происходит с событиями окна при смене документов, я мог бы решить эту проблему.
Пробы:
- Я также попробовал привязку к событию
popstate
через обычный API истории, все те же результаты дают или принимают. pushState
не запускает popstate, но кнопка "Назад" делает, но без состояния.
- Я пришел к выводу, что я не должен использовать history.js, поскольку я сужу о том, что проблема возникла оттуда, поэтому я "решил" свои проблемы с popstate, которые все еще вызывают проблемы, поскольку document.open, похоже, запускает popstate. все еще ищут дополнительную информацию.
- Я пробовал использовать
on
, тот же результат
Информация:
- Тот факт, что этот пример использует История из-за history.js, если я использую регулярный API истории, все еще те же проблемы.
Я прочитал в mdn, что:
{{gecko_minversion_note ( "1.9.2", "Начиная с Gecko 1.9.2, document.open() использует
принципала документа, URI которого он использует, вместо того, чтобы извлекать главный из стека. В результате вы больше не можете звонить document.write() в ненадежный документ из хрома, даже используя wrappedJSObject." )}}
Какой я не уверен, но я думаю, что можно решить эту проблему.
Ответы
Ответ 1
Ну, в конце я обнаружил, что все, хотя вы только меняете документ, события окна удаляются, когда они лежат внутри документа.
Я рассмотрел свои проблемы с History.js, я думаю, потому что тот факт, что im меняет документы, сломает его в какой-то момент.
Что я сделал, так это использование собственного API истории HTML5 и повторное событие popstate
в новом документе.
Ответ 2
Вы пытались связать элемент с LIVE?
$(element).click(function(e){
e.preventDefault();
//more code
History.pushState({file : file},title, fullHref);
});
становится
$(element).live('click',function(e){
e.preventDefault();
//more code
History.pushState({file : file},title, fullHref);
});
Ответ 3
Для загрузки документа вы можете использовать iframe
и легко изменить свой документ. Затем вы можете прослушивать событие click, подобное этому,
$("#iframe").load(function () {
$(this.contentWindow).click(function () {
// do your click events here
});
});
iframe перезагрузится, если вы измените значение атрибута src
как другой документ.
Ответ 4
Вы пытались установить цель в методе document.open() (см.
http://www.w3schools.com/jsref/met_doc_open.asp)?
Если не "вы на самом деле пишете в пустое окно, где вы можете потерять объект" История ".