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.

Foi útil?

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");
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top