窗口.历史.返回非法调用



为什么我可以这样做:

$("button").on('click', function(){window.history.back();});

但是,当我尝试时;

$("button").on('click', window.history.back);
/*or*/ $("button").on('click', history.back);

我得到:

Uncatch TypeError: 非法调用
HTMLAnchorElement.dispatch (jquery-1.12.4.js:5226)at HTMLAnchorElement.elemData.handle (jquery-1.12.4.js:4878)

我的印象是,当没有保留的上下文时,它默认为窗口对象,这将允许我这样做?

首先,必须以 history 作为上下文调用history.back(),如果它默认为 window它将抛出您描述的错误。但这里的问题是 jQuery 使用绑定了事件侦听器的元素调用处理程序。

您的第一行代码有效,因为上下文与您作为处理程序传递的匿名函数无关。jQuery将元素设置为上下文这一事实并不重要,因为您可以在其中正确调用history.back()

您的工作代码调用history.back()

... window.history.back(); ...

这调用back()作为history对象的方法,这仅意味着在back函数中,this是对history的引用。

非工作代码获取对back函数的引用:

... window.history.back ...

然后将引用传递到 jQuery 的 .on() 方法中。

jQuery 稍后调用该函数以响应click事件,并在该调用时设置this。 jQuery 将this设置为接收事件的 DOM 元素。

因此,当 back() 函数的实现引用this期望它是history对象时,它会得到错误的东西。

通常,当您希望事件侦听器调用不是您编写的函数时,最好将调用包装在您自己的函数中,就像在第一个示例中所做的那样。

windowhistory 属性仅引用 History 接口,并且只能全局调用。

失败的方法使用没有history属性的元素上下文。

最新更新