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,它会清空整个文档并重新写入内容,这会导致页面的所有内容丢失。