Home > Article > Web Front-end > Explanation of methods to implement synchronization and asynchronous loading of JavaScript files
This article mainly introduces the implementation code of synchronous and asynchronous loading of JavaScript files, which has certain reference value. Those who are interested can learn about
References to JS files, although there are currently many frameworks and tools (such as webpack, commonjs, requiresjs, etc.) are all handled well. But aside from these frameworks, it is still helpful to understand the native loading method. This article briefly describes the synchronous and asynchronous loading methods of some js files.
Synchronous loading
Can be inserted into the html file with the 3f1c4e4b6b16bbbd69b2ee476dc4f83a tag. This is the most basic way when you first learn .
Prepare two js files as follows:
calc1.js
##
console.log('calc1 loading begin') function add(...args) { return args.reduce((currentTotal, i) => currentTotal + i, 0); } console.log('calc1 loading end')calc2.js
console.log('calc2 loading begin') console.log(add(1,2,3)) console.log('calc2 loading end')calc2.js depends on calc1.js. The html file is as follows:
<body> <script src="calc1.js"> </script> <script src="calc2.js"> </script> </body>In this way, the file loading is synchronous. That is, calc2.js is loaded only after calc1.js is loaded, so it is guaranteed that calc2.js can always call the add function in calc1 correctly. The debugging results in Chrome are as follows: However, the shortcomings of synchronous loading are also obvious. If there are multiple files, the total loading time will be very long and the user interface will be blocked. response.
Asynchronous loading through Script Element
<head> <meta charset="UTF-8"> <title>Title</title> <script type="text/javascript"> var script1 = document.createElement('script'); script1.src='calc1.js'; script1.type='text/javascript'; var script2 = document.createElement('script'); script2.src='calc2.js'; script2.type='text/javascript'; document.getElementsByTagName('head')[0].appendChild(script1).appendChild(script2); </script> </head>The debugging results in Chrome can sometimes be correctly output as follows:
But sometimes because clac1.js is not loaded first, an error will be reported when calc2.js is executed. Then we have to solve the loading order problem and ensure that calc1.js is loaded first.
<head> <meta charset="UTF-8"> <title>Title</title> <script type="text/javascript"> function loadScript(file, callbackFn) { var script = document.createElement('script'); script.src= file; script.type='text/javascript'; // 监听onload时间,当前js文件加载完成后,再加载下一个 script.onload = callbackFn; document.getElementsByTagName('head')[0].appendChild(script) } loadScript('calc1.js', function () { loadScript('calc2.js'); } ); </script> </head>This will always output the correct result.
Loading JS files through AJAX
<script> function loadScript(file, callbackFn) { var xhr = new XMLHttpRequest(); xhr.open('get', file, true); // for IE if (xhr.onreadystatechange) { xhr.onreadystatechange = function () { console.log(xhr.readyState, xhr.status); if (xhr.readyState == 4) { if (xhr.status >= 200 && xhr.status < 300 || xhr.status == 304) { insertScriptText(xhr.responseText); if (callbackFn) { callbackFn(); } } } } } else { xhr.onload = function () { insertScriptText(xhr.responseText); if (callbackFn) { callbackFn(); } } } xhr.send(null); } function insertScriptText(scriptText) { var script = document.createElement('script'); script.type = 'text/javascript'; script.text = scriptText; document.body.appendChild(script); } loadScript('calc1.js', function () { loadScript('calc2.js'); }); </script>can also output the results correctly.
Summary
The above is the detailed content of Explanation of methods to implement synchronization and asynchronous loading of JavaScript files. For more information, please follow other related articles on the PHP Chinese website!