Heim Web-Frontend js-Tutorial javascript 文件的同步加载与异步加载实现原理_javascript技巧

javascript 文件的同步加载与异步加载实现原理_javascript技巧

May 16, 2016 pm 05:46 PM
异步加载

HTML 4.01 的script属性
charset: 可选。指定src引入代码的字符集,大多数浏览器忽略该值。
defer: boolean, 可选。延迟脚本执行,相当于将script标签放入页面body标签的底部,js脚本会在document的DOMContentLoaded之前执行。除IE和较新版本的Firefox外,其他浏览器并未支持。
language: 已废弃。大部分浏览器会忽略该值。
src: 可选。指定引入的外部代码文件,不限制后缀名。
type: 必选。指定脚本的内容类型(MIME类型)。现实中通常不指定该值也可以,浏览器会默认当作text/javascript类型来解释执行。

HTML5中的script属性
script 标签在HTML5中除了具备HTML5新标准定义的属性以外,和HTML4.01相比移除了language属性,修改了type属性为可选的(默认text/javascript),并新增了一个属性async。
async :boolean, 属性的作用,定义脚本是否异步执行,取值true或false。
如果 async 设为 true ,会忽略 defer 属性。
异步执行的 js 文件被假定为不使用 document.write() 向加载中的 document 写入内容,因此不要在 异步执行的 js 文件的加载执行过程中使用 document.write()
除了 script 标签属性外,页面引入 js 文件的方式影响其加载执行方式:
任何以添加 script 节点(例如 appendChild(scriptNode) ) 的方式引入的js文件都是异步执行的 (scriptNode 需要插入document中,只创建节点和设置 src 是不会加载 js 文件的,这跟 img 的预加载不能类比 )
html文件中的<script>标签中的代码或src引用的js文件中的代码是同步加载和执行的 <BR>html文件中的<script>标签中的代码使用document.write()方式引入的js文件是异步执行的 <BR>html文件中的<script>标签src属性所引用的js文件的代码内再使用document.write()方式引入的js文件是同步执行的 <BR>使用 Image 对象异步预加载 js 文件(不会被执行) <br><br>不要使用类似下面这种做法,这样并不会发起加载 js 文件的请求: <BR>divNode.innerHTML = '<script src="xxx.js"></script>';
window.onload 事件会在 js 文件加载完毕才触发(即使是异步加载)
=====================================================
1、
<script> <BR>//同步加载执行的代码 <BR></script>
2、
//同步加载执行xx.js中的代码
3、
<script> <BR>document.write('<script src="xx.js"><\/script>'); //异步加载执行xx.js中的代码 <BR></script>
4、

xx.js中有下面代码:
复制代码 代码如下:

