Подтвердить что ты не робот

Могу ли я предотвратить запуск history.popstate при начальной загрузке страницы?

Я работаю над сайтом, который обслуживает контент через AJAX.

Если вы щелкнете элемент в меню, содержимое div будет обновлено с ответом $.get, ничего необычного.

Я реализую history.pushState, чтобы разрешить навигацию с помощью кнопки браузера назад/вперед.

У меня есть следующее для загрузки содержимого в навигацию по истории:

$(function() {
    $(window).bind("popstate", function() {
        $.getScript(location.href); 
    });
});

Проблема в том, что когда страница загружается в первый раз, эта функция выполняет $.getScript, чтобы страница загружалась сразу же. При первой загрузке страницы он отображает начальное представление HTML, затем на втором загрузке он отображает представление JS, так как его запрос JS.

Как я могу предотвратить запуск этого события на страницах с запросами HTML?

4b9b3361

Ответ 1

Используя собственный API истории HTML5, вы столкнетесь с некоторыми проблемами, каждый браузер HTML5 обрабатывает API немного по-другому, поэтому вы не можете просто его кодировать и ожидать, что он будет работать без реализации обходных решений. History.js предоставляет кросс-браузерный API для API истории HTML5 и необязательный резерв hashchange для браузеров HTML4, если вы хотите спуститься по этому маршруту.

Для обновления вашего сайта в RIA/Ajax-приложении вы можете использовать этот фрагмент кода: https://github.com/browserstate/ajaxify

Это часть более длинной статьи Intelligent State Handling, которая идет на объяснения хешбанов, хэшей и истории html5.

Сообщите мне, нужна ли вам дополнительная помощь:) Приветствия.

Ответ 2

Вам нужно получить event.originalEvent

// Somewhere in your previous code
if (history && history.pushState) {
  history.pushState({module:"leave"}, document.title, this.href);
}


$(window).bind("popstate", function(evt) {
  var state = evt.originalEvent.state;
  if (state && state.module === "leave") {
    $.getScript(location.href);
  }
});

Ответ 3

Когда событие popstate запускается при загрузке страницы, оно не будет иметь свойство состояния в объекте события. Это позволяет проверить, запущено ли событие для загрузки страницы или нет.

window.onpopstate = function (event) {
  if (event.state) {
    // do your thing
  } else {
    // triggered by a page load
  }
}

Ответ 4

Когда браузер загружается первым, он всегда запускает событие popstate. Таким образом, вам нужно определить, принадлежит ли вам эта поп-звезда или нет.

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

Затем в обработчике popstate проверьте объект состояния:)

$(function() {
    $(window).bind("popstate", function(data) {
        if (data.state.isMine)
            $.getScript(location.href); 
    });
});

// then add the state object
history.pushState({isMine:true},title,url);

Сообщите мне, если вам нужна дополнительная помощь:)

Ответ 5

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

  • $(document).ajaxComplete(function(ev, jqXHR, settings) {
    
        var stateObj = { url: settings.url, innerhtml: document.body.innerHTML };
        window.history.pushState(stateObj, settings.url, settings.url);
    });
    
    
    window.onpopstate = function (event) {
        var currentState = history.state;
        document.body.innerHTML = currentState.innerhtml;
    };