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