你可以依赖于以下事实:每个 <script>
元素在被插入到 DOM 前都必须先被执行。
这意味着当前被执行的脚本(只要它是作为你的标记的一部分而不是动态插入的)将是使用 getElementsByTagName('script')
检索到的 NodeList
中的最后一个。
这使得你可以读取该元素的 src 属性,并从中确定正在提供该脚本的文件夹,就像这样:
var scriptEls = document.getElementsByTagName( 'script' );
var thisScriptEl = scriptEls[scriptEls.length - 1];
var scriptPath = thisScriptEl.src;
var scriptFolder = scriptPath.substr(0, scriptPath.lastIndexOf( '/' )+1 );
console.log( [scriptPath, scriptFolder] );
我尝试了这种技术,加载了来自不同文件夹的3个脚本,并获得了以下输出
* 来自约翰·雷西格在上面链接的博客
这意味着当脚本最终执行时,它将成为DOM中的最后一个脚本 - 甚至是DOM中的最后一个元素(DOM的其余部分会随着它命中更多的脚本标签而逐步构建,或者直到文档结束)。
更新
正如pimvdb所指出的那样 - 当脚本被评估时,这将起作用。如果您稍后要使用它,则需要以某种方式存储路径。您不能在以后的某个时间查询DOM。如果您对每个脚本使用相同的片段,则每个脚本的scriptFolder
的值都将被覆盖。您应该为每个脚本提供一个唯一的变量,也许?
将脚本包装在自己的范围内,可以关闭scriptFolder
的值,使其在不害怕被覆盖的情况下可用于脚本的其余部分
(function() {
var scriptEls = document.getElementsByTagName( 'script' );
var thisScriptEl = scriptEls[scriptEls.length - 1];
var scriptPath = thisScriptEl.src;
var scriptFolder = scriptPath.substr(0, scriptPath.lastIndexOf( '/' )+1 );
$( function(){
$('#my-div').click(function(e){
alert(scriptFolder);
});
});
})();
alert('<?= __FILE__ ?>');
的操作如何?(我知道这种方法需要避免文件中的杂散的<? ... ?>
等内容) - Prusse$("somediv").css("background-image", "url(./images/img.png)");
。 - Prusse