我想使用一个闭包作为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());
有什么想法吗?
另外,请不要建议一个正在运行的路由库,它不是我要求的
答案 0 :(得分:0)
状态未被推送
可能是因为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;
}
};
};