Функция запуска, когда пользователь нажимает стрелку назад или вперед в браузере

#javascript #jquery #addeventlistener #event-listener #popstate

#javascript #jquery #addeventlistener #прослушиватель событий #popstate

Вопрос:

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

Пока это работает нормально, и я использую window.history.pushState("object or string", "Title", "/maps?q=example"); для обновления URL-адреса каждый раз, когда пользователь ищет что-то новое.

Однако, когда пользователь нажимает стрелку назад или вперед, URL изменяет состояние на то, что было ранее, но карта не меняется, потому что loadMap(); Функция Javascript не вызывается.

Существует ли обработчик событий Javascript, который прослушивает стрелку назад / вперед, чтобы я мог обновить карту, вызвав loadMap(); с переменной запроса, сохраненной в URL?

Вот что у меня есть на данный момент:

 <input id="searchBox" type="text" placeholder="What are you looking for?" value=""> 

<div class='map'></div>

<script>
    // Uses ajax to get map data from PHP file
    function loadMap(){
        var entityData = {
            query: $("#searchBox").val()
        };
        var entityOptions = {
            url: "https://example.com/load_map.php",
            dataType: "text",
            type: "POST",
            data: { mapData: JSON.stringify( entityData ) }, // Our valid JSON string
            success: function( data, status, xhr ) {
                $(".map").html(data);
            }
        };
        $.ajax( entityOptions );
    }
    
    // When user presses enter, load the map 
    document.getElementById('searchBox').onkeypress = function(e){
        if (!e) e = window.event;
        var keyCode = e.keyCode || e.which;
        if (keyCode == '13'){
            loadMap();
        }
    }

</script>
  

Вот что я пытаюсь добавить:

 <script>

window.addEventListener(*back arrow*, function(event) {
    var q = *get q variable from URL*;
    $("#searchBox").val() = q;
    loadMap();
}

window.addEventListener(*forward arrow*, function(event) {
    var q = *get q variable from URL*;
    $("#searchBox").val() = q;
    loadMap();
}

</script>
  

Ответ №1:

Вы можете использовать onpopstate

 window.onpopstate = function(event) {
  alert("location: "   document.location   ", state: "   JSON.stringify(event.state));
};
  

https://developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers/onpopstate