javascript - 在 Chrome 中,提交表单并返回后,其值会在 DOMContentLoaded 后自动填充。是否有可能听到这种变化?
问题描述
在此处查看示例:https ://large-platinum-ethernet.glitch.me 。
使用 Google Chrome(自 2020 年 5 月起使用 v81):
- 打开你的控制台。
- 选择“选项 0”以外的值。
- 点击“提交”。
- 在浏览器中按“返回”。
- 当您提交表单时,select 元素的值将更新为 select 的值。但是,如果您检查控制台,您会看到最初的值是“选项 0”,并且它会在导航之前更新为 和 之间的某个
DOMContentLoaded
时间window.onload
。
有人知道 Chrome 何时进行此更改是否可以收听?否change
或input
事件被触发。我尝试setTimeout
在处理程序内部使用 a DOMContentLoaded
,这似乎可行,但似乎很笨拙且可能不一致。
编辑:看起来简短的回答是“不,当 Chrome 更改值时没有触发事件。” 相反,可以查看页面是否在导航事件之后加载。如果是,window.onload
则可以假定由 设置的任何表单值已由浏览器设置。
解决方案
看起来 pageshow 是错误的。
performance.getEntriesByType("navigation")[0].type === 'back_forward
(弃用值)window.performance.navigation.type === 2
您还可以autocomplete=off
在表单输入上使用
编辑:自 2020 年 5 月 6 日起,pageshow 在 Chrome 81
pageshow/pagehide 事件中无法检测从 bfcache 加载的情况,这是加载表单值的地方。
https://github.com/adobe/webkit/blob/master/Websites/webkit.org/blog-files/pageshow-pagehide-example.html https://developers.google.com/web/updates/2018/07 /page-lifecycle-api https://developer.mozilla.org/en-US/docs/Web/API/Window/pageshow_event
function pageShown(evt)
{
if (evt.persisted)
; // do things to your forms
else
; // no need to do anything
}
function pageHidden(evt)
{
if (evt.persisted)
; // do things to your forms
else
; // no need to do anything
}
window.addEventListener("pageshow", pageShown, false);
window.addEventListener("pagehide", pageHidden, false);
推荐阅读
- cmake - 如何在安装中为 PATTERN 使用变量的多个目录?
- c++ - 以最少的重写更新文本文件
- javascript - TypeScript 顶级非导出代码何时执行?
- excel - 为什么平方列会产生不同的答案
- python - subprocess.Popen 如何在 Windows 上与 shell=False 一起使用?
- node.js - SharedKeyCredential 不是构造函数 - Azure Blob Storage + Nodejs
- javascript - TinySlider:使上一个/下一个按钮在第一个/最后一个索引时消失?
- java - 如何使用 Spring 组件注册 POJO 工厂 *methods*?
- android - HUAWEI MediaPad M5 Lite 10 返回 screenLayout SCREENLAYOUT_SIZE_LARGE
- r - R:从数据框中的值中提取向量名称