我确信有人会告诉我为什么这是一个糟糕的想法,但它可能比我们已经发生的事情更好。所以我们所有的插件都被复制/粘贴到Master.js脚本中,这是一个更新或排序的噩梦。大多数插件都是缩小的(这很好),但我真的想从.net / c#/ aspx中获取捆绑的想法,并实现一些类似的东西来摆脱这个Master.js文件。复制/粘贴新脚本通常会冻结项目,其中几乎所有内容都已过时 - 所以这是我疯狂的科学:
在Master.js中,创建一个包含所有脚本的数组:
var scripts = [
'jquery-1.10.2.min.js', // jQuery v1.10.2 | 2005 (https://code.jquery.com/)
'jquery-migrate-1.2.1.min.js', // jQuery Migrate v1.2.1 | 2005 (https://code.jquery.com/)
'jquery-ui.min.js', // jQuery UI v1.10.3 | 2014-09-14 (https://code.jquery.com/)
'bootstrap.min.js', // Bootstrap v3.1.0 | 2014 (http://getbootstrap.com)
];
并创建一个循环以向页面添加脚本:
for (var i = 0; i < scripts.length; i++) {
var link = 'MainJS/' + scripts[i];
LoadJsCssFilePortal(link, 'js');
};
function LoadJsCssFilePortal(filename, filetype, callback) {
// if filename is a external JavaScript file
if (filetype == "js") {
var fileref = document.createElement('script');
fileref.setAttribute("type", "text/javascript");
fileref.setAttribute("src", filename);
};
if (typeof fileref != "undefined") {
// add this script to the document
document.getElementsByTagName("head")[0].appendChild(fileref);
};
};
我也有功能
function LoadAndRunPortalJS(url, callback) {
var script = document.createElement("script")
script.type = "text/javascript";
if (script.readyState) { //IE
script.onreadystatechange = function () {
if (script.readyState === "loaded" || script.readyState === "complete") {
script.onreadystatechange = null;
callback();
}
};
} else { //Others
script.onload = function () {
callback();
};
}
script.src = url;
document.getElementsByTagName("head")[0].appendChild(script);
};
具有内置回调并且被称为
LoadAndRunPortalJS(link, function () {
// when done load next
});
问题是脚本未在
之前完成加载通常,可以使用jquery延迟对象来强制执行脚本的顺序/完成,这样可以在加载第一个脚本(jquery)之后使用i&gt; 0 - 但这并不能解决在master之外运行的脚本问题。
答案 0 :(得分:0)
这是脚本加载器/捆绑器的域。您可以考虑使用RequireJS,Webpack来获得开箱即用的解决方案。如果你还想自己动手,请继续阅读。
我会用更具弹性的排序结构
替换你拥有的文件名数组var manifest = [
{key: 'jquery', file: 'jquery-1.10.2.min.js'}
...
}
这应该可以处理任何可能弹出的版本问题(它会)。数组结构也保留了你的加载顺序(不推荐这样的方法)。
在页面加载时,仅加载上述清单。您要调用的任何on load
函数都必须延迟,直到加载脚本为止。我建议使用类似于广告管理员(例如,Google广告)处理它的方法。
var onBootloaderInit = [/* array of functions */];
....
onBootloaderInit.push(
function() {
/* Code inside can now use jQuery or the likes */
}
);
加载完成后,您现在只需遍历onBootloaderInit
数组,然后执行每个函数。
要确保脚本按您需要的顺序加载,并等待已排队的脚本,请使用脚本加载器(例如,LABjs)。
$LAB.script('<path to jQuery>').wait(function() {
/* Code that depends on jQuery */
});