Как я могу использовать window.history.pushState 'безопасно'

17

Я хотел бы использовать функцию window.history.pushState() в поддержке браузеров. К сожалению, я получаю сообщение об ошибке в Firefox:

  

TypeError: history.pushState не является функцией

Как можно избежать этого?

    
задан Roch 17.02.2011 в 15:57
источник

3 ответа

18
Тэг

[try-catch] подразумевает, что вы уже знаете ответ ... (есть ли что-то более конкретное?) Другая возможность - проверить if ( history.pushState ) history.pushState( {}, document.title, location.href );

    
ответ дан Free Consulting 17.02.2011 в 16:10
источник
23

Хотя я не тестировал его в JavaScript, я знаю на других языках, что try-catch более ресурсоемкий, чем простой, если ...

Использование:

if(history.pushState) {
    history.pushState({"id":100}, document.title, location.href);
}

Имейте в виду, что при нажатии кнопки «Назад» ничего не происходит, если вы не реализуете window.onpopstate . Вам нужно будет передать данные, необходимые для захвата содержимого:

if(history.pushState && history.replaceState) {
    //push current id, title and url
    history.pushState({"id":100}, document.title, location.href);

    //push new information
    history.pushState({"id":101}, "new title", "/new-url/");

    //this executes when you use the back button
    window.onpopstate = function(e) {
        alert(e.state.id);
        //perhaps use an ajax call to update content based on the e.state.id
    };
}
    
ответ дан Levi Morrison 29.03.2011 в 20:40
источник
  • Примечание: history.popstate вызывается один раз - сразу при загрузке первой страницы: и это по дизайну. –  Ujjwal Singh 10.12.2012 в 23:10
0

Для API истории существует прокладка. History.js использует событие hashchange HTML4 с идентификаторами фрагментов документа, чтобы имитировать API истории в старых браузерах. Если один из хэш-адресов используется в современном браузере, он использует replaceState для тихого исправления URL.

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

window.history && window.history.pushState && window.history.pushState("", "", url);

Это проверяет, существует ли история и функция pushstate, прежде чем пытаться ее использовать.

    
ответ дан herostwist 07.05.2014 в 16:33
источник