Ordem de carregamento de JavaScript
-
09-06-2019 - |
Pergunta
Estou trabalhando com ambos amq.js (ActiveMQ) e Google Mapas.Eu carrego meus scripts nesta ordem
<head>
<meta http-equiv="content-type" content="text/html;charset=UTF-8" />
<title>AMQ & Maps Demo</title>
<!-- Stylesheet -->
<link rel="stylesheet" type="text/css" href="style.css"></link>
<!-- Google APIs -->
<script type="text/javascript" src="http://www.google.com/jsapi?key=abcdefg"></script>
<!-- Active MQ -->
<script type="text/javascript" src="amq/amq.js"></script>
<script type="text/javascript">amq.uri='amq';</script>
<!-- Application -->
<script type="text/javascript" src="application.js"></script>
</head>
No entanto, em meu application.js, ele carrega bem o Maps, mas recebo um erro ao tentar assinar um tópico com AMQ.AMQ depende do protótipo cujo console de erro no Firefox diz que o objeto não está definido.Acho que tenho um problema ao usar o objeto amq antes que o script termine de carregar. Existe uma maneira de garantir que ambos os scripts sejam carregados antes de usá-los em meu application.js?
O Google tem esta bela chamada de função google.setOnLoadCallback(initialize);
o que funciona muito bem.Não tenho certeza se amq.js tem algo assim.
Solução
Existe uma maneira de garantir que ambos os scripts sejam carregados antes de usá-los em meu application.js?
Os arquivos JavaScript devem ser carregados sequencialmente e bloquear portanto, a menos que os scripts dos quais você depende estejam fazendo algo incomum, tudo o que você precisa fazer é carregar application.js após os outros arquivos.
Downloads de JavaScript sem bloqueio contém algumas informações sobre como os scripts são carregados (e discute algumas técnicas para subverter o bloqueio).
Outras dicas
scripts entre domínios são carregados após os scripts do próprio site, é por isso que você recebe erros.curiosamente, ninguém sabe disso aqui.
em jquery você pode usar:
$(document).ready(function(){/*do stuff here*/});
o que garante que o javascript esteja carregado e o dom esteja pronto antes de fazer suas coisas.
no protótipo parece que isso pode funcionar
document.observe("dom:loaded", function() {/*do stuff here*/});
Se entendi seu problema corretamente..Acho que isso pode ajudar..
Se você não quiser depender de uma biblioteca para fazer isso ...Eu acho que isso pode funcionar:
<script>
function doIt() {/*do stuff here*/}
</script>
<body onLoad="doIt();"></body>
Eu tive um problema semelhante a este, apenas com um único script.A solução que encontrei foi usar addEventListener("load",fn,false)
para um script
objeto criado usando document.createElement('script')
Aqui está a função final que carrega qualquer arquivo JS padrão e permite adicionar um script de “pós-carregamento”.
function addJavaScript( js, onload ) {
var head, ref;
head = document.getElementsByTagName('head')[0];
if (!head) { return; }
script = document.createElement('script');
script.type = 'text/javascript';
script.src = js;
script.addEventListener( "load", onload, false );
head.appendChild(script);
}
Espero que isso possa ajudar alguém no futuro.
Existe uma maneira de garantir que ambos os scripts sejam carregados antes de usá-los?
Sim.
Coloque o código que você deseja carregar por último (seu application.js
coisas) em protótipos documento.observar.Isso deve garantir que o código será carregado somente depois que o protótipo e outras coisas estiverem concluídos e prontos.(Se você estiver familiarizado com jQuery, esta função é semelhante à função do jQuery $(document).ready
)
AMQ depende do protótipo cujo console de erro no FireFox diz que o objeto não está definido.
Você quer dizer que AMQ depende do Biblioteca de protótipos?Não consigo ver uma importação para essa biblioteca no código que você forneceu.
Você quer dizer que o AMQ depende da biblioteca do protótipo?Não consigo ver uma importação para essa biblioteca no código que você forneceu.
Sim, o javascript do ActiveMQ (amq.js) depende do protótipo.No amq.js ele carrega 3 scripts, _amq.js, behavior.js e protótipo.js.
Obrigado por sua ajuda na ordem de carregamento do JavaScript wrumsby.Isso me diz que meu bug está em outro castelo :(
Acho que tenho um problema diferente.Também verifiquei os arquivos js do ActiveMQ 5.0 a 5.1 e percebi que eles também eram iguais.Algo mudou na versão 5.0 para 5.1 que requer uma atualização para a assinatura dos tópicos.Continuarei procurando, mas obrigado por eliminar essa possível causa.
Você também pode usar o método javascript integrado do SharePoint para controlar a execução de seus scripts;
_spBodyOnLoadFunctionNames.push("yourFunction");