Магистральная маршрутизация, определяющая, была ли нажата кнопка «вперед» или «назад»

Я пишу приложение, используя backbone.js, и анимирую между страницами (немного похоже на пользовательский интерфейс в стиле iphone). Таким образом, когда вы нажимаете кнопку, следующая страница скользит справа, а нажатие кнопки «Назад» заставит следующую страницу скользить слева. Я хочу иметь возможность делать то же самое с кнопками браузера вперед и назад, используя маршрутизатор. Можно ли сказать, что было нажато (вперед или назад), чтобы я мог убедиться, что анимация идет в правильном направлении?

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

Спасибо


person dan    schedule 23.04.2012    source источник


Ответы (1)


Слушайте событие клика по всем ссылкам. (Кофейный скрипт)

$(document).on 'click', 'a' ->
  window.linkClicked = true

В качестве альтернативы вы можете перехватить Backbone.history.navigate(). Если кто-то нажмет на нее, это означает, что он не вернется, поэтому установите флаг true. Также есть событие в вашем маршрутизаторе, прослушивающее все события маршрутизатора. Всегда сохраняйте предыдущий фрагмент (Backbone.history.getFragment()). Сравните текущий фрагмент с предыдущим фрагментом. Если они одинаковы, проверьте, установлен ли этот флаг на true или false. Если установлено false, то вы знаете, что она вернулась, если true, то нет, и что кто-то щелкнул ссылку, но перешел на ту же предыдущую страницу. Наконец, сбросьте этот флаг на false.

class SnazzyRouter extends Backbone.Router
    initialize: ->
      # This gets triggered everytime a route event gets triggered
      @on 'all', =>
          currentFragment = Backbone.history.getFragment()
          window.backDetected = false  # assume no back detected

          if !window.linkClicked and currentFragment == window.previousFragment
              window.backDetected = true

          window.linkClicked = false  # reset
          window.previousFragment = currentFragment

window.linkClicked = false
window.backDetected = false
window.previousFragment = null

snazzyRouter = new SnazzyRouter()

Теперь это просто

# Did we go back?
console.log "I CAN'T BELIEVE WE WENT BACK!" if window.backDetected

Дайте мне знать, если вам нужны какие-либо разъяснения (я только что применил это для своего приложения, и оно работает).

person axsuul    schedule 26.07.2012
comment
Я не думаю, что это действительно отвечает на вопрос; он искал кнопки браузера назад/вперед. - person mix3d; 13.05.2015
comment
if !window.linkClicked and currentFragment == window.previousFragment этот код не будет работать, если пользователь нажмет и удержит кнопку "Назад" и выберет старую запись. - person try-catch-finally; 27.03.2016