tag de script criar com innerHTML de uma div não funciona

aqui vai o código js

var wrap = document.createElement("div"); wrap.innerHTML = ''; var wrapscript = wrap.childNodes[0]; document.body.appendChild(wrapscript) 

o corpo inseriu o elemento script, mas o recurso js não foi carregado, nem mesmo o pedido http …

quem pode me dizer por que ~~

o problema vai com o método $ do Zeptojs

 $('').appendTo($("bdoy")) 

funciona como o código acima, e causa o bug

Este foi trivial.

Conforme indicado na especificação ( 8.4 Analisando fragments HTML e 8.2.3.5 Outros sinalizadores de estado de análise ), citação:

ao usar innerHTML o navegador

  1. Crie um novo nó Documento e marque-o como sendo um documento HTML.

  2. Se houver um elemento de contexto e o Documento do elemento de contexto estiver no modo quirks, deixe o documento no modo quirks. Caso contrário, se houver um elemento de contexto e o Documento do elemento de contexto estiver no modo quirks limitado, deixe o Documento no modo de quirks limitados. Caso contrário, deixe o documento no modo sem quirks.

  3. Crie um novo analisador de HTML e associe-o ao recém-criado nó Document. …

e ao analisar um dentro

O sinalizador de script é definido como "ativado" se o script foi ativado para o documento com o qual o analisador está associado quando o analisador foi criado e "desativado" caso contrário.

O sinalizador de script pode ser ativado mesmo quando o analisador foi originalmente criado para o algoritmo de análise de fragment de HTML, mesmo que os elementos de script não sejam executados nesse caso.

Portanto, ele não será executado, contanto que você injete com innerHTML .

E usar innerHTML impedirá que o elemento criado seja executado permanentemente.

Conforme indicado na especificação ( 4.3.1 O elemento script ), citação:

Alterar o atributo src, type, charset, async e adiar dinamicamente não tem efeito direto; esses atributos são usados ​​apenas em horários específicos descritos abaixo.

Concluindo o descrito abaixo é que, apenas analisar o atributo src ao injetar o para o document (não importa qual, incluindo o temporário criado ao usar innerHTML .)

Portanto, desde que você deseje injetar um script no documento e executá-lo, será necessário usar script = document.createElement('script') .

Defina seus atributos como src e type , possivelmente o conteúdo interno (usando script.appendChild(document.createTextNode(content)) ) e, em seguida, anexe-o ao document.body .

Você pode tentar isso:

 var wrap = document.createElement('div'); var scr = document.createElement('script'); scr.src = scriptUrl; scr.type = 'text/javascript'; wrap.appendChild(scr); document.body.appendChild(wrap); 

Ao criar explicitamente a tag do script, você está dizendo ao JS que o innerHTML não é um texto, mas sim um script executável.

Uma solução possível, quando você não tem controle sobre o mecanismo de inserção e é forçado a usar innerHTML com beacons de script , é reconstruir nós DOM dos “fantasmas”.

Esse é um problema recorrente na indústria de tecnologia de anúncios, em que muitos sistemas automatizados duplicam código HTML arbitrário (também conhecido como adservers ^^).

funciona bem no Chrome:

 var s = wrap.getElementsByTagName('script'); for (var i = 0; i < s.length ; i++) { var node=s[i], parent=node.parentElement, d = document.createElement('script'); d.async=node.async; d.src=node.src; parent.insertBefore(d,node); parent.removeChild(node); } 

(você pode testá-lo no JSFiddle )