Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript chrome 71不会在onclick事件中检测到id,除非它是this.id_Javascript_Google Chrome - Fatal编程技术网

Javascript chrome 71不会在onclick事件中检测到id,除非它是this.id

Javascript chrome 71不会在onclick事件中检测到id,除非它是this.id,javascript,google-chrome,Javascript,Google Chrome,我有这样一个html元素: <select id="myselect" onclick="jsDoSomething(id)"><option>1</option><option>2</option></select> 在Chrome70之前,一切正常,在Chrome71中,jsDoSomething函数中的id为null。我必须把它改成这个.id才能工作。这是一个错误还是一个。。。铬71的特点 先谢谢你 编辑:这发生在s

我有这样一个html元素:

<select id="myselect" onclick="jsDoSomething(id)"><option>1</option><option>2</option></select>
在Chrome70之前,一切正常,在Chrome71中,jsDoSomething函数中的id为null。我必须把它改成这个.id才能工作。这是一个错误还是一个。。。铬71的特点

先谢谢你

编辑:这发生在select和a标记上,但不发生在按钮标记上


Edit2:jsfiddle:

像这样解析数据是一种非常古老的方法,而最新版本的Chrome不再支持这种方法

现在获取DOM元素的方法必须如下所示:

document.querySelector'myselect';
document.getElementById'myselect' 根据快速调查,据我所知,这是浏览器中的一个bug

根据HTML标准[1],浏览器应使用FunctionCreate初始化此类内联处理程序,其中作用域分配如下:

若元素不为null,则将作用域设为NewObjectEnvironmentelement,Scope

让我们参考ECMAScript 2019语言规范[2]来解释这一点。 显然,NewObjectEnvironmentelement、Scope创建了一个新的词汇环境,其中最初定义的变量名取自作为第一个参数元素传递的对象。可以将其视为将元素的所有属性作为元素对象,对它们进行迭代,而不管它们是否可枚举,并将它们放入以这些属性命名的变量中。规范对此进行了如下描述:

每个对象环境记录都与一个称为其绑定对象的对象相关联。对象环境记录绑定与其绑定对象的属性名称直接对应的字符串标识符名称集

因此,似乎从onclick中的字符串创建的回调确实应该在作用域中具有元素的所有属性,包括id

参考资料:

从这里开始:

范围 如果eventHandler是元素的事件处理程序,那么让作用域为全局环境NewObjectEnvironmentdocument

否则,eventHandler是窗口对象的事件处理程序:let Scope 这就是全球环境

如果表单所有者不为null,则将作用域设为NewObjectEnvironmentform 所有者,范围

若元素不为null,则将作用域设为NewObjectEnvironmentelement,Scope

所以,这似乎是标准的行为出人意料,我从来没有这样做,所以它似乎是打破了铬

但是,我在Linux上的Chrome71上测试了一个简单的代码,得到了预期的结果。
也许你的HTML结构在某个地方被破坏了,元素不是当前的selectbox

我很惊讶它居然能工作…@Alnitak如果它是一个功能,那么为什么它能在按钮标签上工作而不是在选择或标签上?它是一个mis功能。在内联事件处理程序中使用this.id一直是最佳实践。奇怪的是,它在Firefox中仍然有效,但在Safari中却不起作用。尝试在nodeName中更改id并查看值在内联事件处理程序中使用this.id仍然有效,即使内联事件处理程序本身被认为是糟糕的实践。我不确定你所说的是否相关,我说的是onclick事件,而不是DOM元素。我在使用js时看到了Chrome的一些问题。html中的js元素似乎不再完全受支持,最好使用eventlistenersnow@TristanVermeesch那是托什。虽然使用事件监听器确实更好,但如果内联事件处理程序编写正确,则仍然可以很好地支持它们。内联事件处理程序只是被包装在匿名函数体中,并被设置为clicked元素。这是依靠神奇的变量导致的问题。我一定是把它弄错了。我不知道这些案子还用这个。所以最好的方法就是像你当时说的那样使用它,即使事件侦听器是现在使用的方法,我已经在WindowsChrome71.0.357832位上测试过了。html结构没有在某个地方被破坏。@MIrrorMirror,你最好举个例子,给出错误的结果,例如,在jsfiddle。com@MIrrorMirror问题是,在这种情况下,Chrome中的元素是实际的元素单击选项,在这种情况下,该选项不是id。该行为似乎与规范不一致。工作证明是,您将“单击我”文本包装在span元素中,那你也有同样的issue@LucaRainone嗯,Chrome71中的新行为是,如果有一个内部元素,父元素的onclick将得到它的子元素id,除非我用这个指定范围。这似乎是Chrome71的一个bug。