从 `<body>` 中删除属性定义的 `onload`
Remove Attribute-defined `onload` from `<body>`
我已经为此工作了几个小时,现在我觉得我可能正在尝试完成一些不可行的事情。非常感谢任何建议或见解!
我的目标用例需要在浏览器有机会绘制 <body>
元素之前中断浏览器的 DOM 解析。为此,我将这个单行代码用作 <head>
元素中调用的第一个脚本:
document.replaceChild(document.createElement('html'), document.children[0]);
这成功地阻止了浏览器调用任何后续脚本,并且 <body>
元素保持未呈现状态。但是,如果标记在 <body>
元素上包含 onload
属性,浏览器仍会调用该函数或代码。
由于拦截 DOM 解析的上下文在 <head>
中,我不能使用 document.body.removeEventListener()
来删除事件侦听器,因为 body
元素没有'还不存在。将 window.onload
设置为 null
没有效果,尝试使用 Object.defineProperty(window, 'onload', {...})
拦截 window.onload
的设置也没有效果。在每种情况下,onload
函数或语句仍会被调用。
为了抢先解决为什么我不能只避免使用 <body onload="...">
的明显问题,用例是针对开发人员工具的,所以我试图为某些绝对条件创造应急措施。如果它无法完成,它不会破坏我的项目,但我很想知道为什么它无法完成。
提前致谢!
可以在interactive
状态下使用Document readystate,覆盖onload
属性
document.onreadystatechange = () => {
if (document.readyState === 'interactive')
window.onload = null;
}
(为了完整性从您的评论中添加了您的代码。)
我已经为此工作了几个小时,现在我觉得我可能正在尝试完成一些不可行的事情。非常感谢任何建议或见解!
我的目标用例需要在浏览器有机会绘制 <body>
元素之前中断浏览器的 DOM 解析。为此,我将这个单行代码用作 <head>
元素中调用的第一个脚本:
document.replaceChild(document.createElement('html'), document.children[0]);
这成功地阻止了浏览器调用任何后续脚本,并且 <body>
元素保持未呈现状态。但是,如果标记在 <body>
元素上包含 onload
属性,浏览器仍会调用该函数或代码。
由于拦截 DOM 解析的上下文在 <head>
中,我不能使用 document.body.removeEventListener()
来删除事件侦听器,因为 body
元素没有'还不存在。将 window.onload
设置为 null
没有效果,尝试使用 Object.defineProperty(window, 'onload', {...})
拦截 window.onload
的设置也没有效果。在每种情况下,onload
函数或语句仍会被调用。
为了抢先解决为什么我不能只避免使用 <body onload="...">
的明显问题,用例是针对开发人员工具的,所以我试图为某些绝对条件创造应急措施。如果它无法完成,它不会破坏我的项目,但我很想知道为什么它无法完成。
提前致谢!
可以在interactive
状态下使用Document readystate,覆盖onload
属性
document.onreadystatechange = () => {
if (document.readyState === 'interactive')
window.onload = null;
}
(为了完整性从您的评论中添加了您的代码。)