Что происходит с событиями окна при смене документов?

Привет, у меня есть следующее событие 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)? Если не "вы на самом деле пишете в пустое окно, где вы можете потерять объект" История ".