javascript - 谷歌浏览器在警报被解除之前执行 HTMLElement.focus
问题描述
发现与 Firefox 和 Edge 相比,Google Chrome 产生不同的行为,代码如下:
function lossFocus(e) {
alert('blur'); // prompt alert
e.focus(); // focus back to textbox
}
<input type="text" onblur="lossFocus(this);" />
<!-- NOTE: You may need to refresh this page after trigger onblur in Chrome to avoid popup loop -->
这导致lossFocus
在谷歌浏览器中无限触发广告,就像focus
在用户通过按 OK 或使用 Enter 键关闭弹出对话框之前执行的那样,但其他浏览器并非如此。(Edge 之后设法将输入字段的注意力集中在后面alert
)是什么原因,这是预期的行为吗?
window.confirm()
window.alert()
似乎有希望在捕获用户输入后执行代码,这是否意味着如果我们希望仅在从弹出对话框获得用户反馈后执行代码,我们应该远离?
解决方案
目前还没有任何见解,但发现其中一种解决方法是将罪魁祸首用 nil 超时包裹起来,如下所示:
function lossFocus(e) {
alert('blur');
setTimeout(() => { e.focus(); }, 0); // focus properly now after dismiss popup
}
<input type="text" onblur="lossFocus(this);" />
推荐阅读
- android - Custom command requires calling CMake three times to have desired output
- python - 在收敛迭代期间更新 3d python 图
- laravel - 如何为 Laravel 工厂使用自定义值列表,维护订单并仍在使用 Faker 外观?
- laravel - Laravel 社交名媛登录:不同的 Facebook 应用程序
- python - 如何使用替换冲突执行多个字符串替换?
- php - 错误:调用未定义的方法 Tests\Unit\SomeTest::assertStatus()
- java - Mysql表中的Java时间插入
- amazon-web-services - CloudFormation - 无法将输入返回到 GET 方法的响应正文中
- c# - 使用 linq 调用方法 x 次
- javascript - 仅当文件系统上的模块依赖存在其 node_modules 时,项目才会构建