2016-01-09 2 views
0

Существует проблема с кнопкой «Назад» браузера и моего приложения. Webapp использует ajax и стандартные запросы. Это все происходит таким образом:Как объяснить браузеру запомнить запрос Ajax?

  1. Я сделать запрос GET на list.jsp страницы - это первая страница, которую вы видите в приложении, если вы проверить ссылку временного я приведенную ниже. Теперь мы на странице 1 (вся страница была перезагружена)

  2. Я делаю запрос Ajax (нажмите на ссылку - например, номер страницы) на страницу 4. Только часть страницы была перезагружена - все в порядке. Таким образом, теперь мы находимся на странице 4

  3. Я делаю запрос Ajax (щелкните по ссылке - то есть номер страницы) на страницу 5. Только часть страницы была перезагружена - все в порядке. Таким образом, теперь мы находимся на странице 5

  4. Теперь я нажимаю кнопку «назад» браузера (один шаг назад к истории) - ничего не произошло. Консоли браузера не показывают никаких изменений.

  5. Этот шаг я снова нажимаю на кнопку «назад» браузера. Оказывается, этот шаг выполняется правильно. Произошел запрос GET.

Что происходит? Почему браузер не помнит изменения, которые были атакованы на шаге 3? Как я могу указать браузеру сделать step back to history на изменения, внесенные с помощью запроса ajax?

Вы можете проверить его онлайн temp link. Просто попробуйте пойти по страницам. Розовый квадрат - это текущий индикатор страницы.


обновление 1:

Этот код инициализации после того, как загрузчик закончил загрузку Recources.

$(function() { 

    $(window).on('hashchange', refreshByHash); 

    refreshByHash(); 

    function refreshByHash() {    
     var hash = window.location.hash; 
     console.log("hash = " + hash.substring(1)); 

     /* $.ajax({ 

       url : 'paginator.action?page=' + hash, // action 
       type : 'GET', //type of posting the data 
       dataType : 'html', 
       async: true, 
       success : function(htmlData) { 
        $('#paginator').html(htmlData); 
       }, 
       error : function(xhr, ajaxOptions, thrownError) { 
        alert('An error occurred! ' + thrownError); 
       }, 

      }); */ 

     } 

}); 
+0

Используете ли вы сырой javascript или какую-то фреймворк, например angularjs или jquery? –

+1

Также будет встроен встроенный [MCVE] (http://stackoverflow.com/help/mcve), поэтому люди, отвечающие на ваш вопрос, не должны создавать пример с нуля –

+0

@hege_hegedus Я использую jquery и javascript для изменения разбивки на страницы. Ядром является Java. – rozero

ответ

0

Когда пользователь нажимает на #idPage (кстати, классы используют вместо этого, теперь у вас есть несколько элементов с одинаковыми ID и that's not good), так как href атрибут пуст, то браузер будет загружать # (и будет идти к вершине страница).

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

$('body').on('click', '#idPage', function(e) { 
    // some code goes here 
    e.preventDefault(); 
}); 

HASHTAG (#) имеет влияние на кнопки назад/вперед. Если вы добавите хэштег и нажмите «назад», браузер вернет вас в состояние до применения хэштега.

+0

Что вы подразумеваете под 'If you append hashtag'? Если теперь href содержит '#', то как его изменить? Как '# someValue'? Могу ли я поставить строку 'e.preventDefault();' сразу после '$ ('body'). On ('click', '#idPage', function (e) {'? Кстати, 'e' ссылается на 'element'? – rozero

+0

Вы должны поместить эту строку непосредственно перед закрытием'}); '. И нет, 'e' означает событие. – vitozev

+0

Я изменил скрипт, как вы сказали, и теперь кнопка «Назад» браузера недоступна после первого «обратного» нажатия ... Вы можете проверить его по ссылке temp. Также я изменил 'div' на' class' в ссылках на страницы. – rozero

0

Я предлагаю вам поместить параметр хэша в URL-адрес, таким образом, браузер будет правильно обрабатывать историю и прослушать события хэш-обмена. В большинстве случаев вы можете напрямую хранить состояние страницы, поэтому вам не нужно выполнять собственную обработку истории.Я собрал немного MCVE:

$(function() { 
 

 
    // setup some pagination bar 
 
    for (var i = 1; i < 11; i++) { 
 
    $('#pages').append(
 
     $('<a/>').text(i).attr('href','#'+i) 
 
    ); 
 
    $('#pages').append($('<span/>').text('.')); 
 
    } 
 

 
    // load contents of page i 
 
    function _uiPage(i) { 
 
     // imitate some XHR 
 
     setTimeout(function() { 
 
      $('#page-content').text('This is page ' + i); 
 
     }, 200); 
 
    } 
 
    
 
    // load contents of current page based on hash 
 
    function refreshByHash() { 
 
     var hash = window.location.hash; 
 
     _uiPage(hash ? +hash.substring(1) : 1); 
 
    } 
 
    
 
    // refresh on hash change 
 
    $(window).on('hashchange', refreshByHash); 
 
    // initial state on page load 
 
    refreshByHash(); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<div id="pages"></div> 
 
<div id="page-content"></div>

Note: Chrome's back button will go back in the active iframe, so after you clicked on some of the pages, you can press the back button to test the behaviour, and the outer frame, StackOverflow itself will not change.

Также посмотрите на thoe вопрос: How to manage browser “back” and “forward” buttons when creating a javascript widget


Edit1

$(function() { 
    $(window).on('hashchange', refreshByHash); 
    refreshByHash(); 

    function refreshByHash() {    
    var hash = window.location.hash; 
    // ----- strip the hashmark here ----- 
    hash = hash ? hash.substring(1) : ''; 
    console.log("hash = " + hash); 

    $.ajax({ 
     url : 'paginator.action?page=' + hash, // action 
     type : 'GET', //type of posting the data 
     dataType : 'html', 
     async: true, 
     success : function(htmlData) { 
     $('#paginator').html(htmlData); 
     }, 
     error : function(xhr, ajaxOptions, thrownError) { 
     alert('An error occurred! ' + thrownError); 
     }, 
    }); 
    } 
}); 
+0

Я попытался реализовать свое решение в своем коде, но имел две проблемы. 1 скрипт кода. --------------------------- 1) Невозможно получить запрос ajax, откуда он поступил. ajax-код «хеш-значение»? --------------------------- 2) Этот запрос ajax должен быть выполнен только и только если браузер кнопки были введены, но весь этот код запускался каждый раз, когда я нажимаю ссылки или когда были введены кнопки браузера. – rozero

+0

@rozero Я действительно не понимаю, как вы показываете страницу после нажатия на номер страницы без запроса ajax. Если вы можете показать их в первый раз, вы можете показать их без ajax в следующий раз, когда кнопки браузера будут нажаты. –

+0

У меня есть другой скрипт в 'pagin_scripts.js', вы можете попробовать проверить« временную ссылку ». Этот скрипт был загружен загрузчиком сценариев. И из этого кода я управляю обновляемым контентом ajax, нажимая номера страниц. Но код из пакета обновления 1part предназначен для управления кнопкой возврата броузера, например. Я так понимаю. – rozero

Смежные вопросы