Есть ли какой-нибудь удобный для Backbone способ обнаружения нажатия кнопки «Назад»?

У Stack Overflow есть несколько вопросов, связанных с обнаружением нажатия кнопки «Назад», наиболее важным из которых является список библиотек, которые делают именно это:

https://stackoverflow.com/questions/116446/what-is-the-best-back-button-jquery-plugin

Проблема в том, что когда я пытался использовать библиотеки из этого потока (и в других местах), все они либо:

  • не сработало (больше; должно быть, когда-то сработало)
  • не поддерживает IE8
  • сломал маршрутизатор Backbone

Проблема, по-видимому, заключается в том, что маршрутизатор Backbone следит за событиями изменения хэша, как и эти другие библиотеки, и они делают это таким образом, что это влияет на маршрутизатор Backbone (например, в одной из них кнопка «Назад» полностью перестала работать).

Итак, мой вопрос: кто-нибудь знает способ обнаружения нажатия кнопки «Назад», который работает в IE8+ и который (и это ключевая часть) не ломает магистральный маршрутизатор?

Или, если это не удастся, может ли кто-нибудь хотя бы объяснить или указать мне объяснение того, как самостоятельно реализовать предотвращение нажатия кнопки «Назад» на сайте с поддержкой Backbone.Router?


person machineghost    schedule 24.06.2013    source источник
comment
Вы использовали хэш при навигации между представлениями. caniuse.com/#feat=hashchange IE8 и выше поддерживают   -  person prashanth    schedule 03.07.2013
comment
Есть ли какая-то конкретная причина, по которой вы не можете использовать pushState API? Похоже, Backbone.js поддерживает это «из коробки» — backbonejs.org/#History   -  person dana    schedule 09.07.2013
comment
Проблема именно в этом: Router Backbone использует API pushState, поэтому, если я попытаюсь использовать обычные приемы для обнаружения нажатия кнопки «Назад», я в конечном итоге сломаю Backbone.   -  person machineghost    schedule 10.07.2013


Ответы (2)


Если вы пытаетесь предотвратить повторный запуск определенных кликов с помощью кнопки «Назад» (например, удаление событий), самый простой подход — предотвратить их добавление в историю в первую очередь с помощью preventDefault() как части вашей функции события onclick.

Если это ваша проблема, эту статью стоит прочитать: http://lostechies.com/derickbailey/2011/08/03/stop-using-backbone-as-if-it-were-a-веб-сервербезсостояния/

Вот довольно простой метод обнаружения щелчка назад с помощью Backbone: магистральная маршрутизация, определяющая, было ли нажато вперед или назад

person KevJ    schedule 09.07.2013
comment
Спасибо за предложение, но в моем случае меня больше беспокоит случай: 1) пользователь вводит массу информации в гигантскую форму на нашем сайте, 2) пользователь случайно нажимает кнопку «Назад», 3) пользователь теряет все их работа. Я знаю, что есть трюки, которые можно сделать, помещая особое состояние в стек, чтобы, когда пользователь щелкает назад, вместо того, чтобы вернуться на одну страницу, он переходил на страницу, на которой он был (и не терял свои данные) .. .. но когда я пытался реализовать подобные вещи самостоятельно, я нарушил маршрутизацию Backbone (которая является неотъемлемой частью нашего сайта) :-( - person machineghost; 10.07.2013
comment
Для этого вы, вероятно, захотите использовать window.onbeforeunload - person evilcelery; 28.02.2014

Если вы используете pushState, вы можете использовать window.onpopstate

window.onpopstate = function(event) {
  console.log(document.location);
};
person kehers    schedule 01.02.2014
comment
Спасибо, но вы упустили момент о работе с Backbone. Далеко не тривиально просто использовать window.onpopstate, не влияя на магистральный маршрутизатор. - person machineghost; 03.02.2014