Ответ 1
@qwertymk был на полпути. Вы можете посмотреть событие hashchange в окне:
// jQuery example
$(window).bind('hashchange', function(){
console.log(window.location.hash);
});
Мне нужно запускать функцию каждый раз, когда приложение переключает URL-адреса в Backbone.js, и мне нужно знать хэштег, на который был изменен URL. Я предполагаю, что есть событие, к которому я могу привязываться, но я не смог определить, какое событие и какой объект привязать.
В частности, я хочу отправить новый URL-адрес в приложение для аналитики.
@qwertymk был на полпути. Вы можете посмотреть событие hashchange в окне:
// jQuery example
$(window).bind('hashchange', function(){
console.log(window.location.hash);
});
Я знаю, что это старый пост, но, как предположил @kirk, Backbone.js уже построил его.
Backbone.history.on("all", function (route, router) {
//console.log(window.location.hash);
});
Я думаю, вам лучше использовать этот метод.
поместите это где-то сверху в свой код
Backbone.History.prototype.navigate = _.wrap(Backbone.History.prototype.navigate, function(){
// Get arguments as an array
var args = _.toArray(arguments);
// firs argument is the original function
var original = args.shift();
// Set the before event
Backbone.history.trigger('before:url-change', args);
// Call original function
var res = original.apply(this, args);
// After event
Backbone.history.trigger('url-changed');
// Return original result
return res;
});
приведенный выше код будет обертывать функцию History.navigate и будет запускать "before: url-change" и "url-changed", когда он вызывается
Позже вы можете использовать
Backbone.history.bind('before:url-change', function(path,e){
console.log("before url change", path, e)
});
Существует еще одно событие "Backbone.history.on(" route ",...)", которое также работает, и вы можете обнаружить, что он запущен в библиотеке):
Backbone.history.on('route', function() {debugger;});
Это более точно, потому что "все" - это уловка: Цитата из документации Backbone:
Запуск одного или нескольких событий, запуск всех связанных обратных вызовов. Обратные вызовы передаются теми же аргументами, что и
trigger
, кроме имени события (если вы не слушаете"all"
), что приведет к тому, что ваш обратный вызов получит истинное имя события в качестве первого аргумента).
Кстати, наилучшей практикой Backbone является использование метода listenTo, например:
myView.listenTo(Backbone.history, 'route', function() {debugger;})
Таким образом, вам не нужно очищать прослушиватель событий вручную - вместо этого он логически связан с представлением/моделью и т.д. который использует его.