Cosas frescas que escribí toda la tarde esta tarde.
boot.js es un
paquete comprimido
de archivos principales
test.html hace referencia
a todos los archivos js de ad.js y existe esta relación:
ad.js->ae.js
ad.js->abc.js
ae.js->abc.js
xnamespace implementa la carga sincrónica de archivos js. Siempre que el archivo js esté escrito de acuerdo con la especificación, puede usar use_xnamespace para garantizar que las bibliotecas de las que depende se carguen antes.
El único requisito que tiene xnamespace para los archivos js es que el archivo debe estar encerrado con un cierre de función sin nombre (función(){ })(). Incluso si no se utiliza xnamespace, esta también es la práctica de muchos códigos de alta calidad. navegador probado ie6 ie7 ff NetScape Safari
El siguiente es el contenido de boot.js
para el navegador Opera Swift que no pasó la prueba.
[Copiar] Código:
(función(){
varX={};
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");
función getFilePath(namespace)//Obtener la ruta del archivo de forma privada según el espacio de nombres
{
espacio de nombres=espacio de nombres.split(".");
var file_path=X.file_path;
var i=0;
while((tipo de ruta_archivo)=="objeto")
{
ruta_archivo=ruta_archivo[espacio de nombres[i++]];
}
retorno (ruta_archivo);
}
función check_xnamespace (espacio de nombres) // Verifique si el espacio de nombres existe, si existe, obtenga el espacio de nombres
{
espacio de nombres=espacio de nombres.split(".");
var xnamespace=X;
var i=0;
mientras (i <espacio de nombres.longitud)
{
if(!xnamespace[namespace[i]])return;
xnamespace=xnamespace[espacio de nombres[i++]];
}
devolver xnamespace;
}
función regist_xnamespace(espacio de nombres)//Registrar espacio de nombres
{
espacio de nombres=espacio de nombres.split(".");
var xnamespace=X;
var i=0;
mientras (i <espacio de nombres.longitud)
{
if(!(xnamespace[namespace[i]]))xnamespace[namespace[i]]={};
//if(typeof xnamespace[namespace[i]]!="object")throw "Conflicto de nombres";
xnamespace=xnamespace[espacio de nombres[i++]];
}
devolver xnamespace;
}
función using_xnamespace(namespace)//Verificar y cargar el espacio de nombres
{
//alerta();
if(check_xnamespace(espacio de nombres))return;
var file_path=getFilePath(espacio de nombres);
//alerta(ruta_archivo);
var scriptElement=document.createElement("script");
scriptElement.src=ruta_archivo;
si (es IE)
{
scriptElement.documento;
}
demás
{
//alert(document.getElementsByTagName("cabeza")[0]);
scriptElement.onload=función()
{
X.library_queue.run();
}
document.getElementsByTagName("cabeza")[0].appendChild(scriptElement);
if(X.library_queue.push(argumentos.callee.caller))
tirar "Biblioteca no cargada"
;
}
función import_xnamespace(espacio de nombres)
{
var xnamespace=get_xnamespace(espacio de nombres);
para (var p en xnamespace)
{
if(ventana[p]==xnamespace[p])continuar;
if(window[p]) throw "Conflicto de nombres";
ventana[p]=xnamespace[p];
}
}
función export_xnamespace(espacio de nombres)
{
var xnamespace=get_xnamespace(espacio de nombres);
para (var p en xnamespace)
{
if(ventana[p]==xnamespace[p])ventana[p]=indefinida;
}
}
X.file_path={
a:{
b:{
c:"./abc.js"
},
d:"./ad.js",
e:"./ae.js"
}
}
X.library_queue=nueva matriz();
X.library_queue.run=función(){
mientras (esta longitud)
{
(this.pop())();
}
}
X.library_queue.push=función(f)
{
para(var i=0;i<this.length;i++)
{
if(this[i].toString()==f.toString())devuelve falso;
}
esto[i]=f;
devolver verdadero;
}
})();
10.21 2007 actualizado silenciosamente: separó los archivos Exception y FilePath