ホームページ > 記事 > ウェブフロントエンド > JSスクリプトを使用してロード後に対応するコールバック関数を実装する方法
この記事では主に、jsファイルが正常にロードされた後に対応するコールバックタスクを実行する方法について説明します。JSスクリプトがロードされた後に対応するコールバック関数を実行する操作方法に興味がある友人は、この記事から学んでください
このような問題はよくあります。プロジェクトで遭遇したこと: js スクリプトがロードされると、対応するタスクが実行されますが、ロードしたい js ファイルがロードされているかどうかを判断する方法を知らない人も多いでしょう。ロードされていない場合は成功しません。 js ファイル内の関数を呼び出した場合。この記事では主に、js ファイルの読み込みに成功した後、対応するコールバック タスクを実行する方法について説明します。
基本的な考え方
3f1c4e4b6b16bbbd69b2ee476dc4f83a
要素を動的に作成し、その src 属性を変更してスクリプトをロードできますが、スクリプト ファイルがロードされたことをどのように確認すればよいでしょうか。 ?スクリプトを呼び出す前に一部の関数をロードする必要があるためです。 IE ブラウザでは、<script>> 要素の <code>onreadystatechange
を使用して読み込み状態の変化を監視し、スクリプトが読み込まれているかどうかを判断できます。 readyState はロードされているか、完了しています。 IE 以外のブラウザでは、onload を使用して、スクリプトが読み込まれているかどうかを直接判断できます。 3f1c4e4b6b16bbbd69b2ee476dc4f83a
元素,然后通过更改它的 src 属性来加载脚本,但是怎么知道这个脚本文件加载完成了呢?因为有些函数需要在脚本加载完成才能调用。IE 浏览器中可以使用 3f1c4e4b6b16bbbd69b2ee476dc4f83a
元素的 onreadystatechange
来监控加载状态的改变,并通过判断它的 readyState 是 loaded 或 complete 来判断脚本是否加载完成。而非 IE 浏览器可以使用 onload 来直接判断脚本是否加载完成。
动态脚本简单示例
一个 简单 的实现过程如下:
// IE下: var HEAD = document.getElementsByTagName('head')[0] || document.documentElement var src = 'http://xxxxxx.com' var script = document.createElement('script') script.setAttribute('type','text/javascript') script.onreadystatechange = function() { if(this.readyState === 'loaded' || this.readyState === 'complete') { console.log('加载成功!') } } script.setAttribute('src', src) HEAD.appendChild(script) // Chrome等现代浏览器: var HEAD = document.getElementsByTagName('head')[0] || document.documentElement; var src = 'http://xxxxxx.com' var script = document.createElement('script') script.setAttribute('type','text/javascript') script.onload = function() { console.log('加载成功!') } script.setAttribute('src', src) HEAD.appendChild(script)
原理很简单,根据这两个简单的原理,我们进行一些修改,我把改成了两个函数,分别是 串行加载 和 并行加载 。
串行和并行动态脚本
当传一个包含多个JS文件路径的数组时,串行加载函数从第一个脚本文件加载开始,每加载成功一个便开始加载下一个脚本文件,全部加载完成后执行回调函数。而并行加载是一开始便加载全部的脚本文件,也就是他们从同一点开始加载,当全部加载完成后,执行回调函数。
/** * 串行加载指定的脚本 * 串行加载[异步]逐个加载,每个加载完成后加载下一个 * 全部加载完成后执行回调 * @param {Array|String} scripts 指定要加载的脚本 * @param {Function} callback 成功后回调的函数 * @return {Array} 所有生成的脚本元素对象数组 */ function seriesLoadScripts(scripts, callback) { if(typeof(scripts) !== 'object') { var scripts = [scripts]; } var HEAD = document.getElementsByTagName('head')[0] || document.documentElement; var s = []; var last = scripts.length - 1; //递归 var recursiveLoad = function(i) { s[i] = document.createElement('script'); s[i].setAttribute('type','text/javascript'); // Attach handlers for all browsers // 异步 s[i].onload = s[i].onreadystatechange = function() { if(!/*@cc_on!@*/0 || this.readyState === 'loaded' || this.readyState === 'complete') { this.onload = this.onreadystatechange = null; this.parentNode.removeChild(this); if(i !== last) { recursiveLoad(i + 1); } else if (typeof(callback) === 'function') { callback() }; } } // 同步 s[i].setAttribute('src', scripts[i]); HEAD.appendChild(s[i]); }; recursiveLoad(0); } /** * 并行加载指定的脚本 * 并行加载[同步]同时加载,不管上个是否加载完成,直接加载全部 * 全部加载完成后执行回调 * @param {Array|String} scripts 指定要加载的脚本 * @param {Function} callback 成功后回调的函数 * @return {Array} 所有生成的脚本元素对象数组 */ function parallelLoadScripts(scripts, callback) { if(typeof(scripts) !== 'object') { var scripts = [scripts]; } var HEAD = document.getElementsByTagName('head')[0] || document.documentElement; var s = []; var loaded = 0; for(var i = 0; i < scripts.length; i++) { s[i] = document.createElement('script'); s[i].setAttribute('type','text/javascript'); // Attach handlers for all browsers // 异步 s[i].onload = s[i].onreadystatechange = function() { if(!/*@cc_on!@*/0 || this.readyState === 'loaded' || this.readyState === 'complete') { loaded++; this.onload = this.onreadystatechange = null; this.parentNode.removeChild(this); if(loaded === scripts.length && typeof(callback) === 'function') callback(); } }; // 同步 s[i].setAttribute('src',scripts[i]); HEAD.appendChild(s[i]); } }
在这里是把 3f1c4e4b6b16bbbd69b2ee476dc4f83a
标签动态的插入到页面中的 93f0f5c25f18dab9d176bd4f6de5d30e
标签内部,并且加载完成后标签元素会被自动移除。
使用方法
这里声明了一个数组变量,里面包含了两个远程的JS文件地址(当然 3f1c4e4b6b16bbbd69b2ee476dc4f83a
var scripts = [ "http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js", "http://wellstyled.com/files/jquery.debug/jquery.debug.js" ]; // 这两个文件分别是 jQuery 1.4.的库文件和 jQuery Debug 插件 // 然后你可以使用下面的方法调用并在成功后执行回调了。 parallelLoadScripts(scripts, function() { /* debug = new $.debug({ posTo : { x:'right', y:'bottom' }, width: '480px', height: '50%', itempider : '<hr>', listDOM : 'all' }); */ console.log('脚本加载完成啦'); });この 2 つの簡単な原則に基づいて、いくつかの変更を加えて 2 つの関数にします。シリアルロードとパラレルロード。 シリアルおよびパラレル動的スクリプト複数の JS ファイル パスを含む配列が渡されると、シリアル ロード関数は最初のスクリプト ファイルのロードから開始され、ファイルのロードが成功するたびに次のスクリプトのロードを開始します。コールバック関数は、すべてのロードが完了した後に実行されます。並列ロードでは、すべてのスクリプト ファイルが最初からロードされます。つまり、すべてのロードが完了すると、コールバック関数が実行されます。 🎜rrreee🎜 ここでは、
<script>> タグがページの <code><head>> タグに動的に挿入され、タグ要素は読み込み後に自動的に移動されます。削除が完了しました。 🎜🎜🎜🎜使い方🎜🎜🎜🎜 ここで配列変数が宣言されており、これには 2 つのリモート JS ファイル アドレスが含まれています (もちろん <code>3f1c4e4b6b16bbbd69b2ee476dc4f83a
タグ呼び出しスクリプトはクロスドメインをサポートしています): 🎜rrreee 🎜上記は私が皆さんのためにまとめたものであり、今後皆さんのお役に立てば幸いです。 🎜🎜関連記事: 🎜🎜🎜vueのmixins属性を詳しく解説🎜🎜🎜🎜vue2.0で模擬したアンカーポイントの例🎜🎜🎜🎜Vueはmixinsを使って圧縮画像コードを実装しています🎜🎜以上がJSスクリプトを使用してロード後に対応するコールバック関数を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。