【发布时间】:2019-09-25 23:15:24
【问题描述】:
在加载窗口后,我正在动态创建一个新的<script> 并将其附加到 DOM:
const loadDynamicScript = () => {
const dynamicScript = document.createElement('script');
dynamicScript.src = '/my-dynamic-script.js';
document.body.appendChild(dynamicScript);
}
window.addEventListener('load', loadDynamicScript);
注意我已经尝试过
window.addEventListener('DOMContentLoaded', loadDynamicScript);但这意味着/my-dynamic-script.js加载得太快了。
出乎意料的是,my-dynamic-script.js 中的任何 window.onload 事件侦听器现在都不起作用。
我猜这是因为事件侦听器会侦听 window 加载的单个特定时刻,而 此后的任何时间都为时已晚。 (这与我的预期不同——一旦加载了窗口,窗口将处于始终积极触发window.onload 事件侦听器的状态。
那么,在 my-dynamic-script.js... 我可以用什么来代替:
window.addEventListener('load', activateMyFunction);
我试过了:
self.addEventListener('load', activateMyFunction);window.addEventListener('DOMContentLoaded', activateMyFunction);window.addEventListener('pageshow', activateMyFunction);document.body.addEventListener("pageshow", myFunction);
到目前为止还没有运气。我显然需要更有创意。
工作的一个解决方案是简单地从事件侦听器中删除函数调用,并在不加修饰的情况下声明它:
myFunction();
但这并不理想。我真的更喜欢在某种事件监听器(或类似的)中调用任何函数。
【问题讨论】:
-
您能否解释一下为什么您希望等待侦听已经过去的事件?当页面处于特定状态时,您的代码是否依赖于被调用?
-
是的,我可以解释。
my-dynamic-script.js是从经过清理的第三方输入编译而来的,我不能排除它不会包含window.onload事件侦听器。我需要解析和替换。 -
啊,我明白了。使用
dispatchEvent(new Event('load'));加载动态脚本后,也许可以手动重新触发 onload 事件? -
不客气,但感谢@declan-mckelvey-hembree 的想法。祝你有美好的一天!
-
很高兴。
标签: javascript events onload