不能使用闭包作为pushState的事件监听器

时间:2015-02-28 06:23:29

标签: javascript closures 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 个答案:

答案 0 :(得分:0)

  

状态未被推送

可能是因为e.hrefundefined。你想要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;
        }
    };
};