Не могу использовать замыкание в качестве прослушивателя событий для pushState
Я хочу использовать замыкание в качестве EventListener (я работаю над библиотекой маршрутизации), поэтому я создал класс, который делает именно это
'use strict';
var RouteManager = RouteManager || {};
RouteManager.OnClickDelegate = function(UrlHandler)
{
var handler = UrlHandler;
return function delegate(e)
{
e = e || window.event;
var element = e.target || e.srcElement;
if (element.tagName == 'A') {
console.log("link click");
window.history.pushState({},"",e.href);
//this.handler.handle(element.href);
return false;
}
};
};
назначение:
document.onclick = RouteManager.OnClickDelegate(new UrlHandler());
Однако, хотя назначение замыкания в качестве прослушивателя событий работает ("щелчок по ссылке" записывается правильно), состояние не выдвигается
чтобы сделать вещи еще более странными, это работает правильно:
document.onclick = (function(UrlHandler){
var uh = UrlHandler;
return function delegate(e)
{
e = e || window.event;
var element = e.target || e.srcElement;
if (element.tagName == 'A') {
console.log("link click");
window.history.pushState({},"",e.href);
//this.handler.handle(element.href);
return false;
}
};
})(new UrlHandler());
Есть идеи?
Кроме того, пожалуйста, не предлагайте рабочую библиотеку маршрутизации, это не то, что я прошу
1 ответ
государство не выдвинуто
Наверное потому что e.href
является undefined
, Ты хочешь element.href
,
Обратите внимание, что в вашем замыкании вы можете использовать переменную параметра напрямую, вам не нужно объявление этой локальной переменной. Просто используйте это:
RouteManager.OnClickDelegate = function(handler) {
return function delegate(e) {
e = e || window.event;
var element = e.target || e.srcElement;
if (element.tagName == 'A') {
console.log("link click");
window.history.pushState({}, "", element.href);
handler.handle(element.href);
return false;
}
};
};