如何确定$ .getScript的url

时间:2015-11-02 17:49:22

标签: javascript jquery ajax

我创建了一个JavaScript文件,需要知道它来自哪里。在脚本内部,我有以下代码来确定JavaScript文件的URL。

var url = (function () {
    if (module) {
        // resolve URL from module - RequireJS
        return module.uri;
    }
    else {
        // resolve URL from currentScript - Firefox & Chrome
        if (document.currentScript) {
            return document.currentScript.src;
        }
        // resolve URL from DOM - Internet Explorer
        else {
            var scripts = document.getElementsByTagName('script'),
            script = scripts[scripts.length - 1];

            if (script.getAttribute.length !== undefined) {
                return script.src;
            }
            return script.getAttribute('src', -1);
        }
    }
}());

我希望能够让我的JavaScript文件与使用jQuery $.getScript的用户兼容(它与$.ajax调用相同)。不幸的是,我还没有弄清楚如何在使用它时获取网址。我想到的一个选择是:

var ScriptUrl = "https://example.com/myscript.js";
var callback = function () {
    console.log("Callback");
}
$.getScript(ScriptUrl, callback);

然后我可以在我的脚本中检查变量ScriptUrl,但出于显而易见的原因我不喜欢这个解决方案。

var url = ScriptUrl ? ScriptUrl : (function () {
    // ...
}());

2 个答案:

答案 0 :(得分:3)

我不知道它有多可靠,但唯一可行的方法是在{{1}的开头使用ajaxComplete钩子和魔法唯一标识符 }}。这不适用于跨域请求,因为您无法访问myscript.js,但在这种情况下,您可以扫描responseText标记。

当调用script的回调时,您将检查myscript是否以此唯一标识符开头,如果是,则responseText在{{} 1}}应该是你的一个脚本。

url

如果您确定名称ajaxOptions本身是唯一的,那么您应该能够对相同和跨域请求使用相同的技术,并且您不需要该评论。

您确定需要在执行代码时添加更多逻辑,因为您可以看到//unique-identifier $( document ).ajaxComplete(function(event, jqXHR, ajaxOptions) { if( /^\/\/unique-identifier/.test(jqXHR.responseText) ) { console.log('my url is: '+ajaxOptions.url); } }); console.log('is executed before the "ajaxComplete"'); 将在myscript.js已知之前执行。您可能需要检查console.log是否存在。

也许是这样的:

url

答案 1 :(得分:1)

我采用了t.niese提供的解决方案并将其应用于我的原始代码。 uniqueKey是一个字符串,用于确定url是否是脚本的url。我假设如果用户未使用jQuery,则在执行此代码之前已加载RequireJS

(function (factory) {
    // Support module loading scenarios
    if (typeof define === 'function' && define.amd) {
        // AMD Anonymous Module
        define(['jquery', 'module'], factory);
    } else {
        // No module loader
        factory(jQuery);
    }
})(function ($, module) {
    // Used to determine whether the url is for the script
    var uniqueKey = 'myscript.js';

    var urlPromise = (function () {
        // Check if the url is the correct one
        var validUrl = function(url) {
            return url ? url.indexOf(uniqueKey) > -1 : false; 
        };

        return (function () {
            var deferred = jQuery.Deferred();

            if (document.currentScript && validUrl(document.currentScript.src)) {
                // Chrome & Firefox
                deferred.resolve(document.currentScript.src);
            }
            else if (module && validUrl(module.uri)) {
                // RequireJS
                deferred.resolve(module.uri);
            }
            else {
                // DOM
                var scripts = document.getElementsByTagName('script');
                var script = scripts.length > 0 ? scripts[scripts.length - 1] : null;

                if (script && script.getAttribute.length !== undefined && validUrl(script.src)) {
                    deferred.resolve(script.src);
                }
                else if (script && validUrl(script.getAttribute('src', -1))) {
                    deferred.resolve(script.getAttribute('src', -1));
                }
                else {
                    // AJAX request
                    jQuery(document).ajaxComplete(function(event, jqXHR, ajaxOptions) {
                        if (ajaxOptions && validUrl(ajaxOptions.url)) {
                            deferred.resolve(ajaxOptions.url); 
                        }
                    });
                }
            }        
            return deferred;
        }());
    }());

    urlPromise.then(function(scriptUrl) {
        console.log(scriptUrl);
    });
});