Jquery Asual Address — кнопка «Назад» PopState

Я пытаюсь использовать подключаемый модуль Asual Address, чтобы моя кнопка "Назад" работала при вызовах ajax. Я так запутался в том, как это работает, и в каждом учебнике, который я нахожу, говорится, что это нужно делать по-другому. Я не смог заставить ни одного из них работать.

У меня есть простая страница ajax. Он просто вызывает изображение:

Javascript:

<script type="text/javascript">    


$("a").live("click", function(event) {      
    url = $(this).attr("href");
     $.address.value($(this).attr('href')); 
    event.preventDefault();
        $.ajax({
            type: "get",
            url: "/"+url+".php",
            data: "",
            dataType: "html",
            success: function(html){
                jQuery('#Right_Content').hide().html(html).fadeIn(1000);
            },
         })

});
</script>

Мой HTML выглядит так:

<body>
<a href="push1" onclick="return false;" >Image 1</a>
<a href="push2" onclick="return false;">Image 2</a>  

<div id="Right_Content"></div>

</body>

Используя приведенный выше код, когда я нажимаю на ссылку, он выполняет вызов ajax, загружает фотографии и меняет URL-адрес. Это работает нормально. У меня проблема с кнопкой назад. Когда я нажимаю кнопку «Назад», URL-адрес меняется на предыдущий, но содержимое страницы остается прежним. Я думаю, что это как-то связано с «popstate» и добавлением этого в мой js. Я просто не знаю, как это сделать.

Может кто-нибудь объяснить мне, как работает popstate и как я могу добавить его в мой код выше, чтобы моя кнопка «Назад» работала. Спасибо.

ПОЛНАЯ СТРАНИЦА

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>

<script src="/JS_Functions/jquery-ui-1.8.17.custom/js/jquery-1.7.1.min.js"></script>
<script src="/JS_Functions/jquery-ui-1.8.17.custom/js/jquery-ui-1.8.17.custom.min.js"></script>
<script src="JS_Functions/jquery.address-1.4/jquery.address-1.4.min.js"></script>
<script type="text/javascript">
$.address.init(function(event) {
  // All elements with the "history" class will be "addressed". When they get clicked
  // the href will get used as the new #part of the URL
$('a').address();
$('a').live("click", function(){
    var href = $(this).attr( "href" );  
    $.ajax({
                        type: "get",
                        url: "/"+href+".php",
                        data: "",
                        dataType: "html",
                        success: function(html){
                        jQuery('#Right_Content').hide().html(html).fadeIn(1000);
                        },               
    })

})
}).change(function(event) {
  //Every time the url part changes this will be called. 

  // As an example here I determine the # part of the URL and default to 'home'
  var hash = event.path.substring(1);
  hash = hash? hash.toLowerCase(): 'push1';

  //.. do the stuff here that you need to do when hash has a certain value

});

</script>
</head>
<body>
<a href="push1" >Image 1</a>
<a href="push2" >Image 2</a>  

<div id="Right_Content"></div>



</body>
</html>

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


Ответы (2)


Моя задача состояла в том, чтобы позволить пользователю вернуться назад для некоторых страниц и предотвратить возврат без сообщения о том, что он потеряет данные, с других страниц. Я закончил реализацию следующим образом:

$(".-step-1-").click(function () {
   $.address.value("");
});

$(".-step-2-").click(function () {
    $.address.value("finances");
});

$(".-step-3-").click(function () {
    $.address.value("cofirmation");
});

global.previousPage = null;
$.address.init(function () {
}).change(function () {
}).externalChange(function (event) {
    if (global.previousPage == null) {
        $.address.value("");
    } else {
        showPageExternal(event.pathNames);
    }
}).internalChange(function (event) {
    global.previousPage = event.pathNames;
    showPage(event.pathNames);
});

var showPageExternal = function (pathName) {
    if (global.previousPage == null ||
        ("").localeCompare(global.previousPage) === 0 ||
        ("finances").localeCompare(global.previousPage) === 0) {
        showPage(pathName);
    }
    else {
        //This mean is coming from "confirmation" page
        global.blockUI($("#browserBackMessage"));
    }
};

var showPage = function (pathName) {
    if (("").localeCompare(pathName) === 0) {
        $(".step").hide();
        $(".-step-1").show();
    }
    if (("finances").localeCompare(pathName) === 0) {
        $(".step").hide();
        $("#finances").show();
    }
    if (("confirmation").localeCompare(pathName) === 0) {
        $(".step").hide();
        $("#confirm").show();
    }
};

global = function globalVariable() {
    return (function () { return this; })();
};
person Dima Condur    schedule 02.05.2013

Это то, что я использовал на http://www.isaac.nl/en/.

У меня есть этот HTML:

<div id="main-menu">    
  <a class="history" href="#home">Home</a>
  <a class="history" href="#who">who</a>
  <a class="history" href="#what"></a>
  <a class="history" href="#where"></a>  
</div>

В js файле делаю так:

$.address.init(function(event) {
  // All elements with the "history" class will be "addressed". When they get clicked
  // the href will get used as the new #part of the URL
  $('.history').address();

}).change(function(event) {
  //Every time the url part changes this will be called. 

  // As an example here I determine the # part of the URL and default to 'home'
  var hash = event.path.substring(1);
  hash = hash? hash.toLowerCase(): 'home';

  //.. do the stuff here that you need to do when hash has a certain value
});
person Koen Peters    schedule 07.03.2012
comment
Спасибо. :) Какой у вас последний минимальный код + html? вы видите какие-либо ошибки в консоли? - person Koen Peters; 08.03.2012
comment
Я обновил свой код выше со всей моей страницей, чтобы вы могли видеть, что происходит. Он отлично работает с ajax и меняет хэш, но когда я нажимаю кнопку «Назад», он не проходит через состояния, а просто переходит обратно на 1-ю страницу. Таким образом, задние кнопки не работают должным образом с плагином. Еще раз спасибо за вашу помощь. - person user982853; 08.03.2012
comment
Если вы добавите console.log в обработчик de .change, будет ли он отображаться в журналах при нажатии на ссылку? Если это не так, вы неправильно использовали адрес(). - person Koen Peters; 08.03.2012
comment
Я написал ASUAL по электронной почте, выразив свое разочарование в связи с невозможностью понять это. Я прикрепил свой код к электронному письму, и до конца дня я получил от них ответное электронное письмо с рабочей версией моего кода. Я был так впечатлен, что они ответили и исправили мой код, поэтому я сделал пожертвование. Спасибо за вашу помощь, ваш ответ выше был очень близок к коду, который они мне прислали. - person user982853; 09.03.2012
comment
Рад слышать. Для stackoverflow было бы хорошо, если бы вы опубликовали решение, чтобы другие люди тоже могли его увидеть. Я использовал несколько этих плагинов истории/кнопки возврата, и ASUAL, безусловно, лучший из тех, что я использовал. - person Koen Peters; 09.03.2012