javascript - 为什么选择具有值(value)的输入会触发 Chrome 中的两个事件?

标签 javascript html chromium

我正在 chromium 43 中测试它。

当我按下选择按钮时,以下代码仅触发一个事件:

<script>
    window.addEventListener('select', function(ev) {
        console.log(ev, ev.timeStamp);
    });
</script>
<input type="text"><button onclick="document.querySelector('input').select()">select</button>

但是,如果我向输入 type=text 添加一个值,我会得到两个事件,并且事件之间唯一发生变化的是 timeStamp 属性:

<script>
  window.addEventListener('select', function(ev) {
    console.log(ev, ev.timeStamp);
  });
</script>
<input type="text" value="test"><button onclick="document.querySelector('input').select()">select</button>

有谁知道为什么会这样,其背后的原理是什么?

最佳答案

我认为发生的事情是触发了两种类型的 select 事件,但是由于 Event 对象的详细信息集有限,所以它们看起来完全是相同的。但是看起来当您更改输入的 selectionRange 时会触发一个 select 事件,而当实际文本选择发生变化时会触发一个选择事件(在这种情况下,因为焦点是由于选择更改而在输入时激活)。最后一个是当输入为空时不会被触发的那个 - 因为没有文本,所以文本选择没有变化。

您可以通过将 select() 放在 mousedown 上来分解它。由于它发生在按钮上的 mousedown 上,因此焦点不在输入上,而是停留在按钮上。但是仍然会触发一个事件。然后,如果您只是在 mouseup 上添加一个 focus(),您不会更改输入的 selectionRange,但会选择实际文本并触发一个选择事件。 或者,如果在您的点击处理程序中调用按钮上的 select() 然后调用 focus(),您也将只有一个事件。 你可以在这里看到这些行为:

https://jsfiddle.net/k292po9a/6/

话虽这么说,它确实看起来像一个错误,它应该由 Chrome 处理,以便只触发一个事件。

关于javascript - 为什么选择具有值(value)的输入会触发 Chrome 中的两个事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31381638/

相关文章:

javascript - window.location 更改完成后有什么方法可以触发回调吗?

javascript - localstorage 数据可以放在 HTTP header 中吗?

javascript - 如果数字:true is set in localeCompare function会有什么变化吗

javascript - 正则表达式 - 用一个替换多个 html 标签

css - 侧边栏 + 2 个扩展内容 div

Android Chromium WebView 崩溃

javascript - Sequelize 文档中的这些井号/井号符号代表什么?

javascript - 如何动态使用ng-for获取输入框和复选框

macos - Chromium WebView 而不是 Native WebView

google-chrome - Chrome + CORS +缓存-从两个不同的来源请求相同的文件