O que significa uma tag de script com conteúdo src AND?

122

Exemplo do botão +1 do Google:

<script type="text/javascript" src="https://apis.google.com/js/plusone.js">
      {"parsetags": "explicit"}
</script>

A tag do script possui um atributo src e conteúdo. O que isso significa e como funciona?

usr
fonte
Firebug Lite usa este método: getfirebug.com/firebuglite
Brad

Respostas:

71

Navegadores diferentes tratam isso de maneira diferente. Alguns executam o conteúdo apenas se ele srcestiver incluído sem erros. Alguns o executam após tentar incluir o srcscript, independentemente do sucesso. Como esse comportamento não é confiável (e é proibido no HTML5 ), ele deve ser evitado.

O Google não está confiando em nenhum comportamento específico. Como o conteúdo é apenas um objeto literal (um valor), sua execução não faria nada além de causar um erro silencioso. O código do Google analisa o conteúdo da scriptprópria tag e ajusta seu comportamento com base nisso.

Jeremy Banks
fonte
2
Existe uma maneira mais inteligente de o script examinar o conteúdo de sua própria tag de script (especificamente), do que passar pelo DOM?
Karl Knechtel
11
Em todos os navegadores com os quais trabalhei, o conteúdo do script nunca será executado se o srcatributo estiver presente e, na verdade, não for um objeto literal, esse código produziria um SyntaxErrorse executado, é simplesmente "texto JSON" que o script usará por si só mais tarde.
CMS
2
O @Karl usado em um arquivo .js externo, fornece o conteúdo do nó <script> em execução no momento: s=document.getElementsByTagName('script'); text = s[s.length-1].innerHTML; acho que não há maneira de buscar o conteúdo de um nó de script que não envolva tocar no DOM .
precisa
O @CMS funciona em todos os navegadores, exceto o IE. Você pode vê-lo aqui
Jose Faeti
1
@ jose - seu exemplo não é o que o CMS estava se referindo. Se o código for executado como uma instrução autônoma, é um erro de sintaxe. Seu exemplo (e do Google) "funciona" apenas porque o conteúdo do elemento de script é ignorado devido ao atributo src .
RobG 25/10
23

Se um elemento de script tiver um atributo src , o conteúdo deverá ser ignorado, qualquer outro comportamento não será conforme.

Nos blogs (como um hack), foi sugerido colocar o conteúdo no elemento, sabendo que ele não será avaliado. Em seguida, use os métodos DOM para obter o conteúdo como uma string e avaliá- lo ou inseri-lo em um novo elemento de script. Nenhuma dessas é uma boa ideia.

RobG
fonte
4
Por que isso não é uma boa ideia? E se for usado para inicializar um plug-in de terceiros?
thekingoftruth
13

De acordo com a especificação de rascunho do HTML5 , os <script>elementos com srcatributos devem ter apenas código comentado, cujo objetivo é fornecer documentação para o script. No entanto, não parece que o Google esteja em conformidade com esta especificação.

Jim
fonte
13

Após o carregamento do script, ele procura dentro de sua própria tag de script para acessar seu conteúdo.

Ele usará algum código semelhante a este:

var scripts = document.getElementsByTagName("script");
var data = eval(scripts[scripts.length - 1].innerHTML);

Cortesia de John Resig .

James Billingham
fonte