Не могу использовать замыкание в качестве прослушивателя событий для 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;
        }
    };
};
Другие вопросы по тегам