document.write()造成白屏_写函数代替write加载js解决bug

编写一个模拟document.write()的函数,实现阻塞线程,先加载js并执行js,再执行后续的js代码

这其实是为了解决一个生产环境的bug连续多次调用document.write()导致页面白屏。

为了解决多次调用document.write()的问题,实现一个模拟document.write()的效果的函数,能规避document.write()的毛病(比如:write调用不恰当导致白屏),还能有类似document.write()同步阻塞执行的效果,能严格包装多个js加载的顺序、时序。

关键点:阻塞主线程,阻止js继续执行下一行代码,先加载的a.js,执行完a.js再执行后面的语句。

示例:

function loadAndExecuteScript(url) {

    var xhr = new XMLHttpRequest();

    // 打开一个同步请求

    xhr.open("GET", url, false); // false 表示同步请求   

    try {

        // 发送请求

        xhr.send();

        // 检查请求是否成功

        if (xhr.status === 200) {

            // 使用 eval 执行返回的 JavaScript 代码

            eval(xhr.responseText);

        } else {

            console.error("Failed to load script: " + xhr.status);

        }

    } catch (e) {

        console.error("Error occurred while loading script: " + e);

    }

}

// 使用示例

loadAndExecuteScript("path/to/your/script.js");

用到的技巧:
使用同步的ajax,实现阻塞线程的效果,保证代码执行的时序,跟 document.write 效果一样。大多时候,我们使用异步的ajax,也许都遗忘了还有阻塞代码执行的ajax。

以上代码AI编写,模型是 GPT-4o-mini,用起来还是挺好的。

document.write()添加一个script 用来加载js,这个js会立马加载执行,再执行document.write之后的js语句吗?

是的,当你使用 document.write 加载一个 <script> 标签时,浏览器会立即加载并执行该脚本,然后再继续执行 document.write 之后的 JavaScript 代码。这是因为 document.write 是一个同步操作,浏览器会在执行 document.write 时立即处理其中的内容。

具体流程

执行 document.write:当你调用 document.write 并插入一个 <script> 标签时,浏览器会立即开始加载该脚本。

加载和执行脚本:在加载过程中,浏览器会暂停其他操作,直到该脚本加载完成并执行完毕。

继续执行后续代码:一旦脚本执行完毕,浏览器会继续执行 document.write 之后的 JavaScript 代码。

以下是一个简单的示例:

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>Document Write Example</title>

    <script>

        document.write('<script src="your-script.js"><\/script>');

        console.log("This will execute after your-script.js is loaded and executed.");

    </script>

</head>

<body>

</body>

</html>

在这个例子中:

 document.write 被调用时,浏览器会插入并加载 your-script.js

一旦 your-script.js 加载并执行完毕,控制权会返回到主文档,接着执行 console.log 语句。

注意事项

阻塞性:如前所述,document.write 是阻塞的,可能会影响页面的加载性能。

脚本顺序:如果你在 document.write 中插入多个 <script> 标签,它们会按照插入的顺序依次加载和执行。

不推荐使用:由于 document.write 的这些特性,现代开发中通常不推荐使用它来动态加载脚本。可以考虑使用其他方法(如动态创建 <script> 标签)来加载 JavaScript 文件。

document.write 有什么特点,会不会阻塞线程?

特点

写入内容document.write 可以直接向文档中写入 HTML 内容,包括文本、标签等。

文档加载时使用document.write 主要在文档加载过程中使用。如果在文档加载完成后调用它,会清空整个文档并重新写入内容。

简单易用:对于简单的动态内容插入,document.write 使用起来非常方便。

不支持异步document.write 是一个同步操作,意味着它会立即执行并写入内容。

是的,document.write 是阻塞的。具体来说:

当调用 document.write 时,浏览器会暂停其他操作,直到 document.write 完成。这意味着在执行 document.write 的过程中,浏览器不会渲染页面的其他部分。

如果在文档加载完成后调用 document.write,它会清空整个文档并重新写入内容,这会导致页面的所有内容丢失。


document.write()造成白屏_写函数代替write加载js解决bug
http://xiaodu.janqi.com/p/document.write()造成白屏_写函数代替write加载js解决bug/
作者
程序员小杜
发布于
2024年11月26日
许可协议