Coisas novas que escrevi durante toda a tarde, esta tarde
boot.js é um
pacote compactado
de arquivo principal
test.html faz referência
a todos os arquivos js de ad.js e existe esse relacionamento:
ad.js->ae.js
ad.js->abc.js
ae.js->abc.js
xnamespace implementa o carregamento síncrono de arquivos js Desde que o arquivo js seja escrito de acordo com a especificação, using_xnamespace pode ser usado para garantir que as bibliotecas das quais ele depende sejam carregadas antes dele.
O único requisito que xnamespace tem para arquivos js é que o arquivo deve ser fechado com um fechamento de função sem nome (function(){ })(). Mesmo que xnamespace não seja usado, esta também é a prática de muitos códigos de alta qualidade. navegador testado ie6 ie7 ff NetScape Safari
A seguir está o conteúdo do boot.js
para o navegador Opera Swift que falhou no teste
[Copiar]Código:
(function(){
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");
function getFilePath(namespace)//Obter o caminho do arquivo de forma privada com base no namespace
{
namespace=namespace.split(".");
var file_path=X.file_path;
var i=0;
while((typeof file_path)=="objeto")
{
caminho_do_arquivo=caminho_do_arquivo[namespace[i++]];
}
retorno (caminho_do_arquivo);
}
function check_xnamespace(namespace)//Verifica se o namespace existe, se existir, obtém o namespace
{
namespace=namespace.split(".");
var xnamespace=X;
var i=0;
enquanto(i<namespace.comprimento)
{
if(!xnamespace[namespace[i]])return;
xnamespace=xnamespace[namespace[i++]];
}
retornar xnamespace;
}
function regist_xnamespace(namespace)//Registrar namespace
{
namespace=namespace.split(".");
var xnamespace=X;
var i=0;
enquanto(i<namespace.comprimento)
{
if(!(xnamespace[namespace[i]]))xnamespace[namespace[i]]={};
//if(typeof xnamespace[namespace[i]]!="object")throw "Conflito de nomenclatura";
xnamespace=xnamespace[namespace[i++]];
}
retornar xnamespace;
}
function using_xnamespace(namespace)//Verifica e carrega o namespace
{
//alert();
if(check_xnamespace(namespace))return;
var file_path=getFilePath(namespace);
//alerta(caminho_do_arquivo);
var scriptElement=document.createElement("script");
scriptElement.src=file_path;
se(éIE)
{
scriptElement.document;
}
outro
{
//alert(document.getElementsByTagName("head")[0]);
scriptElement.onload=função()
{
X.library_queue.run();
}
document.getElementsByTagName("head")[0].appendChild(scriptElement);
if(X.library_queue.push(argumentos.callee.caller))
throw "Biblioteca não carregada"
;
}
função import_xnamespace(namespace)
{
var xnamespace=get_xnamespace(namespace);
para (var p em xnamespace)
{
if(janela[p]==xnamespace[p])continuar;
if(window[p]) throw "Conflito de nomenclatura";
janela[p]=xnamespace[p];
}
}
função export_xnamespace(namespace)
{
var xnamespace=get_xnamespace(namespace);
para (var p em xnamespace)
{
if(janela[p]==xnamespace[p])janela[p]=indefinido;
}
}
X.file_path={
um:{
b:{
c:"./abc.js"
},
d:"./ad.js",
e:"./ae.js"
}
}
X.library_queue=new Array();
X.library_queue.run=function(){
enquanto(este.comprimento)
{
(this.pop())();
}
}
X.library_queue.push=função(f)
{
for(var i=0;i<este.comprimento;i++)
{
if(this[i].toString()==f.toString())return false;
}
isto[i]=f;
retornar verdadeiro;
}
})();
21.10.2007 atualizado silenciosamente: separou os arquivos Exception e FilePath