【问题标题】:Chrome v71 anchor tag scope chain references inner img tag's scopeChrome v71 锚标记范围链引用内部 img 标记的范围
【发布时间】: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 中重现。

&lt;img&gt;&lt;a&gt; 的子节点,所以当触发 onclick 时,&lt;img&gt; 的引用范围似乎很奇怪。当然,您可以通过简单地将函数名称更改为 complete 以外的名称来修复它。但我不知道是什么导致了这种变化。 Chrome v70 或 Explorer 或 Safari 按预期工作。这可能是一个错误吗?还是我错过了一些其他浏览器尚未实现的更新?

【问题讨论】:

  • 我记得以前(几个月前,在 Chrome 71 之前,可能是 Chrome 65 或其他版本之前)看到过类似的东西,onclick 属性 有一个隐含的with(this),或者类似的东西,this 引用元素,非常混乱(避免内联处理程序的另一个原因)
  • 好吧,看来您已经尽到了分析问题和寻找解决方案的职责。您对 SO 社区的期望是什么? “是的,这是一个错误”? “不是故意的”?这个问题将更适合铬的问题,进行这些更改的人将能够确定。 (ps:73还是repro)
  • @Kaiido 我的解决方案更像是一种变通方法,我想知道导致范围解释发生变化的根本问题。

标签: javascript html google-chrome scope


【解决方案1】:

在您的测试用例上运行bisect 表明更改是在this ChangeLog 中进行的。

从这个提交列表中,Create new EventHandler and base class for EventListener/EventHandler by Yuki Yamada 似乎是该领域行为改变的最合理原因。

阅读提交说明和链接的 crbugs 664676759461,没有什么可以认为这是有意的更改。

Chrome 在他们使用的 EventTarget 领域存在问题,规格确实发生了一些变化,但根据我的阅读,我看不到任何可以使观察到的行为成为预期行为的东西,甚至没有引用这种行为.

所以,从这里开始,这一切听起来像是一个错误,是的。随意在 Blink > Binding 组件中在chromium's board 上打开一个新问题。

您可能想让他们知道平分显示的ChangeLog URL。他们将能够告诉您这是否真的是有意的。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-14
相关资源
最近更新 更多