获取动态加载的跨域JavaScript文件当前正在执行的JavaScript代码的文件路径

获取动态加载的跨域JavaScript文件当前正在执行的JavaScript代码的文件路径,javascript,jquery,cross-domain,bookmarklet,Javascript,Jquery,Cross Domain,Bookmarklet,我需要加载跨域JavaScript 我的网站中书签的动态文件 解决方案应满足: 获取当前文件的路径 当前网页和正在执行的JS文件的域不同 解决方案应该是跨浏览器 可以同时异步加载多个脚本(这就是为什么下面提到的相关问题不合适的原因) 我想获取当前执行的JavaScript代码的文件路径,以便动态加载更多的资源(更多的CSS文件和JS文件,如自定义代码和jQuery、jQuery UI和Ext JS库),这些资源存储在与JavaScript Bookmarklet相同的/相对文件夹中 以下

我需要加载跨域JavaScript
我的网站中书签的动态文件


解决方案应满足:

  • 获取当前文件的路径
  • 当前网页和正在执行的JS文件的域不同
  • 解决方案应该是跨浏览器
  • 可以同时异步加载多个脚本(这就是为什么下面提到的相关问题不合适的原因)

我想获取当前执行的JavaScript代码的文件路径,以便动态加载更多的资源(更多的CSS文件和JS文件,如自定义代码和jQuery、jQuery UI和Ext JS库),这些资源存储在与JavaScript Bookmarklet相同的/相对文件夹中


以下方法不适合我的问题:

var scripts = document.getElementsByTagName("script");
var src = scripts[scripts.length-1].src;
alert("THIS IS: "+src);

与我的问题不符的相关问题:

var scripts = document.getElementsByTagName("script");
var src = scripts[scripts.length-1].src;
alert("THIS IS: "+src);

我目前使用的解决方案有效,但非常冗长:

var fnFullFilePathToFileParentPath = function(JSFullFilePath){
    var JSFileParentPath = '';
    if(JSFullFilePath) {
        JSFileParentPath = JSFullFilePath.substring(0,JSFullFilePath.lastIndexOf('/')+1);
    } else {
        JSFileParentPath = null;
    }
    return JSFileParentPath;
};

var fnExceptionToFullFilePath = function(e){
    var JSFullFilePath = '';

    if(e.fileName) {    // firefox
        JSFullFilePath = e.fileName;
    } else if (e.stacktrace) {  // opera
        var tempStackTrace = e.stacktrace;
        tempStackTrace = tempStackTrace.substr(tempStackTrace.indexOf('http'));
        tempStackTrace = tempStackTrace.substr(0,tempStackTrace.indexOf('Dummy Exception'));
        tempStackTrace = tempStackTrace.substr(0,tempStackTrace.lastIndexOf(':'));
        JSFullFilePath = tempStackTrace;
    } else if (e.stack) {   // firefox, opera, chrome
        (function(){
            var str = e.stack;
            var tempStr = str;

            var strProtocolSeparator = '://';
            var idxProtocolSeparator = tempStr.indexOf(strProtocolSeparator)+strProtocolSeparator.length;

            var tempStr = tempStr.substr(idxProtocolSeparator);
            if(tempStr.charAt(0)=='/') {
                tempStr = tempStr.substr(1);
                idxProtocolSeparator++;
            }

            var idxHostSeparator = tempStr.indexOf('/');
            tempStr = tempStr.substr(tempStr.indexOf('/'));

            var idxFileNameEndSeparator = tempStr.indexOf(':');
            var finalStr = (str.substr(0,idxProtocolSeparator + idxHostSeparator + idxFileNameEndSeparator));
            finalStr = finalStr.substr(finalStr.indexOf('http'));
            JSFullFilePath = finalStr;
        }());
    } else {    // internet explorer
        JSFullFilePath = null;
    }

    return JSFullFilePath;
};

var fnExceptionToFileParentPath = function(e){
    return fnFullFilePathToFileParentPath(fnExceptionToFullFilePath(e));
};

var fnGetJSFileParentPath = function() {
    try {
        throw new Error('Dummy Exception');
    } catch (e) {
        return fnExceptionToFileParentPath(e);
    }
};

var JSFileParentPath = fnGetJSFileParentPath();
alert('File parent path: ' + JSFileParentPath);
你不能简单地这样做吗

var myScriptDir = 'http://somesite.tld/path-to-stuff/';
var s = document.createElement('script'); 
s.setAttribute('src', myScriptDir + 'code.js'); 
document.body.appendChild(s); 
// code inside http://somesite.tld/path-to-stuff/code.js will use myScriptDir to load futher resources from the same directory.

如果不想让脚本中的代码负责加载更多资源,可以使用脚本标记的onload属性,如
s.onload=function(){…}
。为了实现跨浏览器兼容性,您可以先加载jQuery,然后使用getScript函数。相关的链接是和

一些评论已经提到了这一点,但我将尝试进一步阐述

计算当前脚本路径的最简单、最跨浏览器、跨域的方法是将脚本路径硬编码到脚本本身中


通常,您可能正在加载第三方脚本文件,因此这是不可能的。但在您的情况下,所有脚本文件都在您的控制之下。您已经在添加代码来加载资源(CSS、JS等),还可以包括脚本路径。

我不明白为什么第一个相关问题不能回答您的问题。请告诉我们您是如何动态加载脚本的,这对于获取路径是非常重要的。上述方法不适用于跨域JS文件。只有第一句话是相关的:它一般不起作用,但可能有解决办法。但是,您可以在脚本中为路径添加一个静态变量,该变量可能由服务器端脚本生成;s、 setAttribute('src','code.js');文件。正文。附录子项;我相信这是跨域文件的唯一可能的方法(现代跨域AJAX(like)请求不是一个选项,因为我需要一个能在几乎任何随机网站上工作的通用解决方案),为什么不简单地在服务器端生成js文件的一部分,比如
var\uuuu domain='$\u HOST'?这将适用于任何浏览器,包括netscape。我希望有一个比当前发布的更好的答案,因为当前的答案涉及错误处理,导致无法在IE中使用它和调试。按照我在回答中提到的原始解决方案。。。没有完美的解决方案,其他答案可能更容易实现,具体取决于需求。这种方法的问题是,当您希望移动文件时,需要进行维护。。。对于我想要的,似乎没有理想的解决方案。是的,维护是一个问题,但是您可以在服务器端生成脚本(如@c9所示),或者在移动脚本时使用或类似的工具(重新)生成脚本。关键是,查找当前脚本的路径不是需要在浏览器上完成的工作。移动脚本是未来的可能;无法在IE中调试是一个真正的问题。