HTML 5 - Ajax popstate и pushstate

Я пытаюсь понять, как использовать это pushstate и popstate для моих приложений ajax. Я знаю, что есть некоторые плагины, но сейчас я пытаюсь научиться использовать их в необработанном виде. Я также знаю, что в чистом виде он не поддерживается IE. Помимо всего прочего, мне нужна помощь в понимании того, как его использовать.

часть pushstate довольно проста. Прямо сейчас у меня есть:

function loadForm(var1,var2){ 
    string = "xyz="+var1+"&abc="+var2;
        history.pushState("", "page 1", string);
 }

Это меняет мой URL-адрес и добавляет его в мой стек URL-адресов. У меня есть еще одна функция, которая выглядит следующим образом:

function loadForm2(var1,var2, var3){ 
    string = "xyz="+var1+"&abc="+var2+"&123="+var3;
        history.pushState("", "page 2", string);
}

Вторая функция также меняет URL-адрес при вызове. Теперь, когда у меня есть эта часть, я пытаюсь понять, как использовать popstate. Прямо сейчас у меня это так

window.popState = ajax;

function ajax(){
   jQuery.ajax({               
     type: "get",
     url: "../html_form.php",
     data: string,
     dataType: "html",
     success: function(html){
       jQuery('#Right_Content').hide().html(html).fadeIn('slow');
       validate();
       toolTip();   
     }  
   })
}

Итак, если вы можете отобразить мою страницу с двумя ссылками, одна вызывает функцию loadForm, а другая ссылка вызывает функцию loadForm2. Когда я нажимаю каждую из ссылок, формы загружаются через ajax, и URL-адрес изменяется, как и должен. Когда я нажимаю кнопку «Назад», URL-адрес откатывается к URL-адресу предыдущей страницы, НО содержимое страницы снова загружает текущую форму вместо предыдущей. Когда я нажимаю кнопку «Назад», он выполняет вызов ajax (firebug), как если бы он пытался загрузить предыдущую форму, но вместо запуска предыдущего вызова ajax он запускает текущий вызов ajax. Таким образом, мой URL-адрес возвращается к предыдущему URL-адресу, но загруженная форма или вызываемый вызов ajax совпадают с последней загрузкой страницы (а не с предыдущей загрузкой страницы).

Я не уверен, что делаю неправильно, и любая помощь будет принята с благодарностью.


person user982853    schedule 18.03.2012    source источник


Ответы (1)


Вы делаете что-то странное.

window.popState = ajax;

Я даже удивлен, что ajax() даже позвонили.

Обычный способ сделать это - зарегистрировать обработчик событий.

$(window).bind('popstate', function(event) {
    var state = event.originalEvent.state;
}

См. Как запустить изменить при использовании кнопки возврата с history.pushstate и popstate?

РЕДАКТИРОВАТЬ:

В основном вам нужно знать, какую форму загружать при изменении вашего состояния. .originalEvent.state будет содержать эту информацию, которую вы затем можете передать своему вызову ajax. Он также должен содержать соответствующий string.

Проблема в вашем подходе в том, что string всегда оставалась одной из последних вновь загруженных страниц. Вам нужно прочитать эту строку в event.orginalEvent.state. используйте console.log(), чтобы найти его в этом объекте.

РЕДАКТИРОВАТЬ 2:

Есть ли способ дать мне пример того, как должен выглядеть мой код? Думаю, вы понимаете, чего я пытаюсь достичь.

Каждый раз, когда нажимается кнопка «Назад» (или кнопка «Вперед») в браузере, вам необходимо загрузить страницу из AJAX.

Вы попытались сделать это, сказав:

window.popState = ajax;

Это опасно, поскольку вы заменяете системную функцию.

Вместо этого вам следует зарегистрировать обработчик событий при изменении состояния.

jQuery(window).bind('popstate', ajax);

Теперь каждый раз, когда нажимается кнопка возврата, ваша ajax() функция (должна) вызываться.

Пока это только улучшит ваш подход к этому, но не решит вашу проблему.

Проблема в том, что ваша исходная функция ajax() ссылается на глобальную переменную с именем string. Эта глобальная переменная не запоминает предыдущие состояния. Поэтому каждый раз исходная форма загружается снова и снова.

Но вы уже правильно сохраняете string в состоянии, выполнив:

history.pushState("", "page 1", string);

Поэтому, когда вызывается ajax, браузер передает ему объект события, который содержит всю эту информацию.

Итак, все, что вам нужно сделать сейчас, это изменить свой ajax() следующим образом:

function ajax(){
   jQuery.ajax({               
     type: "get",
     url: "../html_form.php",
     data: document.location.search.substr(1),
     dataType: "html",
     success: function(html){
       jQuery('#Right_Content').hide().html(html).fadeIn('slow');
       validate();
       toolTip();   
     }  
   })
}

Наконец, вам также следует прекратить использование string в качестве глобальной переменной с помощью ключевого слова var и убедиться, что строка содержит "?":

function loadForm(var1,var2){ 
    var string = "?xyz="+var1+"&abc="+var2;
        history.pushState("", "page 1", string);
 }

Это уменьшит любую путаницу в будущем по поводу того, что что-то почти работает, но не работает должным образом.

person d_inevitable    schedule 18.03.2012
comment
Есть ли способ дать мне пример того, как должен выглядеть мой код? Думаю, вы понимаете, чего я пытаюсь достичь. Будучи новичком, я понятия не имею, что означает код выше. Спасибо. - person user982853; 18.03.2012
comment
Ну ладно, ты выглядел как более продвинутый пользователь. Уточню свой ответ сейчас. - person d_inevitable; 19.03.2012
comment
Большое вам спасибо за то, что вы уделили столько времени этому ответу. Он дал мне много информации на сайте о том, как это работает. Используя приведенный выше код, я получаю сообщение об ошибке event.originalEvent.state.url имеет значение null. Какие-либо предложения? Спасибо. - person user982853; 19.03.2012
comment
Пожалуйста, прочтите ответ внимательно. Особенно комментарии. Я уже предвидел, что это может произойти. В противном случае, пожалуйста, постарайтесь уточнить свой вопрос, чтобы я мог вам помочь. - person d_inevitable; 19.03.2012
comment
хорошо, попробуйте заменить эту строку на var string = document.location.search.substr(1); - person d_inevitable; 19.03.2012
comment
Когда я не комментирую какой-либо из комментариев, он выдает ошибку нулевого URL-адреса до того, как раскомментированный раздел может поместить информацию в консоль. Итак, я не смог просмотреть, что находится в консоли. Стоит ли закомментировать URL? - person user982853; 19.03.2012
comment
Да, цель состоит в том, чтобы найти, где внутри четной строки или строки document.location хранится. Вы уже пробовали document.location, который я размещал раньше? - person d_inevitable; 19.03.2012
comment
позвольте нам продолжить обсуждение в чате - person user982853; 19.03.2012
comment
как обойтись без jquery? - person SuperUberDuper; 20.03.2015