Pergunta

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?

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

Foi útil?

Solução

A especificação XHTML 1 diz:

C.3.Minimização de elementos e conteúdo de elementos vazios

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 a forma minimizada (por exemplousar <p> </p> e não <p />).

XHTML-DTD especifica elementos de script como:

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

Outras dicas

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

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

De w3:

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

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

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

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

Caso alguém esteja curioso, o motivo final é que o HTML era originalmente um dialeto do SGML, que é o estranho irmão mais velho do XML.No SGML-land, os elementos podem ser especificados no DTD como de fechamento automático (por exemplo,BR, HR, INPUT), implicitamente fecháveis ​​(por exemplo,P, LI, TD) ou explicitamente fechável (por exemploTABELA, DIV, SCRIPT).É claro que XML não tem conceito disso.

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

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

...é interpretado pelo navegador como:

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

...que é a receita para um adorável bug obscuro que pode causar ataques ao tentar codificar no DOM.

Outros responderam "como" e citaram especificações.Aqui está a verdadeira história de "por que não <script/>", depois de muitas horas pesquisando relatórios de bugs e listas de discussão.


HTML4

HTML 4 é baseado em SGML.

SGML tem alguns tags curtas, como <BR//, <B>text</>, <B/text/, ou <OL<LI>item</LI</OL>.XML assume a primeira forma, redefine o final como ">" (SGML é flexível), de modo que se torna <BR/>.

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

Obviamente, isso é incompatível com XHTML e vai quebrar muitos sites (quando os navegadores estavam maduros o suficiente importar-se sobre isso), então ninguém implementou shorttags e a especificação desaconselha-os.

Efetivamente, todas as tags auto-terminadas 'funcionais' são tags com tag final opcional em analisadores tecnicamente não conformes e são de fato inválidas.Foi o W3C que inventei esse hack para ajudar na transição para XHTML, tornando-o Compatível com HTML.

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

A tag "auto-terminação" é um hack no HTML 4 e não tem sentido.


HTML5

HTML5 tem cinco tipos de tags e apenas as tags 'void' e 'foreign' são permitido fechar automaticamente.

Porque <script> não é vazio (é poderia tem conteúdo) e não é estrangeiro (como MathML ou SVG), <script> não pode ser fechado automaticamente, independentemente de como você o usa.

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

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 se preocupa principalmente em documentar e unir as implementações.(Isso é por que <br/> <hr/> etc.são HTML 5 válido apesar de ser HTML4 inválido.)

Fechamento automático <script> é uma das tags onde as implementações costumavam diferir.Isto costumava funcionar no Chrome, Safari, e ópera;que eu saiba, nunca funcionou no Internet Explorer ou no Firefox.

Isso foi discutido quando o HTML 5 estava sendo elaborado e foi rejeitado porque rompe navegador compatibilidade.As páginas da Web com tags de script de fechamento automático podem não ser renderizadas corretamente (se for o caso) em navegadores antigos.Havia outras propostas, mas também não conseguem resolver o problema de compatibilidade.

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

Fechamento automático <script> não acontece no HTML 5 devido à compatibilidade com versões anteriores do HTML 4 e XHTML 1.


XHTML 1 / XHTML 5

Quando realmente serviu como XHTML, <script/> está realmente fechado, como outras respostas declararam.

Exceto aquilo a especificação diz isto deve funcionaram quando servidos como HTML:

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

Então o que aconteceu?

Pessoas perguntou Mozilla para deixe o Firefox analisar documentos conformes como HTML independentemente do cabeçalho de conteúdo especificado (conhecido como detecção de conteúdo).Isso teria permitido scripts de fechamento automático e detecção de conteúdo foi necessário de qualquer maneira, porque os web hosters não eram maduros o suficiente para servir o cabeçalho correto;Ou seja, era bom nisso.

Se o primeira guerra de navegadores não terminou com o IE 6, o XHTML também pode estar na lista.Mas acabou.E IE 6 tem um problema com XHTML.Na verdade, ou seja não apoiou o tipo MIME correto de forma alguma, forçando todos usar text/html para XHTML porque IE tinha grande participação de mercado durante uma década inteira.

E também detecção de conteúdo pode ser muito ruim e as pessoas estão dizendo deveria ser interrompido.

Finalmente, verifica-se que o W3C não significava que o XHTML fosse detectável:o documento é ambos, HTML e XHTML, e Content-Type regras.Pode-se dizer que eles permaneceram firmes em "basta seguir nossas especificações" e ignorando o que era prático.Um erro que contínuo em versões XHTML posteriores.

De qualquer forma, esta decisão resolveu o assunto para Firefox.Passaram-se 7 anos antes do Chrome nasceu;não havia outro navegador significativo.Assim foi decidido.

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

O Internet Explorer 8 e versões anteriores não oferecem suporte à 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 é simplesmente ignorada, você deve usar uma tag de fechamento explícita.

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

