摘要:標(biāo)簽通過獲取最后一個(gè)標(biāo)簽的屬性來得到腳本文件的。這種方式只能在同一個(gè)文件中即時(shí)執(zhí)行才有效,不能延遲執(zhí)行及寫成通用的供其他地方調(diào)用,否則獲取到的不一定是哪個(gè)文件的了。
該文寫于 2013-08-22
在開發(fā)過程中,有時(shí)需要?jiǎng)討B(tài)獲取文件的 URL,獲取 JS 文件的 URL 是最常見的需求,例如像 Sea.js 等 Module Loader 就會(huì)用到。
目前常被用到的有以下幾種方式,它們有各自的優(yōu)缺點(diǎn)。
script 標(biāo)簽通過獲取最后一個(gè)標(biāo)簽的src屬性來得到腳本文件的 URL。這種方式的關(guān)鍵點(diǎn)是正在執(zhí)行的語句所在的 JS 文件是“當(dāng)時(shí)最后的 JS 文件”。Sea.js 中就是用的此方法。
正因如此,瓶頸也在這里。這種方式只能在同一個(gè)文件中即時(shí)執(zhí)行才有效,不能延遲執(zhí)行及寫成通用的 method 供其他地方調(diào)用,否則獲取到的不一定是哪個(gè) JS 文件的 URL 了。不過這種方式的優(yōu)點(diǎn)就是能夠兼容各個(gè)瀏覽器。
javascriptfunction scriptPath() { var scripts = document.scripts; var script = scripts[ scripts.length - 1 ]; return script.hasAttribute ? script.src : // hack for IE8- // see http://msdn.microsoft.com/en-us/library/ms536429(VS.85).aspx script.getAttribute( "src", 4 ); } var url = scriptPath();捕獲異常
這是一個(gè)從司徒正美的博文中看到的較為“聰明”的方法,利用了 exception 信息中會(huì)帶有出錯(cuò)文件及位置的特點(diǎn)來獲取。
這種方式可以寫為一個(gè)通用的 method,但其還是有兩個(gè)較為嚴(yán)重的缺陷:
兼容性差,IE 和 Opera 基本都被排擠在外
在調(diào)用時(shí)必須在回調(diào)函數(shù)中拋出異常
javascriptfunction scriptPath( callback ) { var url = ""; if ( typeof callback === "function" ) { try { callback(); } catch( e ) { // Firefox if ( e.fileName ) { url = e.fileName; } // Safari else if ( e.sourceURL ) { url = e.sourceURL; } // Opera 9 else if ( e.stacktrace ) { url = (e.stacktrace.match( /() ins+(.*?://S+)/m ) || ["", ""])[1]; } // Chrome 4+/IE 10+ else if ( e.stack ) { url = (e.stack.match( /((http|file):/{2,3}S+/S+.[a-z0-9]+)/i ) || ["",""])[1]; } } } return url; } // must throw an exception var url = scriptPath(function() { throw Error( "WTF!!!" ); });
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/91515.html
摘要:幸運(yùn)的是,瀏覽器行為的基礎(chǔ)原理是相當(dāng)穩(wěn)定而且文檔齊全的,并且在相當(dāng)長一段時(shí)間內(nèi)肯定不會(huì)發(fā)生顯著變化。瀏覽器有種稱為預(yù)加載掃描器的東西,它會(huì)掃描的腳本,并開始預(yù)加載腳本,不過腳本只會(huì)在先前的節(jié)點(diǎn)已經(jīng)構(gòu)建完成后,才會(huì)依次執(zhí)行。 本文轉(zhuǎn)載自:眾成翻譯譯者:網(wǎng)絡(luò)埋伏紀(jì)事鏈接:http://www.zcfy.cc/article/2847原文:https://hackernoon.com/opt...
摘要:在這樣的程序中,異步編程通常是有幫助的。最初是為了使異步編程簡單方便而設(shè)計(jì)的。在年設(shè)計(jì)時(shí),人們已經(jīng)在瀏覽器中進(jìn)行基于回調(diào)的編程,所以該語言的社區(qū)用于異步編程風(fēng)格。 來源:ApacheCN『JavaScript 編程精解 中文第三版』翻譯項(xiàng)目原文:Node.js 譯者:飛龍 協(xié)議:CC BY-NC-SA 4.0 自豪地采用谷歌翻譯 部分參考了《JavaScript 編程精解(第 2 版)...
摘要:對(duì)于客戶端應(yīng)用來說,服務(wù)端渲染是一個(gè)熱門話題。在服務(wù)器預(yù)渲染初始應(yīng)用狀態(tài)。重構(gòu)這段腳本,使其可以在服務(wù)端運(yùn)行。如果這些原因和你的情況吻合,那么使用進(jìn)行服務(wù)端渲染將會(huì)是個(gè)不錯(cuò)方案。我已經(jīng)發(fā)布兩個(gè)庫來支持的服務(wù)端渲染和專為應(yīng)用打造的。 showImg(https://segmentfault.com/img/remote/1460000014155032);對(duì)于客戶端應(yīng)用來說,服務(wù)端渲染是...
摘要:讀不順中文文檔,對(duì)應(yīng)中文文檔,自行翻譯的如果有問題錯(cuò)誤,歡迎指點(diǎn)修改配置選項(xiàng)方法一在頂級(jí)頁面或頂級(jí)腳本文件沒有定義模塊的腳本文件中配置方法二在主模塊中配置缺點(diǎn)主模塊異步加載,多入口的話,會(huì)隨機(jī)報(bào)錯(cuò)方法三在調(diào)用之前,將配置定義為全局變量配置在 讀不順中文文檔,對(duì)應(yīng)中文文檔,自行翻譯的……如果有問題/錯(cuò)誤,歡迎指點(diǎn); 修改配置選項(xiàng): 方法一、 requi...
摘要:下面我們撇開網(wǎng)絡(luò)方面的優(yōu)化,只分析靜態(tài)資源方面的優(yōu)化。不過,也會(huì)阻止的構(gòu)建和延緩網(wǎng)頁渲染。未優(yōu)化正常加載優(yōu)化后異步加載根據(jù)上面的分析,我們可以清楚的認(rèn)識(shí)到,非必要優(yōu)先加載的,選擇異步加載是最優(yōu)選擇。 為什么做優(yōu)化 經(jīng)典問題:白屏?xí)r間過長,用戶體驗(yàn)差產(chǎn)生的原因:網(wǎng)絡(luò)問題、關(guān)鍵渲染路徑(CRP)問題 怎么做優(yōu)化 如何做好優(yōu)化呢,網(wǎng)上隨便一搜,就有很多優(yōu)化總結(jié),無非就是網(wǎng)絡(luò)優(yōu)化、靜態(tài)資源(h...
閱讀 2932·2021-11-23 09:51
閱讀 3179·2021-11-12 10:36
閱讀 3216·2021-09-27 13:37
閱讀 3168·2021-08-17 10:15
閱讀 2599·2019-08-30 15:55
閱讀 2759·2019-08-30 13:07
閱讀 801·2019-08-29 16:32
閱讀 2657·2019-08-26 12:00