Javascript 替换输入元素只会导致Chrome中的onchange事件

Javascript 替换输入元素只会导致Chrome中的onchange事件,javascript,html,google-chrome,firefox,Javascript,Html,Google Chrome,Firefox,我发现Chrome和Firefox在行为上有一个奇怪的差异,我想知道是否有人知道这是怎么回事 首先,代码见一个实例: HTML: 在Firefox中,如果我在字段中键入某个内容并按enter键,日志消息将显示一次。另一方面,在Chrome中,日志消息显示两次 什么是不同的错误?关于Chrome的事件处理 旁白:不,我也不太喜欢这段代码,我更愿意更理智地重写它。但我真的很好奇引擎盖下到底发生了什么可以解释这一点 编辑:出于某种原因,每次关闭输入标记都会让我感到困惑。现在应该好好关上了。另外,仅供参

我发现Chrome和Firefox在行为上有一个奇怪的差异,我想知道是否有人知道这是怎么回事

首先,代码见一个实例:

HTML:

在Firefox中,如果我在字段中键入某个内容并按enter键,日志消息将显示一次。另一方面,在Chrome中,日志消息显示两次

什么是不同的错误?关于Chrome的事件处理

旁白:不,我也不太喜欢这段代码,我更愿意更理智地重写它。但我真的很好奇引擎盖下到底发生了什么可以解释这一点

编辑:出于某种原因,每次关闭输入标记都会让我感到困惑。现在应该好好关上了。另外,仅供参考,我在Mac上的Chrome 30.0.1599.101和Chrome Canary 32.0.1680.0上也看到了这种行为


编辑2:我最初是将innerHTML设置为另一个输入标记,但我可以通过设置为纯文本来复制它。更新Javascript和JSFiddle链接。

通过@carter和a的一些见解,我想我理解了现在发生的事情

onchange事件首先为普通文本触发,并输入新文本,然后按enter大小写。这在Firefox和Chrome中都会发生,这也是我所期望的

第二,在Chrome中,如果输入是脏的,即有更改并且随后被销毁,onchange事件也会触发。这在Firefox中不会发生。请注意,如果自上次onchange之后没有发生任何更改,则输入变脏非常重要,通常不会发送另一个事件

Chrome对此行为有一个例外:如果输入在处理onchange事件期间被破坏,它显然仍然认为输入是脏的,因此触发第二个onchange事件

通过将上面的Javascript更改为以下内容,您可以看到这一点:

function func() {
    console.log( 'resetting' );
}

setTimeout( function() {
    document.getElementById( 'me' ).parentNode.innerHTML = 'test';
}, 3000 );

您将看到,如果在替换发生之前键入输入,您将在Chrome中获得日志消息,但在Firefox中不会。这是否只是一个闲散的好奇,它为什么会触发事件?或者你真的在寻找更好的方法吗?chrome会破坏一切,你不知道吗?输入元素没有结束标记。无法在chrome版本30.0.1599.101中重现这种行为。如果你注释掉输入替换,只会触发一个事件,这可能是一种改变。对于这些边缘情况,规范通常不够具体,不足以让所有浏览器实现相同的策略。欢迎来到网络:
function func() {
    console.log( "resetting" );
    document.getElementById( 'me' ).parentNode.innerHTML = "test";
}
function func() {
    console.log( 'resetting' );
}

setTimeout( function() {
    document.getElementById( 'me' ).parentNode.innerHTML = 'test';
}, 3000 );