什么是我的脚本srcurl?

有一种简单可靠的方法来确定当前正在执行的JavaScript文件(在网页内)的URL吗?

我唯一的想法就是扫描所有脚本src属性的DOM,以查找当前文件如何被引用,然后通过将其应用于document.location来找出绝对URL。 任何人有其他的想法,有没有我完全忽略了一些超级简单的方法?

更新:通过DOM访问的脚本元素已经有一个src属性,其中包含完整的URL。 我不知道如何无处不在/标准,但也可以使用getAttribute("src") ,它将返回[X] HTML中的任何原始属性值。

把它放在需要知道它自己的url的js文件中。

完全合格 (例如http://www.example.com/js/main.js ):

 var scriptSource = (function(scripts) { var scripts = document.getElementsByTagName('script'), script = scripts[scripts.length - 1]; if (script.getAttribute.length !== undefined) { return script.src } return script.getAttribute('src', -1) }()); 

或者当它出现在源代码中 (例如/js/main.js ):

 var scriptSource = (function() { var scripts = document.getElementsByTagName('script'), script = scripts[scripts.length - 1]; if (script.getAttribute.length !== undefined) { return script.getAttribute('src') } return script.getAttribute('src', 2) }()); 

请参阅http://www.glennjones.net/Post/809/getAttributehrefbug.htm解释正在使用的;getAttribute参数(这是一个IE错误)。

对于最近的浏览器,您可以使用document.currentScript来获取这些信息。

 var mySource = document.currentScript.src; 

好处是对于asynchronous加载的脚本来说更可靠。 不足之处在于,我所知道的并不是普遍的支持。 它应该在Chrome> = 29,FireFox> = 4,Opera> = 16上工作。像许多有用的东西,它似乎不工作在IE中。

当我需要得到一个脚本path时,我检查是否定义了document.currentScript,如果没有,使用接受的答案中描述的方法。

 if (document.currentScript) { mySource = document.currentScript.src; } else { // code omitted for brevity } 

https://developer.mozilla.org/en-US/docs/Web/API/document.currentScript

由于它出现在源代码中 (例如/js/main.js ),这是跨浏览器

 var scriptSource = (function() { var scripts = document.getElementsByTagName('script'), script = scripts[scripts.length - 1]; //No need to perform the same test we do for the Fully Qualified return script.getAttribute('src', 2); //this works in all browser even in FF/Chrome/Safari }()); 

完全合格 (例如http://www.example.com/js/main.js ):

经过一些testing,似乎很难以跨浏览器的方式获得完全合格的 。 Crescent Freshbuild议的解决scheme 在IE8中无法正常工作 ,即使它在IE7中也能正常工作

这个方法使用延迟,asynchronous和延迟加载既然你知道你的脚本的文件名,并且它是唯一的

 /* see * http://stackoverflow.com/questions/984510/what-is-my-script-src-url/984656#984656 * http://www.glennjones.net/Post/809/getAttributehrefbug.htm * * iterate all script to find script with right filename * this work with async and defer (but your script MUST have a unique filemane) * mozilla support document.currentScript and we use it, if is set * * this will not work with local script loaded by jQuery.getScript(), * since there is no script tag added into the dom. the script is only evaluated in global space. * http://api.jquery.com/jQuery.getScript/ * * to fix this odd, you can add a reference in meta ( meta[name=srcipt][content=url] ) * when you load the script */ var scriptFilename = 'jquery.plugins.template.js'; // don't forget to set the filename var scriptUrl = (function() { if (document.currentScript) { // support defer & async (mozilla only) return document.currentScript.src; } else { var ls,s; var getSrc = function (ls, attr) { var i, l = ls.length, nf, s; for (i = 0; i < l; i++) { s = null; if (ls[i].getAttribute.length !== undefined) { s = ls[i].getAttribute(attr, 2); } if (!s) continue; // tag with no src nf = s; nf = nf.split('?')[0].split('/').pop(); // get script filename if (nf === scriptFilename) { return s; } } }; ls = document.getElementsByTagName('script'); s = getSrc(ls, 'src'); if ( !s ) { // search reference of script loaded by jQuery.getScript() in meta[name=srcipt][content=url] ls = document.getElementsByTagName('meta'); s = getSrc(ls, 'content'); } if ( s ) return s; } return ''; })(); var scriptPath = scriptUrl.substring(0, scriptUrl.lastIndexOf('/'))+"/"; 

一个jQuery的插件模板: https : //github.com/mkdgs/mkdgs-snippet/blob/master/javascript/jquery.plugins.template.js

注意:这不会与jQuery.getScript()加载的本地脚本一起工作,因为在dom中没有添加脚本标记。 脚本仅在全局空间中进行评估。 http://api.jquery.com/jQuery.getScript/

修复它,你可以做一些事情:

 function loadScript(url,callback) { if ( $('[src="'+url+'"]').length ) return true; // is already loaded // make a reference of the loaded script if ( $('meta[content="'+url+'"]', $("head")).length ) return true; // is already loaded var meta = document.createElement('meta'); meta.content = url; meta.name = 'script'; $("head").append(meta); return $.ajax({ cache: true, url: u, dataType: 'script', async: false, success : function (script) { try { if ( typeof callback == 'function' ) callback(); } catch (error) { //console.log(error); } } }); } 

如果这是一个严格的客户端解决scheme,你听起来不错。

如果你在服务器上编写代码,你可能只需在脚本中填充一个div / hidden字段/(在这里插入你最喜欢的HTML元素),然后在你的脚本中select你的javascript。

如果您有兴趣了解哪些function(以及哪些文件)在页面上执行,您可能需要查看https://addons.mozilla.org/en-US/firefox/addon/10345 。控制。

如果你想搞清楚你的哪个脚本正在执行,那么有很多方法。 用Firebug你可以console.log()的信息。 即使只是在你的代码中放置提醒语句(虽然令人讨厌)可以帮助用低科技的方式进行debugging。 您也可以引发错误并捕获错误,然后使用错误的属性进行处理(请参阅: https : //developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Error )

但是,为什么这很重要呢? 如果脚本已经导致错误,那么很容易确定错误发生的位置。 如果不是关于错误,那么知道它来自哪个文件有什么好处?