摘要:标签通过获取最后一个标签的属性来得到脚本文件的。这种方式只能在同一个文件中即时执行才有效,不能延迟执行及写成通用的供其他地方调用,否则获取到的不一定是哪个文件的了。
该文写于 2013-08-22
在开发过程中,有时需要动态获取文件的 URL,获取 JS 文件的 URL 是最常见的需求,例如像 Sea.js 等 Module Loader 就会用到。
目前常被用到的有以下几种方式,它们有各自的优缺点。
script 标签通过获取最后一个标签的src属性来得到脚本文件的 URL。这种方式的关键点是正在执行的语句所在的 JS 文件是“当时最后的 JS 文件”。Sea.js 中就是用的此方法。
正因如此,瓶颈也在这里。这种方式只能在同一个文件中即时执行才有效,不能延迟执行及写成通用的 method 供其他地方调用,否则获取到的不一定是哪个 JS 文件的 URL 了。不过这种方式的优点就是能够兼容各个浏览器。
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 基本都被排挤在外
在调用时必须在回调函数中抛出异常
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!!!" ); });
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/91515.html
摘要:在这样的程序中,异步编程通常是有帮助的。最初是为了使异步编程简单方便而设计的。在年设计时,人们已经在浏览器中进行基于回调的编程,所以该语言的社区用于异步编程风格。 来源:ApacheCN『JavaScript 编程精解 中文第三版』翻译项目原文:Node.js 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 部分参考了《JavaScript 编程精解(第 2 版)...
摘要:对于客户端应用来说,服务端渲染是一个热门话题。在服务器预渲染初始应用状态。重构这段脚本,使其可以在服务端运行。如果这些原因和你的情况吻合,那么使用进行服务端渲染将会是个不错方案。我已经发布两个库来支持的服务端渲染和专为应用打造的。 showImg(https://segmentfault.com/img/remote/1460000014155032);对于客户端应用来说,服务端渲染是...
摘要:读不顺中文文档,对应中文文档,自行翻译的如果有问题错误,欢迎指点修改配置选项方法一在顶级页面或顶级脚本文件没有定义模块的脚本文件中配置方法二在主模块中配置缺点主模块异步加载,多入口的话,会随机报错方法三在调用之前,将配置定义为全局变量配置在 读不顺中文文档,对应中文文档,自行翻译的……如果有问题/错误,欢迎指点; 修改配置选项: 方法一、 requi...
摘要:下面我们撇开网络方面的优化,只分析静态资源方面的优化。不过,也会阻止的构建和延缓网页渲染。未优化正常加载优化后异步加载根据上面的分析,我们可以清楚的认识到,非必要优先加载的,选择异步加载是最优选择。 为什么做优化 经典问题:白屏时间过长,用户体验差产生的原因:网络问题、关键渲染路径(CRP)问题 怎么做优化 如何做好优化呢,网上随便一搜,就有很多优化总结,无非就是网络优化、静态资源(h...
阅读 2921·2021-11-23 09:51
阅读 3158·2021-11-12 10:36
阅读 3202·2021-09-27 13:37
阅读 3155·2021-08-17 10:15
阅读 2584·2019-08-30 15:55
阅读 2746·2019-08-30 13:07
阅读 789·2019-08-29 16:32
阅读 2640·2019-08-26 12:00