document.write('

则xx.js和11.js、22.js 都是同步加载和执行的。
如果 xx.js 、11.js 和 22.js 以插入 script 节点方式异步加载,则 11.js 和 22.js 是异步加载的,
如果 xx.js 以script 节点方式异步加载, 11.js 和 22.js 以 document.write(script) 方式加载,则 11.js 和 22.js 是同步加载的(经最新的浏览器测试, 在chrome 下,xx.j 异步加载执行已经无法使用 document.write() 向文档写入内容的 ,但是 firefox 和IE 却可以在 document 关闭之前写入(方法是在 html 中alert阻止文档关闭))
测试:在11.js中 alert()(不要用 for 循环,浏览器是单线程执行的,持续执行任何一段代码都会导致其余代码被阻塞) , 22.js 中 console.log() ,可以看到 22.js中的代码被阻塞
5、
下面这种方式,xx.js会在appendChild执行之后异步加载执行
复制代码 代码如下:

var script = document.createElement("script");
script.setAttribute("src","xx.js");
documenrt.getElementsByTagName("head")[0].appendChild(script);

6、使用 Image 对象异步预加载 js 文件(不会被执行)
Image 的 src 被赋值时即发起请求,而且对文件类型不挑剔(图片也可能是有脚本动态创建的,比如验证码),因此可以将 js 文件的 url 赋给 image.src, js 加载之后被浏览器缓存.
复制代码 代码如下:

var img = new Image();
img.onload = function(){ alert(1); } ; //由于返回的js文件 MIME 不是图片,onload回调函数并不会被触发
img.src = 'http://localhost/test/loadjs/try.2.js';
var s = document.createElement("script");
var h = document.getElementsByTagName("head")[0];
//执行 js
s.src=img.src;
h.appendChild(s);

一个加载 js 文件的 函数:
复制代码 代码如下:

var loadJS = function(url,callback){
var head = document.getElementsByTagName('head');
if(head&&head.length){
head = head[0];
}else{
head = document.body;
}
var script = document.createElement('script');
script.src = url;
script.type = "text/javascript";
head.appendChild( script);
script.onload = script.onreadystatechange = function(){
//script 标签,IE 下有 onreadystatechange 事件, w3c 标准有 onload 事件
//这些 readyState 是针对IE8及以下的,W3C 标准的 script 标签没有 onreadystatechange 和 this.readyState ,
//文件加载不成功 onload 不会执行,
//(!this.readyState) 是针对 W3C标准的, IE 9 也支持 W3C标准的 onload
if ((!this.readyState) || this.readyState == "complete" || this.readyState == "loaded" ){
callback();
}
}//end onreadystatechange
}

对于第4点的测试(同步加载)(其中插入 alert 很容易看到加载时的阻塞)
tryjs.html
复制代码 代码如下:










tryjs.js
复制代码 代码如下:

console.log('write begin');
document.write('

try.1.js
复制代码 代码如下:

console.log('loadjs 1 begin');
console.log('loadjs 1 finished');

try.2.js
复制代码 代码如下:

console.log('loadjs 2 begin');
console.log('loadjs 2 finished');

测试结果(file 2 和 file 1 的 callback complete 在IE7\8\9次序不确定)
IE 7:
日志: outer js callback loading IE
日志: outer js callback loaded IE
日志: write begin
日志: write finished
日志: outer js callback complete IE
日志: file 1 callback loading IE
日志: file 2 callback loading IE
日志: loadjs 1 begin
日志: loadjs 1 finished
日志: loadjs 2 begin
日志: loadjs 2 finished
日志: file 2 callback complete IE
日志: file 1 callback complete IE

IE8:
日志: outer js callback loading IE
日志: outer js callback loaded IE
日志: write begin
日志: write finished
日志: outer js callback complete IE
日志: file 1 callback loading IE
日志: file 2 callback loading IE
日志: loadjs 1 begin
日志: loadjs 1 finished
日志: loadjs 2 begin
日志: loadjs 2 finished
日志: file 2 callback complete IE
日志: file 1 callback complete IE

IE9:
日志: write begin
日志: write finished
日志: outer js callback complete IE
日志: file 1 callback loading IE
日志: file 2 callback loading IE
日志: loadjs 1 begin
日志: loadjs 1 finished
日志: loadjs 2 begin
日志: loadjs 2 finished
日志: file 1 callback complete IE
日志: file 2 callback complete IE

FIREFOX:
write begin
write finished
outer js callback, not IE
loadjs 1 begin
loadjs 1 finished
file 1 callback,NOT IE
loadjs 2 begin
loadjs 2 finished
file 2 callback,NOT IE

CHROME:
write begin
write finished
outer js callback, not IE
loadjs 1 begin
loadjs 1 finished
file 1 callback,NOT IE
loadjs 2 begin
loadjs 2 finished
file 2 callback,NOT IE
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Offenlegen von Ajax-Ausnahmen und einer Liste von Möglichkeiten zur Fehlerbehebung Offenlegen von Ajax-Ausnahmen und einer Liste von Möglichkeiten zur Fehlerbehebung Jan 30, 2024 am 08:33 AM

Ajax-Anomalie aufgedeckt, der Umgang mit verschiedenen Fehlern erfordert spezifische Codebeispiele Im Jahr 2019 ist die Front-End-Entwicklung zu einer wichtigen Position geworden, die in der Internetbranche nicht ignoriert werden kann. Als eine der am häufigsten verwendeten Technologien in der Front-End-Entwicklung kann Ajax das asynchrone Laden von Seiten und die Dateninteraktion realisieren, und seine Bedeutung liegt auf der Hand. Bei der Verwendung der Ajax-Technologie treten jedoch häufig verschiedene Fehler und Ausnahmen auf. Der Umgang mit diesen Fehlern ist ein Problem, mit dem sich jeder Front-End-Entwickler auseinandersetzen muss. 1. Netzwerkfehler Bei der Verwendung von Ajax zum Senden von Anforderungen tritt der häufigste Fehler auf

Behandeln Sie effektiv Situationen, in denen jQuery .val() nicht funktioniert Behandeln Sie effektiv Situationen, in denen jQuery .val() nicht funktioniert Feb 20, 2024 pm 09:36 PM

Titel: Methoden und Codebeispiele zur Lösung des Problems, dass jQuery.val() nicht funktioniert. In der Frontend-Entwicklung wird jQuery häufig zum Betrieb von Seitenelementen verwendet. Unter diesen ist das Abrufen oder Festlegen des Werts eines Formularelements eine der häufigsten Operationen. Normalerweise verwenden wir die .val()-Methode von jQuery, um Formularelementwerte zu bearbeiten. Allerdings kommt es manchmal vor, dass jQuery.val() nicht funktioniert, was zu Problemen führen kann. In diesem Artikel erfahren Sie, wie Sie effektiv mit jQuery.val umgehen (

Wie liest man HTML Wie liest man HTML Apr 05, 2024 am 08:36 AM

Obwohl HTML selbst keine Dateien lesen kann, kann das Lesen von Dateien durch die folgenden Methoden erreicht werden: mithilfe von JavaScript (XMLHttpRequest, fetch()); mithilfe von serverseitigen Sprachen (PHP, Node.js); get() , axios, fs-extra).

c# Was ist Delegation und welches Problem löst sie? c# Was ist Delegation und welches Problem löst sie? Apr 04, 2024 pm 12:42 PM

Delegation ist ein typsicherer Referenztyp, der zum Übergeben von Methodenzeigern zwischen Objekten verwendet wird, um Probleme bei der asynchronen Programmierung und der Ereignisbehandlung zu lösen: Asynchrone Programmierung: Durch die Delegation können Methoden in verschiedenen Threads oder Prozessen ausgeführt werden, wodurch die Reaktionsfähigkeit der Anwendung verbessert wird. Ereignisverarbeitung: Delegierte vereinfachen die Ereignisverarbeitung und ermöglichen die Erstellung und Verarbeitung von Ereignissen wie Klicks oder Mausbewegungen.

Wie verhindert man die Seitenumleitung in WordPress? Wie verhindert man die Seitenumleitung in WordPress? Mar 05, 2024 am 09:33 AM

Wie verhindert man die Seitenumleitung in WordPress? Bei der Website-Entwicklung möchten wir manchmal eine Seiten-Non-Jump-Einstellung in WordPress implementieren, das heißt, bei bestimmten Vorgängen kann der Seiteninhalt aktualisiert werden, ohne die gesamte Seite zu aktualisieren. Dies verbessert die Benutzererfahrung und macht die Website reibungsloser. Als Nächstes erklären wir Ihnen, wie Sie die Seiten-Non-Jump-Einstellung in WordPress implementieren und stellen spezifische Codebeispiele bereit. Erstens können wir Ajax verwenden, um zu verhindern, dass die Seite springt. Ajax

Der wichtigste Optimierungsmodus zur Verbesserung der Website-Geschwindigkeit, den jeder Front-End-Entwickler beherrschen muss! Der wichtigste Optimierungsmodus zur Verbesserung der Website-Geschwindigkeit, den jeder Front-End-Entwickler beherrschen muss! Feb 02, 2024 pm 05:36 PM

Ein Muss für Frontend-Entwickler: Beherrschen Sie diese Optimierungsmodi und bringen Sie Ihre Website zum Fliegen! Mit der rasanten Entwicklung des Internets sind Websites zu einem wichtigen Kanal für die Unternehmensförderung und -kommunikation geworden. Eine leistungsstarke und schnell ladende Website verbessert nicht nur das Benutzererlebnis, sondern zieht auch mehr Besucher an. Als Frontend-Entwickler ist es wichtig, einige Optimierungsmuster zu beherrschen. In diesem Artikel werden einige häufig verwendete Techniken zur Front-End-Optimierung vorgestellt, um Entwicklern dabei zu helfen, ihre Websites besser zu optimieren. Komprimierte Dateien Bei der Website-Entwicklung werden häufig folgende Dateitypen verwendet: HTML, CSS und J

So führen Sie externe JS in HTML ein So führen Sie externe JS in HTML ein Apr 11, 2024 am 06:18 AM

Um eine externe JS-Datei in HTML einzubinden, verwenden Sie das <script>-Tag und geben Sie die URL der zu ladenden Datei an. Sie können auch Typ-, Verzögerungs- oder Asynchronattribute angeben, um zu steuern, wie das Laden und die Ausführung erfolgen. Normalerweise sollte das <script>-Tag am Ende des <body>-Abschnitts platziert werden, um das Rendern der Seite nicht zu blockieren.

Weitergabe von Tipps zur Optimierung der PHP-Suchfunktion Weitergabe von Tipps zur Optimierung der PHP-Suchfunktion Mar 06, 2024 am 11:12 AM

Die PHP-Suchfunktion war schon immer ein sehr wichtiger Bestandteil der Website-Entwicklung, da Benutzer häufig das Suchfeld verwenden, um die benötigten Informationen zu finden. Viele Websites haben jedoch Probleme wie geringe Effizienz und ungenaue Suchergebnisse bei der Implementierung von Suchfunktionen. Um Ihnen bei der Optimierung der PHP-Suchfunktion zu helfen, gibt dieser Artikel einige Tipps und stellt spezifische Codebeispiele bereit. 1. Verwenden Sie Volltextsuchmaschinen. Herkömmliche SQL-Datenbanken sind bei der Verarbeitung großer Mengen an Textinhalten weniger effizient. Daher wird empfohlen, Volltextsuchmaschinen wie Elasticsearch, Solr usw. zu verwenden.

See all articles