【发布时间】:2019-05-09 03:15:08
【问题描述】:
更新到 Chrome v71 后,我发现一个关于锚标签范围的奇怪行为,其中包含一个 img 标签,如下所示:
<a href="#none" onclick="debugger;complete();">
<img src="https://clickmeuk.net/wp-content/uploads/2016/04/click-me-logo2x.png"/>
</a>
...
function complete() {
alert("haha");
}
在 v71 之前的 Chrome 和其他浏览器上,单击 img 将触发 onclick 事件并显示警报。但是自从最新更新以来,相同的代码会导致调用以下错误:
Uncaught TypeError: complete is not a function at HTMLAnchorElement.onclick (index.html:6)
发生这种情况是因为在 Chrome v71 上,锚标记的 onclick 范围达到了 img 标记范围在它到达全局范围之前,因此引用了 img 节点的 complete 字段而不是 complete()功能。这可以在 pen 中重现。
<img> 是<a> 的子节点,所以当触发 onclick 时,<img> 的引用范围似乎很奇怪。当然,您可以通过简单地将函数名称更改为 complete 以外的名称来修复它。但我不知道是什么导致了这种变化。 Chrome v70 或 Explorer 或 Safari 按预期工作。这可能是一个错误吗?还是我错过了一些其他浏览器尚未实现的更新?
【问题讨论】:
-
我记得以前(几个月前,在 Chrome 71 之前,可能是 Chrome 65 或其他版本之前)看到过类似的东西,
onclick属性 有一个隐含的with(this),或者类似的东西,this引用元素,非常混乱(避免内联处理程序的另一个原因) -
好吧,看来您已经尽到了分析问题和寻找解决方案的职责。您对 SO 社区的期望是什么? “是的,这是一个错误”? “不是故意的”?这个问题将更适合铬的问题,进行这些更改的人将能够确定。 (ps:73还是repro)
-
@Kaiido 我的解决方案更像是一种变通方法,我想知道导致范围解释发生变化的根本问题。
标签: javascript html google-chrome scope