Alguma idéia de por que o trecho de código abaixo não adiciona o elemento de script ao DOM?
var code = "<script></script>";
$("#someElement").append(code);
javascript
jquery
Dan Burzo
fonte
fonte
Respostas:
Vi problemas em que alguns navegadores não respeitam algumas alterações quando você as faz diretamente (o que significa criar o HTML a partir de texto como você está tentando com a tag de script), mas quando você faz isso com comandos internos as coisas vão melhor. Tente o seguinte:
De: JSON para jQuery
fonte
script.type
é desnecessária.$("#someElement")[0].appendChild( script );
A boa notícia é:
Está 100% funcionando.
Basta adicionar algo dentro da tag de script, como
alert('voila!');
. A pergunta certa que você talvez queira fazer, "Por que não a vi no DOM?" .Karl Swedberg fez uma boa explicação para o comentário do visitante no site da API do jQuery . Eu
nãoquero repetir todas as suas palavras, você pode ler diretamenteláaqui (Eu achei difícil de navegar através dos comentários lá) .O próximo passo é resumir as más notícias usando a
.append()
função para adicionar um script.E as más notícias são ..
Você não pode depurar seu código.
Não estou brincando, mesmo se você adicionar uma
debugger;
palavra-chave entre a linha que deseja definir como ponto de interrupção, você acabará recebendo apenas a pilha de chamadas do objeto sem ver o ponto de interrupção no código-fonte (sem mencionar que isso Se a palavra-chave funcionar apenas no navegador da WebKit, todos os outros principais navegadores parecem omitir essa palavra-chave) .Se você entender completamente o que seu código faz, isso será uma pequena desvantagem. Mas se não o fizer, você acabará adicionando uma
debugger;
palavra - chave em todo o lugar apenas para descobrir o que há de errado com o seu (ou o meu) código. De qualquer forma, existe uma alternativa, não esqueça que o javascript pode manipular nativamente o HTML DOM.Gambiarra.
Use javascript (não jQuery) para manipular o DOM HTML
Se você não deseja perder a capacidade de depuração, pode usar a manipulação de DOM HTML nativo em javascript. Considere este exemplo:
Aí está, assim como nos velhos tempos, não é? E não esqueça de limpar as coisas, seja no DOM ou na memória, para todos os objetos referenciados e que não são mais necessários para evitar vazamentos de memória. Você pode considerar este código para limpar as coisas:
A desvantagem desta solução alternativa é que você pode adicionar acidentalmente um script duplicado, e isso é ruim. A partir daqui, você pode imitar levemente a
.append()
função adicionando uma verificação de objeto antes de adicionar e removendo o script do DOM logo após a adição. Considere este exemplo:Dessa forma, você pode adicionar scripts com capacidade de depuração, protegidos da duplicidade de scripts. Este é apenas um protótipo, você pode expandir para o que quiser. Eu tenho usado essa abordagem e bastante satisfeito com isso. Com certeza, nunca usarei o jQuery
.append()
para adicionar um script.fonte
$.getScript
está embutido no jQuery.É possível carregar dinamicamente um arquivo JavaScript usando a função jQuery
getScript
Agora, o script externo será chamado e, se não puder ser carregado, será degradado normalmente.
fonte
eval()
.O que você quer dizer com "não está funcionando"?
O jQuery detecta que você está tentando criar um elemento SCRIPT e executará automaticamente o conteúdo do elemento dentro do contexto global. Você está me dizendo que isso não funciona para você? -
Edit: Se você não está vendo o elemento SCRIPT no DOM (no Firebug, por exemplo) depois de executar o comando, porque o jQuery, como eu disse, executará o código e excluirá o elemento SCRIPT - acredito que os elementos SCRIPT sempre são anexados ao corpo ... mas de qualquer maneira - o posicionamento não tem absolutamente nenhuma influência na execução do código nessa situação.
fonte
Isso funciona:
Parece que o jQuery está fazendo algo inteligente com os scripts, então você precisa acrescentar o elemento html ao invés do objeto jQuery.
fonte
Tente isto pode ser útil:
fonte
Quero fazer a mesma coisa, mas acrescentar uma tag de script em outro quadro!
fonte
O
</script>
literal dentro da string finaliza o script inteiro, para evitar que"</scr" + "ipt>"
possa ser usado.fonte
"\x3cscript\x3e\x3c/script\x3e"
. No XHTML, você só precisa inserir um bloco CDATA comentado.</
que não é permitido. Veja stackoverflow.com/questions/236073/…A adição do sourceURL ao arquivo de script ajudou conforme mencionado nesta página: https://blog.getfirebug.com/2009/08/11/give-your-eval-a-name-with-sourceurl/
fonte
Seu script está em execução, você simplesmente não pode usá
document.write
-lo. Use um alerta para testá-lo e evite usá-lodocument.write
. As instruções do seu arquivo js comdocument.write
não serão executadas e o restante da função será executada.fonte
É isso que eu acho que é a melhor solução. O Google Analytics é injetado dessa maneira.
fonte
Você não precisa do jQuery para criar um elemento DOM do script . Isso pode ser feito com a baunilha ES6 da seguinte forma:
Ele não precisa ser envolvido em um arquivo
Promise
, mas isso permite que você resolva a promessa quando o script é carregado, ajudando a evitar condições de corrida para scripts de longa execução.fonte
Anexe o script ao corpo:
fonte
Outra maneira de fazer isso se você quiser acrescentar código é usar o
document.createElement
método, mas depois usar em.innerHTML
vez de.src
.fonte
Eu tentei isso uma e funciona bem. Apenas substitua o
<
símbolo por isso\x3C
.ou
Você pode testar o código aqui .
fonte
Pode tentar assim
A única razão pela qual você não pode fazer isso
"<script></script>"
é porque a string não é permitida dentro do javascript, porque a camada DOM não pode analisar o que é js e o que é HTML.fonte
Eu escrevi um
npm
pacote que permite pegar uma string HTML, incluindo tags de script e anexá-la a um contêiner durante a execução dos scriptsExemplo:
Encontre-o aqui: https://www.npmjs.com/package/appendhtml
fonte
Basta criar um elemento analisando-o com o jQuery.
Exemplo de trabalho: https://plnkr.co/edit/V2FE28Q2eBrJoJ6PUEBz
fonte