Свежие вещи, которые я писал сегодня весь день
сжатый пакет
основного файла
test.html ссылается на
все js-файлы ad.js, и существует такая связь:
ad.js->ae.js
ad.js->abc.js
ae.js->abc.js
xnamespace реализует синхронную загрузку файлов js. Пока файл js написан в соответствии со спецификацией, using_xnamespace можно использовать, чтобы гарантировать, что библиотеки, от которых он зависит, загружаются до него.
Единственное требование, предъявляемое xnamespace к js-файлам, — это то, что файл должен быть заключен в неименованную функцию закрытия (function(){ })(). Даже если xnamespace не используется, это также практикуется во многих высококачественных кодах. протестированный браузер ie6 ie7 ff NetScape Safari
Ниже приведено содержимое файла boot.js
для браузера Opera Swift, который не прошел тест.
[Копировать]Код:
(функция(){
вар X={};
window.using_xnamespace=using_xnamespace;
window.regist_xnamespace=regist_xnamespace;
window.check_xnamespace=window.get_xnamespace=check_xnamespace;
window.import_xnamespace=import_xnamespace;
window.export_xnamespace=export_xnamespace;
var isIE=(window.navigator.appName=="Microsoft Internet Explorer");
function getFilePath(namespace)//Получить путь к файлу на основе пространства имен
{
namespace=namespace.split(".");
вар file_path=X.file_path;
вар я = 0;
while((typeof file_path)=="объект")
{
file_path=file_path[пространство имен[i++]];
}
возврат (путь_файла);
}
function check_xnamespace(namespace) //Проверяем, существует ли пространство имен, если оно существует, получаем пространство имен
{
namespace=namespace.split(".");
вар xnamespace = X;
вар я = 0;
в то время как (я <пространство имен.длина)
{
if(!xnamespace[пространство имен[i]])return;
xnamespace=xnamespace[пространство имен[i++]];
}
вернуть пространство имен xname;
}
function regist_xnamespace(namespace)//Регистрируем пространство имен
{
namespace=namespace.split(".");
вар xnamespace = X;
вар я = 0;
в то время как (я <пространство имен.длина)
{
if(!(xnamespace[namespace[i]]))xnamespace[namespace[i]]={};
//if(typeof xnamespace[namespace[i]]!="object") выбрасываем "Конфликт имен";
xnamespace=xnamespace[пространство имен[i++]];
}
вернуть пространство имен xname;
}
function using_xnamespace(namespace)//Проверяем и загружаем пространство имен
{
// предупреждение();
если (check_xnamespace (пространство имен)) return;
вар file_path = getFilePath (пространство имен);
//оповещение(путь_файла);
var scriptElement=document.createElement("скрипт");
scriptElement.src=путь_файла;
если (ISIE)
{
скриптЭлемент.документ;
}
еще
{
//alert(document.getElementsByTagName("head")[0]);
scriptElement.onload=функция()
{
X.library_queue.run();
}
document.getElementsByTagName("head")[0].appendChild(scriptElement);
если (X.library_queue.push(arguments.callee.caller))
выбросить «Библиотека не загружена»
}
;
}
функция import_xnamespace (пространство имен)
{
вар xnamespace = get_xnamespace (пространство имен);
for(var p в пространстве xnamespace)
{
если (окно [p] == xnamespace [p]) продолжить;
if(window[p]) throw «Конфликт имен»;
окно[p]=xnamespace[p];
}
}
функция Export_xnamespace (пространство имен)
{
вар xnamespace = get_xnamespace (пространство имен);
for(var p в пространстве xnamespace)
{
if(window[p]==xnamespace[p])window[p]=undefined;
}
}
X.file_path={
а:{
б:{
c:"./abc.js"
},
d:"./ad.js",
е:"./ae.js"
}
}
X.library_queue=новый массив();
X.library_queue.run=function(){
пока (это.длина)
{
(this.pop())();
}
}
X.library_queue.push=функция(f)
{
for(var i=0;i<this.length;i++)
{
if(this[i].toString()==f.toString()) вернет false;
}
это[я]=е;
вернуть истину;
}
})();
21.10.2007 незаметно обновлено: файлы Exception и FilePath разделены.