window.onload 未在注入的 Javascript 中触发?

问题描述

我有一个 chrome 扩展程序,可以将 javascript 代码注入到这样的网页中

if (document.readyState === "complete") {
    const html = `
        <html>
        <head>
            <Meta charset="UTF-8">
        </head>
        <body>
        <script type="text/javascript">
            console.log(location.href);

            function doStuff() {
                console.log("do stuff");
            }

            console.log("onload");

            window.onload = function () {
                console.log("WINDOW LOADED");
                doStuff();
            }
        </script>
        </body>
        </html>
    `;
    document.write(html);
}

但是,在我导航到页面并且扩展程序注入了 javascript 之后,我可以在控制台中看到它确实记录了 location.hrefonload,但是 window.onload 没有触发,而且我在控制台中没有看到 WINDOW LOADED,也没有调用 doStuff()

我也试过使用

window.addEventListener('load',(event) => {
  console.log('page is fully loaded');
});

以及

document.addEventListener('DOMContentLoaded',doStuff);

无济于事。 任何帮助将不胜感激,我一直无法找到任何有用的东西。

解决方法

我设法通过在我的 <script>

顶部添加内容来解决此问题
setTimeout(() => {
    let evt = document.createEvent('Event');
    evt.initEvent('load',false,false);
    window.dispatchEvent(evt);
},300);

这现在导致 window.onload 触发。希望这可以帮助任何有同样问题的人