我正在使用Chrome,以防这是特定于浏览器的行为

当我try 在图像的onLoadonError事件处理程序中使用JavaScript设置x变量的值时,我无法做到.xy似乎被设置为图像的坐标,当我try 更改它们时,值不会更新,JS控制台中也没有记录任何错误.

示例:https://jsfiddle.net/brth8zxy/

该页面中的代码:

<img src="https://media1.tenor.com/m/557GUrcXp14AAAAC/jinx-cat-javascript.gif" onLoad="alert(`x=${x}...\nNow setting x=100`);x=100;alert(`x=${x}\nWell that didn't work... Why?`)">

有趣的是,如果我在onLoad事件处理程序中调用函数,则不会出现这种行为.也许和范围有关?

推荐答案

你提到的行为确实与范围有关.让我在你的例子中分享我对这一点的见解.

因此,当您在onLoad属性中直接使用x时,它指的是全局window对象的x属性.在事件处理程序的上下文中,全局window对象与执行事件处理程序的作用域不同1.事件处理程序在触发事件2的元素的上下文中运行.

现在,在您的示例中,onLoad事件处理程序在<img>元素的上下文中执行.由于<img>元素没有x属性,因此事件处理程序查找原型链并找到window对象的x属性.这就是当您try 将其设置为onLoad时,x的值不会更改的原因.

那么,如果你在onLoad事件处理程序中使用一个函数,会发生什么呢?

  <!-- The answer is you create a new scope for the x variable, 
which allows you to set and update its value as expected.-->

<script>
  function handleImageLoad() {
    let x = 0;
    alert(`x=${x}...\nNow setting x=100`);
    x = 100;
    alert(`x=${x}\nNow it works!`);
  }
</script>

<img src="https://media1.tenor.com/m/557GUrcXp14AAAAC/jinx-cat-javascript.gif" onLoad="handleImageLoad()">


References:

  1. Last paragraph on How scope works
  2. Event and Dom Nodes
  3. Why the subtle cross browser differences in event object?

Javascript相关问答推荐

如何通过在提交时工作的函数显示dom元素?

我的服务工作器没有连接到我的Chrome扩展中的内容脚本.我该怎么解决这个问题?

CheckBox作为Vue3中的一个组件

无法访问Vue 3深度监视器中对象数组的特定对象值'

实现JS代码更改CSS元素

无法使用单击按钮时的useState将数据从一个页面传递到另一个页面

Reaction Native中的范围滑块

ChartJs未呈现

如何将数据块添加到d3力有向图中?

Reaction-SWR-无更新组件

使用类型:assets资源 /资源&时,webpack的配置对象&无效

使用Document.Evaluate() Select 一个包含撇号的HTML元素

如何访问此数组中的值?

有没有办法通过使用不同数组中的值进行排序

我怎样才能点击一个元素,并获得一个与 puppeteer 师导航页面的URL?

P5play SecurityError:无法从';窗口';读取命名属性';Add';:阻止具有源的帧访问跨源帧

是否有静态版本的`instanceof`?

如何缩小函数中联合返回类型的范围

单击子按钮时将活动切换类添加到父分区

CSS网格使页面自动滚动