As pessoas acima já explicaram bastante o problema, mas uma coisa que pode deixar as coisas claras é que, embora as pessoas usem <br/> e isso o tempo todo em documentos HTML, qualquer / em tal posição é basicamente ignorado e usado apenas ao tentar tornar algo analisável como XML e HTML.Tentar <p/>foo</p>, por exemplo, e você obtém um parágrafo normal.

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:o <link> tag, e pode ser auto-fechado.Já é usado para incluir folhas de estilo, RSS e feeds de átomos, URIs canônicos e todos os tipos de outros presentes.Por que não JavaScript?

Se você deseja que a tag script seja auto-incluída, 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 vincular ao seu JavaScript, fornecendo a ele um tipo de text/javascript e rel como script, algo como abaixo:

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

Ao contrário do XML e do XHTML, o HTML não tem conhecimento da sintaxe de fechamento automático.Os 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 pensa que a tag está 'aberta'.

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

O Internet Explorer 8 e versões anteriores não suportam o tipo MIME adequado para XHTML, application/xhtml+xml.Se você estiver servindo XHTML como text/html, que você precisa para que essas versões mais antigas do Internet Explorer façam alguma coisa, ele será interpretado como HTML 4.01.Você só pode usar a sintaxe curta com qualquer elemento que permita a omissão da tag de fechamento.Veja o Especificação HTML 4.01.

O 'formato abreviado' do XML é interpretado como um atributo chamado /, que (porque não há sinal de igual) é interpretado como tendo um valor implícito de "/".Isto é 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 suporta XHTML 5 servido com application/xhtml+xml.

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

Em um Documento HTML - ELEMENTOS VAZIOS não preciso de uma "etiqueta de fechamento"!

Em xhtml, tudo é genérico, portanto todos precisam terminação por exemplo.uma “etiqueta de fechamento”;Incluindo br, uma simples quebra de linha, como <br></br> ou seu forma abreviada <br />.

No entanto, um elemento de script nunca é um elemento vazio ou paramétrico, porque etiqueta 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 terminação semântica, por exemplo, uma "tag de fechamento" só é necessária para processar instruções cuja semântica não pode ser encerrada por uma tag seguinte.Por exemplo:

<H1> a semântica não pode ser encerrada por um seguinte <P> porque ele não carrega semântica própria suficiente para substituir e, portanto, encerrar o conjunto de instruções H1 anterior.Embora seja capaz de quebrar o fluxo em uma nova linha de parágrafo, não é "forte o suficiente" para substituir o tamanho da fonte e o estilo da altura da linha atuais derramando no riacho, ou seja, vazando de H1 (porque P não o possui).

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

Um genérico sem descrição terminação Tag como < />, teria sido suficiente para qualquer queda única da cascata encontrada, por exemplo: <H1>Title< /> mas nem sempre é esse o caso, porque também queremos ser capazes de "aninhar" múltiplas marcações intermediárias do Stream:dividido em torrentes antes de envolver/cair em outra cascata.Como consequência, um terminador genérico como < /> não seria capaz de determinar o destino de uma propriedade a ser encerrada.Por exemplo: <b>audacioso <i>negrito itálico < /> itálico </>normal.Sem dúvida não conseguiríamos acertar a nossa intenção e muito provavelmente a interpretaríamos como audacioso negrito-itálico audacioso normal.

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

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

Como com CSS você pode facilmente substituir o comportamento nativo pré e depois do BR de um DIV recém-inventado, ele é frequentemente chamado de "contêiner de não fazer nada".O que é naturalmente errado!DIVs são elementos de bloco e quebrarã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 o é.

A chegada do CSS com sua capacidade de substituir 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 pareciam obsoletas, foram desfiguradas, despojadas de todo o seu significado, identidade e propósito originais.De alguma forma, você teria a impressão de que eles não são mais necessários.Ditado:Uma única tag container-wrapper seria suficiente para toda a apresentação de dados.Basta adicionar os atributos necessários.Por que não ter tags significativas?Invente nomes de tags conforme você avança e deixe o CSS se preocupar com o resto.

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

O objetivo do HTML é para transmitir dados significativos para o destinatário humano.

Para entregar informações.

A parte formal existe apenas para auxiliar na clareza da entrega das informações.xhtml não dá a menor consideração às informações.- Para ele a informação é absolutamente irrelevante.

O mais importante na questão é saber e ser capaz de compreender que xhtml não é apenas uma versão de algum HTML estendido, xhtml é uma fera completamente diferente;fundamenta;e portanto é aconselhável mantê-los separados.

A diferença entre 'verdadeiro XHTML', 'falso XHTML' e HTML, bem como a importância do tipo MIME enviado pelo servidor foram já descrevi aqui bem.Se você quiser experimentar agora mesmo, aqui está um trecho editável simples com visualização ao vivo, incluindo tag de script fechada automaticamente para navegadores compatíveis:

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ê deveria ver Hello, true XHTML. Nice to meet you! abaixo da área de texto.

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top