Como você pode carregar de maneira confiável e dinâmica um arquivo JavaScript? Isso pode ser usado para implementar um módulo ou componente que, quando 'inicializado', o componente carregará dinamicamente todos os scripts de biblioteca JavaScript necessários sob demanda.
O cliente que usa o componente não é obrigado a carregar todos os arquivos de script da biblioteca (e inserir manualmente <script>
tags em suas páginas da web) que implementam esse componente - apenas o arquivo de script do componente 'principal'.
Como as principais bibliotecas JavaScript conseguem isso (Prototype, jQuery, etc)? Essas ferramentas mesclam vários arquivos JavaScript em uma única versão redistribuível de 'build' de um arquivo de script? Ou eles fazem algum carregamento dinâmico de scripts auxiliares da 'biblioteca'?
Uma adição a esta pergunta: existe uma maneira de lidar com o evento depois que um arquivo JavaScript incluído dinamicamente é carregado? O protótipo possui document.observe
para eventos em todo o documento. Exemplo:
document.observe("dom:loaded", function() {
// initially hide all containers for tab content
$$('div.tabcontent').invoke('hide');
});
Quais são os eventos disponíveis para um elemento de script?
fonte
Respostas:
Você pode escrever tags de script dinâmicas (usando Prototype ):
O problema aqui é que não sabemos quando o arquivo de script externo está totalmente carregado.
Muitas vezes queremos nosso código dependente na linha seguinte e gostamos de escrever algo como:
Existe uma maneira inteligente de injetar dependências de script sem a necessidade de retornos de chamada. Você simplesmente precisa extrair o script por meio de uma solicitação AJAX síncrona e avaliar o script em nível global.
Se você usar Prototype, o método Script.load será semelhante a este:
fonte
http://web.archive.org/web/20140905044059/http://www.howtocreate.co.uk/operaStuff/userjs/aagmfunctions.js
)web.archive.org
.Não há importação / inclusão / exigência em javascript, mas existem duas maneiras principais de conseguir o que você deseja:
1 - Você pode carregá-lo com uma chamada AJAX e usar eval.
Essa é a maneira mais direta, mas está limitada ao seu domínio devido às configurações de segurança do Javascript, e o uso do eval está abrindo as portas para bugs e hacks.
2 - Adicione uma tag de script com a URL do script no HTML.
Definitivamente o melhor caminho a percorrer. Você pode carregar o script mesmo de um servidor externo e ele fica limpo quando você usa o analisador de navegador para avaliar o código. Você pode colocar a tag no cabeçalho da página da web ou na parte inferior do corpo.
Ambas as soluções são discutidas e ilustradas aqui.
Agora, há um grande problema que você deve conhecer. Isso implica que você carrega o código remotamente. Navegadores modernos carregam o arquivo e continuam executando o script atual, porque carregam tudo de forma assíncrona para melhorar o desempenho.
Isso significa que, se você usar esses truques diretamente, não poderá usar seu código recém-carregado na próxima linha depois de solicitar que ele seja carregado, porque ainda estará carregando.
EG: my_lovely_script.js contém MySuperObject
Então você recarrega a página pressionando F5. E funciona! Confuso ...
Então o que fazer sobre isso ?
Bem, você pode usar o hack que o autor sugere no link que eu lhe dei. Em resumo, para pessoas com pressa, ele usa en event para executar uma função de retorno de chamada quando o script é carregado. Assim, você pode colocar todo o código usando a biblioteca remota na função de retorno de chamada. POR EXEMPLO :
Em seguida, você escreve o código que deseja usar APÓS o script ser carregado em uma função lambda:
Então você executa tudo isso:
OK, entendi. Mas é uma dor escrever todas essas coisas.
Bem, nesse caso, você pode usar como sempre a fantástica estrutura gratuita do jQuery, que permite fazer a mesma coisa em uma linha:
fonte
Eu usei uma versão muito menos complicada recentemente com o jQuery :
Funcionou muito bem em todos os navegadores em que o testei: IE6 / 7, Firefox, Safari, Opera.
Atualização: versão sem jQuery:
fonte
$.getScript
. Veja minha resposta.Fiz basicamente a mesma coisa que você fez com Adam, mas com uma ligeira modificação para me certificar de que eu estava anexando à etiqueta para concluir o trabalho. Eu simplesmente criei uma função de inclusão (código abaixo) para lidar com arquivos de script e css.
Essa função também verifica se o script ou o arquivo CSS já não foi carregado dinamicamente. Ele não verifica os valores codificados manualmente e pode ter havido uma maneira melhor de fazer isso, mas serviu ao objetivo.
fonte
outra resposta incrível
https://stackoverflow.com/a/950146/671046
fonte
http://web.archive.org/web/20140905044059/http://www.howtocreate.co.uk/operaStuff/userjs/aagmfunctions.js
)Aqui está um exemplo de código que eu encontrei ... alguém tem uma maneira melhor?
fonte
http://web.archive.org/web/20140905044059/http://www.howtocreate.co.uk/operaStuff/userjs/aagmfunctions.js
)Se você já possui o jQuery carregado, deve usar $ .getScript .
Isso tem uma vantagem sobre as outras respostas aqui, pois você possui uma função de retorno de chamada interna (para garantir que o script seja carregado antes da execução do código dependente) e pode controlar o cache.
fonte
Se você deseja que um script SYNC seja carregado, é necessário adicionar o texto do script diretamente à tag HTML HEAD. Adicioná-lo como acionará uma carga ASYNC . Para carregar o texto do script de um arquivo externo de forma síncrona, use XHR. Abaixo um exemplo rápido (ele usa partes de outras respostas nesta e em outras postagens):
fonte
Eu acho que apenas adicionar o script ao corpo seria mais fácil do que adicioná-lo ao último nó da página. Que tal agora:
fonte
http://web.archive.org/web/20140905044059/http://www.howtocreate.co.uk/operaStuff/userjs/aagmfunctions.js
)Eu usei ainda outra solução que encontrei na rede ... esta está em creativecommons e verifica se a fonte foi incluída antes de chamar a função ...
você pode encontrar o arquivo aqui: include.js
fonte
http://web.archive.org/web/20140905044059/http://www.howtocreate.co.uk/operaStuff/userjs/aagmfunctions.js
)Acabei de descobrir um ótimo recurso no YUI 3 (no momento da redação deste artigo, disponível na versão prévia). Você pode inserir facilmente dependências nas bibliotecas YUI e nos módulos "externos" (o que você está procurando) sem muito código: YUI Loader .
Ele também responde à sua segunda pergunta sobre a função que está sendo chamada assim que o módulo externo é carregado.
Exemplo:
Funcionou perfeitamente para mim e tem a vantagem de gerenciar dependências. Consulte a documentação da YUI para obter um exemplo com o calendário da YUI 2 .
fonte
Há um novo padrão proposto para ECMA chamado importação dinâmica , recentemente incorporado ao Chrome e Safari.
fonte
A técnica que usamos no trabalho é solicitar o arquivo javascript usando uma solicitação AJAX e, em seguida, eval () o retorno. Se você estiver usando a biblioteca de protótipos, eles suportam essa funcionalidade na chamada Ajax.Request.
fonte
O jquery resolveu isso para mim com sua função .append () - usada para carregar o pacote completo da interface do usuário do jquery
Para usar - na cabeça do seu html / php / etc depois de importar o jquery.js, você incluiria apenas esse arquivo para carregar na totalidade da sua biblioteca, anexando-o à cabeça ...
fonte
Mantenha-o agradável, curto, simples e sustentável! :]
Esse código é simplesmente um exemplo funcional curto que pode exigir funcionalidade de recurso adicional para suporte total em qualquer plataforma (ou fornecida).
fonte
A importação de módulo dinâmico chegou ao Firefox 67+ .
Com tratamento de erros:
Também funciona para qualquer tipo de biblioteca que não seja um módulo, neste caso a lib está disponível no objeto window, da maneira antiga, mas somente sob demanda, o que é bom.
Exemplo usando suncalc.js , o servidor deve ter o CORS ativado para funcionar dessa maneira!
https://caniuse.com/#feat=es6-module-dynamic-import
fonte
Existem scripts projetados especificamente para esse fim.
O yepnope.js está embutido no Modernizr e o lab.js é uma versão mais otimizada (mas menos amigável).
Eu não recomendaria fazer isso por meio de uma grande biblioteca como jquery ou protótipo - porque um dos principais benefícios de um carregador de scripts é a capacidade de carregar scripts mais cedo - você não deve esperar até que o jquery e todos os seus elementos dom sejam carregados antes executando uma verificação para ver se você deseja carregar dinamicamente um script.
fonte
Escrevi um módulo simples que automatiza o trabalho de importar / incluir scripts de módulo em JavaScript. Experimente e poupe algum feedback! :) Para obter uma explicação detalhada do código, consulte esta postagem do blog: http://stamat.wordpress.com/2013/04/12/javascript-require-import-include-modules/
fonte
Estou perdido em todos esses exemplos, mas hoje eu precisava carregar um .js externo do meu .js principal e fiz isso:
fonte
Aqui está um simples, com retorno de chamada e suporte ao IE:
fonte
Sei que minha resposta está um pouco atrasada para esta pergunta, mas aqui está um ótimo artigo em www.html5rocks.com - Mergulhe fundo nas águas turvas do carregamento de scripts .
Nesse artigo, conclui-se que, em relação ao suporte ao navegador, a melhor maneira de carregar dinamicamente o arquivo JavaScript sem bloquear a renderização do conteúdo é a seguinte:
Considerando que você tem quatro scripts nomeados
script1.js, script2.js, script3.js, script4.js
, pode fazê-lo com a aplicação de async = false :Agora, Spec diz : Faça o download em conjunto, execute em ordem assim que o download for feito.
Firefox <3.6, o Opera diz: Não tenho idéia do que é essa coisa de "assíncrono", mas acontece que executo scripts adicionados via JS na ordem em que são adicionados.
O Safari 5.0 diz: Eu entendo "assíncrono", mas não entendo configurá-lo para "falso" com JS. Executarei seus scripts assim que eles chegarem, em qualquer ordem.
O IE <10 diz: Nenhuma idéia sobre "assíncrono", mas existe uma solução alternativa usando "onreadystatechange".
Tudo o resto diz: Eu sou seu amigo, vamos fazer isso conforme as regras.
Agora, o código completo com o IE <10 solução alternativa:
Alguns truques e minificação depois, são 362 bytes
fonte
Algo assim...
fonte
Aqui está um exemplo simples para uma função carregar arquivos JS. Pontos relevantes:
$.ajax
ou$.getScript
você pode usar nonces, resolvendo problemas com o CSPunsafe-inline
. Basta usar a propriedadescript.nonce
Agora você o usa simplesmente
fonte
Um one-liner absurdo, para aqueles que pensam que carregar uma biblioteca js não deve ter mais de uma linha de código: P
Obviamente, se o script que você deseja importar for um módulo, você poderá usar a
import(...)
funçãofonte
Com o Promises, você pode simplificar assim. Função carregador:
Uso (assíncrono / aguardar):
Uso (Promessa):
NOTA: havia uma solução semelhante, mas ela não verifica se o script já está carregado e carrega o script a cada vez. Este verifica a propriedade src.
fonte
todas as principais bibliotecas javascript como jscript, prototype e YUI têm suporte para carregar arquivos de script. Por exemplo, na YUI, depois de carregar o núcleo, você pode fazer o seguinte para carregar o controle de calendário
fonte
Eu ajustei algumas das postagens acima com o exemplo de trabalho. Aqui também podemos fornecer css e js na mesma matriz.
fonte
Para aqueles de vocês que amam one-liners:
Provavelmente, você pode receber um erro, como:
Nesse caso, você pode fazer o fallback para:
fonte