如何确定$.getScript的url
How to determine the url for $.getScript
我创建了一个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
调用相同)。不幸的是,我还没能弄清楚如何在使用url时获得它。我想到的一个选择是:
var ScriptUrl = "https://example.com/myscript.js";
var callback = function () {
console.log("Callback");
}
$.getScript(ScriptUrl, callback);
然后,我可以检查脚本中的变量ScriptUrl
,但出于明显的原因,我不喜欢这个解决方案。
var url = ScriptUrl ? ScriptUrl : (function () {
// ...
}());
我不知道它有多可靠,但唯一可行的方法是在myscript.js
的开头使用ajaxComplete
钩子和魔术唯一标识符。这对跨域请求不起作用,因为在那里您无法访问responseText
,但在这种情况下,您可以扫描script
标签。
当调用myscript
的回调时,您将检查responseText
是否以该唯一标识符开头,如果是,则ajaxOptions
中的url
应该是您的脚本中的一个。
//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
已知之前执行。您可能需要检查jQuery
是否存在。
也许是这样的:
//unique-identifier
(function() {
var ScriptUrl;
function init() {
console.log('init');
}
if( window.jQuery ) {
jQuery( document ).ajaxComplete(function(event, jqXHR, ajaxOptions) {
if( /^'/'/unique-identifier/.test(jqXHR.responseText) ) {
ScriptUrl = ajaxOptions.url;
init();
}
});
} else {
//do some error handling or support an altnerative loader like requirejs
}
}());
我采用了t.niese提供的解决方案,并将其应用于我的原始代码。uniqueKey
是一个字符串,用于确定url是否为脚本的url。如果用户没有使用RequireJS
,我假设在执行此代码之前已经加载了jQuery
。
(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);
});
});
相关文章:
- 如何使用url加载程序在webpack中导入多个图像
- 使用php或javascript从facebook相册URL中删除多余的部分
- Angular JS IE9 Hashbang url rewriting
- JavaScript下拉菜单-点击按钮并根据所选值重定向到url
- 直接下载文件,而不是从window.open(url)
- 动态地改变“”的URL;添加新项目”;链接使用javascript/jquery
- 通过js在新选项卡中有条件地打开url
- CKFinder 3为所选文件返回错误的URL
- 如何获取不属于我项目的上一页的URL
- ReactJS映射:如何仅在url变量不为空时呈现html链接
- 在URL中传递JS对象
- 将纯文本URL转换为可单击链接
- Javascript html每点击一次就会更改url
- 以角度管理动态URL
- Mathias URL shortener
- 如何有效地将游戏数据存储在URL查询字符串中
- 使用带括号的图像URL作为jQuery的背景
- 将 Var 添加到 jQuery.getScript() url 字符串
- 两个javascript函数,第二个等待第一个使用getScript从外部URL检索值
- 如何确定$.getScript的url