window.history.back非法调用

时间:2017-10-22 21:41:58

标签: javascript jquery

为什么我能这样做:

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

然而,当我尝试时;

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

我明白了:

  

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

我的印象是,当没有保留上下文时,它默认为窗口对象,这样我就可以这样做了吗?

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

您的工作代码调用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对象时,它就会出错。

通常,当您希望事件监听器调用您没有写过的函数时,您最好将调用包装在您自己的函数中,就像您在第一个示例中所做的那样。 / p>

答案 2 :(得分:0)

history的{​​{1}}属性只是引用了History接口,只能全局调用。

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