it-swarm-pt.tech

Por que os elementos de script de fechamento automático não funcionam?

Qual é a razão pela qual os navegadores não reconhecem corretamente:

<script src="foobar.js" /> <!-- self-closing script element -->

Só isso é reconhecido:

<script src="foobar.js"></script>

Isso quebra o conceito de suporte XHTML?

Nota: Esta declaração está correta pelo menos para todos IE (6-8 beta 2).

1247
dimarzionist

A especificação XHTML 1 diz:

Minimização do Elemento С.3 e Conteúdo do Elemento Vazio

Dada uma instância vazia de um elemento cujo modelo de conteúdo não é EMPTY (por exemplo, um título ou parágrafo vazio) não use o formulário minimizado (por exemplo, use <p> </p> e não <p />).

XHTML DTD especifica elementos de script como:

<!-- script statements, which may include CDATA sections -->
<!ELEMENT script (#PCDATA)>
456
squadette

Para adicionar ao que Brad e o squadette disseram, a sintaxe XML de fechamento automático <script /> na verdade é XML correta, mas para que isso funcione na prática, sua web O servidor também precisa enviar seus documentos como XML adequadamente formado com um tipo MIME XML como application/xhtml+xml no cabeçalho HTTP Content-Type (e não como text/html).

No entanto, o envio de um tipo MIME XML fará com que suas páginas não sejam analisadas pelo IE7, que só gosta de text/html.

De w :

Em resumo, 'application/xhtml + xml' DEVE ser usado para documentos XHTML Family, e o uso de 'text/html' DEVE ser limitado a documentos XHTML 1.0 compatíveis com HTML. 'application/xml' e 'text/xml' também pode ser usado, mas sempre que apropriado, 'application/xhtml + xml' deve ser usado em vez dos tipos de mídia XML genéricos.

Fiquei intrigado com isso há alguns meses, e a única solução viável (compatível com FF3 + e IE7) era usar a antiga sintaxe <script></script> com text/html (sintaxe HTML + tipo MIME HTML).

Se o seu servidor envia o tipo text/html em seus cabeçalhos HTTP, mesmo com documentos XHTML corretamente formados, o FF3 + usará seu modo de renderização HTML, o que significa que <script /> não funcionará (isto é uma mudança, o Firefox era menos rígido).

Isso acontecerá independentemente de qualquer mexer com elementos meta http-equiv, o prólogo ou doctype XML dentro de seu documento - o Firefox ramifica assim que obtém o cabeçalho text/html, que determina se o analisador HTML ou XML procura dentro do documento e o analisador HTML não entenda <script />.

225
joelhardi

Caso alguém esteja curioso, o motivo final é que o HTML era originalmente um dialeto do SGML, que é o irmão mais velho do XML. Em terrenos SGML, os elementos podem ser especificados na DTD como fecho automico (por exemplo, BR, HR, INPUT), fechais implicitamente (por exemplo, P, LI, TD) ou explicitamente aproximais (por exemplo, TABLE, DIV, SCRIPT). XML, claro, não tem noção disso.

Os analisadores de tag-soup usados ​​pelos navegadores modernos evoluíram a partir desse legado, embora seu modelo de análise não seja mais puro. E, claro, seu XHTML cuidadosamente elaborado está sendo tratado como uma tag-soup inspirada em SGML, a menos que você a envie com um tipo de mime XML. É também por isso que ...

<p><div>hello</div></p>

... é interpretado pelo navegador como:

<p></p><div>hello</div><p></p>

... qual é a receita para um belo bug obscuro que pode colocá-lo em ataques quando você tenta codificar o DOM.

150
greim

Outros responderam "como" e citado spec. Aqui está a verdadeira história de "por que não <script/>", depois de muitas horas se aprofundando em relatórios de bugs e listas de discussão.


HTML 4

O HTML 4 é baseado em SGML .

O SGML tem algumas tags , como <BR//, <B>text</>, <B/text/ ou <OL<LI>item</LI</OL>. O XML assume o primeiro formato, redefine o final como ">" (o SGML é flexível), de modo que se torna <BR/>.

No entanto, HTML não redefiniu, então <SCRIPT/> deve significar<SCRIPT>>.
(Sim, o '>' deve fazer parte do conteúdo, e a tag ainda está não fechada.)

Obviamente, isso é incompatível com XHTML e irá quebrar muitos sites (quando os navegadores já estavam maduros o suficiente para cuidarsobre isso ), so ninguém implementou shorttags e a especificação aconselha contra eles .

Efetivamente, todas as tags self-ended 'working' são tags com tag final opcional em parsers tecnicamente não-conformes e são de fato inválidas. Foi W3C que surgiu com este hack para ajudar na transição para XHTML tornando-o compatível com HTML .

E a tag final do <script> é não opcional .

A tag "Self-ending" é um hack em HTML 4 e não tem sentido.


HTML 5

O HTML5 possui cinco tipos de tags e somente tags 'void' e 'foreign' são com permissão de fechamento automático .

Como <script> não é vazio (ele pode ter conteúdo) e não é estrangeiro (como MathML ou SVG), <script> não pode ser auto-fechado, independentemente de como você o utiliza.

Mas por que? Eles não podem considerá-lo estrangeiro, fazer caso especial ou algo assim?

O HTML 5 pretende ser compatível com versões anteriores com implementações de HTML 4 e XHTML 1. Não é baseado em SGML ou XML; sua sintaxe está principalmente relacionada à documentação e à união das implementações. (É por isso que <br/><hr/> etc. são HTML5 válido apesar de serem inválidos HTML4.)

O fechamento automático <script> é uma das tags nas quais as implementações costumavam diferir. --- sado para trabalhar no Chrome, Safari , e Opera ; Pelo que sei, nunca funcionou no Internet Explorer ou no Firefox.

Isto foi discutido quando o HTML 5 estava sendo esboçado e foi rejeitado porque quebranavegadorcompatibilidade . Páginas da Web que a tag de script de fechamento automático pode não ser renderizada corretamente (se houver) em navegadores antigos. Houve outras propostas , mas eles não podem resolver o problema de compatibilidade também.

Depois que o rascunho foi lançado, o WebKit atualizou o analisador para estar em conformidade.

Self-closing <script> não acontece em HTML 5 por causa da compatibilidade com HTML 4 e XHTML 1


XHTML 1/XHTML 5

Quando realmente servido como XHTML, <script/> é realmente fechado, como outras respostas declarado.

Exceto que a especificação diz ele deve ter trabalhado quando servido como HTML:

Documentos XHTML ... podem ser rotulados com o tipo de mídia da Internet "text/html" [RFC2854], como eles são compatíveis com a maioria dos navegadores HTML.

Então o que aconteceu?

Pessoas pediu Mozilla para deixe o Firefox analisar documentos conforme XHTML independentemente do cabeçalho do conteúdo especificado (conhecido como conteúdo sniffing ). Isso permitiria que scripts de encerramento automático e sniffing de conteúdo era necessário de qualquer maneira, porque os hosters da Web não estavam maduros o suficiente para servir o cabeçalho correto; IE foi bom nisso .

Se a primeira guerra do navegador não terminar com IE 6, XHTML pode ter estado na lista também. Mas acabou. E IE 6 tem um problema com XHTML. De fato IE não suportava o tipo MIME correto de jeito nenhum , forçando todos para usar text/html para XHTML porque IE teve grande participação de mercado por uma década inteira.

E também conteúdo cheirando pode sermuito ruim e as pessoas estão dizendo deve ser interrompido .

Finalmente, verifica-se que o W3C não significa que XHTML seja sniffable : o documento é ambos , HTML e XHTML, e Content-Type regras. Pode-se dizer que eles estavam firmes em "basta seguir nosso spec" e ignorando o que era prático . Um erro que continuação em versões XHTML posteriores.

De qualquer forma, esta decisão resolvido o assunto para o Firefox. Foi 7 anos antes do Chrome nasce ; não havia outro navegador significativo. Assim foi decidido.

Especificar o tipo de documento sozinho não aciona a análise XML devido às especificações a seguir

139
Sheepy

O Internet Explorer 8 e versões anteriores não suportam a análise XHTML. Mesmo se você usar uma declaração XML e/ou um tipo de documento XHTML, o antigo IE ainda analisará o documento como HTML simples. E, em HTML simples, a sintaxe de fechamento automático não é suportada. A barra final é ignorada, você precisa usar uma tag de fechamento explícita.

Mesmo navegadores com suporte para análise XHTML, como IE 9 e posterior , ainda analisarão o documento como HTML, a menos que você veicule o documento com um tipo de conteúdo XML. Mas, nesse caso, o antigo IE não exibirá o documento.

44
JacquesB

As pessoas acima já praticamente explicaram o problema, mas uma coisa que pode deixar as coisas claras é que, embora as pessoas usem <br/> e tal o tempo todo em documentos HTML, qualquer / em tal posição é basicamente ignorado e usado apenas quando se tenta para fazer algo parseable como XML e HTML. Tente <p/>foo</p>, por exemplo, e você recebe um parágrafo normal.

26
Marijn

A tag de script de fechamento automático não funcionará, porque a tag de script pode conter código embutido e o HTML não é inteligente o suficiente para ativar ou desativar esse recurso com base na presença de um atributo.

Por outro lado, o HTML tem uma excelente tag para incluir referências a recursos externos: a tag <link> e pode ser de fechamento automático. Ele já é usado para incluir folhas de estilo, feeds RSS e Atom, URIs canônicos e todos os tipos de outros itens. Por que não JavaScript?

Se você quiser que a tag de script seja auto fechada, você não pode fazer isso como eu disse, mas existe uma alternativa, embora não seja inteligente. Você pode usar a tag de link de fechamento automático e vinculá-la ao JavaScript, fornecendo um tipo de texto/javascript e rel como script, algo como abaixo:

<link type="text/javascript" rel ="script" href="/path/tp/javascript" />
22
defau1t

Ao contrário de XML e XHTML, o HTML não tem conhecimento da sintaxe de fechamento automático. Navegadores que interpretam XHTML como HTML não sabem que o caractere / indica que a tag deve ser de fechamento automático; em vez disso, eles o interpretam como um atributo vazio e o analisador ainda acha que a tag está "aberta".

Assim como <script defer> é tratado como <script defer="defer">, <script /> é tratado como <script /="/">.

20
rpetrich

O Internet Explorer 8 e versões mais antigas não suportam o tipo MIME adequado para XHTML, application/xhtml+xml. Se você estiver veiculando XHTML como text/html, o que você precisa fazer para essas versões mais antigas do Internet Explorer, será interpretado como HTML 4.01. Você só pode usar a sintaxe curta com qualquer elemento que permita que a tag de fechamento seja omitida. Veja o especificação HTML 4.01 .

A forma abreviada do XML é interpretada como um atributo denominado /, que (porque não há sinal de igual) é interpretado como tendo um valor implícito de "/". Isso é estritamente errado no HTML 4.01 - atributos não declarados não são permitidos - mas os navegadores irão ignorá-lo.

IE9 e posterior suporte XHTML 5 servido com application/xhtml+xml.

18
Mike Dimmick

Isso porque o SCRIPT TAG não é um elemento VOID.

Em um Documento HTML - ELEMENTOS VAZIOS não precisa de uma "tag de fechamento" em tudo!

Em xhtml , tudo é genérico, portanto, todos eles precisam rescisão e. uma "tag de fechamento"; Incluindo br, um simples quebra de linha, como <br></br> ou sua abreviação <br />.

No entanto, um Elemento de Script nunca é um elemento vazio ou paramétrico, porque marca de script antes de mais nada, é uma Instrução do Navegador, não uma declaração de Descrição de Dados.

Principalmente, uma instrução de encerramento semântico, por exemplo, uma "tag de fechamento" é necessária apenas para instruções de processamento, cuja semântica não pode ser terminada por uma tag sucessora. Por exemplo:

A semântica <H1> não pode ser terminada por um <P> seguinte, porque ela não carrega uma quantidade suficiente de sua própria semântica para substituir e, portanto, terminar o conjunto de instruções H1 anterior. Embora seja capaz de quebrar o stream em uma nova linha de parágrafo, ele não é "forte o suficiente" para substituir o tamanho atual da fonte e o estilo de altura da linha abaixo do fluxo , ou seja, vazando de H1 (porque P não tem).

É assim e porque a sinalização "/" (terminação) foi inventada.

Uma Tag de terminação genérica sem descrição como < />, teria bastado para uma única queda da cascata encontrada, por exemplo: <H1>Title< /> mas nem sempre é o caso, porque nós também queremos ser capazes de "aninhamento", múltiplas tags intermediárias do Stream: divididas em torrents antes de serem colocadas em outra cascata. Como conseqüência, um terminador genérico como < /> não seria capaz de determinar o destino de uma propriedade para finalizar. Por exemplo: <b>bold<i> negrito-itálico < /> itálico </>normal. Sem dúvida, falharia em acertar nossa intenção e provavelmente a interpretaria como negrito negrito-itálico negrito normal.

É assim que a noção de um wrapper, ou seja, container nasceu. (Essas noções são tão semelhantes que é impossível discernir e às vezes o mesmo elemento pode ter ambos. <H1> é tanto wrapper quanto container ao mesmo tempo. Considerando <B> apenas um wrapper semântico). Precisamos de um contêiner semântico simples. E, claro, a invenção de um Elemento DIV surgiu.

O elemento DIV é na verdade um contêiner 2BR. É claro que a vinda do CSS tornou toda a situação mais estranha do que teria sido e causou uma grande confusão com muitas grandes consequências - indiretamente!

Como com o CSS você pode facilmente substituir o comportamento nativo de pré e pós-BR de um DIV recém-inventado, ele é frequentemente chamado de "não fazer nada". O que é, naturalmente errado! DIVs são elementos de bloco e dividirão nativamente a linha do fluxo antes e depois da sinalização final. Logo a WEB começou a sofrer com a página DIV-itis. A maioria deles ainda é.

A vinda do CSS com sua capacidade de sobrescrever e redefinir completamente o comportamento nativo de qualquer tag HTML, de alguma forma conseguiu confundir e confundir todo o significado da existência do HTML ...

De repente, todas as tags HTML apareceram como se fossem obsoletas, foram desfiguradas, despojadas de todo o seu significado original, identidade e propósito. De alguma forma você ganha a impressão de que eles não são mais necessários. Dizer: uma única etiqueta de contêiner de contêiner seria suficiente para toda a apresentação de dados. Basta adicionar os atributos obrigatórios. Por que não ter tags significativas? Invente os nomes das tags à medida que você vai e deixe o CSS se incomodar com o resto.

É assim que o xhtml nasceu e, claro, o grande contundente, tão caro pelos recém-chegados e uma visão distorcida do que é o quê, e qual é o maldito propósito de tudo isso. W3C foi da World Wide Web para o que deu errado, camaradas? !!

A finalidade do HTML é transmitir dados significativos para o destinatário humano.

Para entregar informações.

A parte formal serve apenas para ajudar na clareza da entrega de informações. xhtml não dá a menor consideração às informações. - Para isso, a informação é absolutamente irrelevante.

A coisa mais importante na matéria é saber e ser capaz de entender que xhtml não é apenas uma versão de algum HTML estendido, xhtml é uma besta completamente diferente; aterra; e portanto é sábio mantê-los separados.

5
Bekim Bacaj

A diferença entre 'true XHTML', 'faux XHTML' e HTML, bem como a importância do tipo MIME enviado pelo servidor, foram já descrito bem aqui . Se você quiser experimentá-lo agora, aqui está um trecho editável simples com visualização ao vivo, incluindo tag de script auto-fechado para navegadores capazes:

div { display: flex; }
div + div {flex-direction: column; }
<div>Mime type: <label><input type="radio" onchange="t.onkeyup()" id="x" checked  name="mime"> application/xhtml+xml</label>
<label><input type="radio" onchange="t.onkeyup()" name="mime"> text/html</label></div>
<div><textarea id="t" rows="4" 
onkeyup="i.src='data:'+(x.checked?'application/xhtml+xml':'text/html')+','+encodeURIComponent(t.value)"
><?xml version="1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
[<!ENTITY x "true XHTML">]>
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
  <p>
    <span id="greet" swapto="Hello">Hell, NO :(</span> &x;.
    <script src="data:text/javascript,(g=document.getElementById('greet')).innerText=g.getAttribute('swapto')" />
    Nice to meet you!
    <!-- 
      Previous text node and all further content falls into SCRIPT element content in text/html mode, so is not rendered. Because no end script tag is found, no script runs in text/html
    -->
  </p>
</body>
</html></textarea>

<iframe id="i" height="80"></iframe>

<script>t.onkeyup()</script>
</div>

Você deve ver Hello, true XHTML. Nice to meet you! abaixo textarea.

Para navegadores incapazes, você pode copiar o conteúdo da área de texto e salvá-lo como um arquivo com a extensão .xhtml (ou .xht) ( obrigado Alek por essa dica ).

2
myf