Por que os navegadores não reconhecem corretamente:
<script src="foobar.js" /> <!-- self-closing script element -->
Somente isso é reconhecido:
<script src="foobar.js"></script>
Isso quebra o conceito de suporte a XHTML?
Nota: Esta declaração está correta pelo menos para todos os IE (6-8 beta 2).
javascript
html
internet-explorer
xhtml
dimarzionista
fonte
fonte
Respostas:
A especificação XHTML 1 diz:
С.3. Minimização de elemento e conteúdo de elemento vazio
XHTML DTD especifica elementos de script como:
fonte
<script />
isso não é que a especificação não o permita, mas que os navegadores não o interpretem como "non-tag-soup" se o tipo de conteúdo não for application / xhtml + xml. Veja: stackoverflow.com/questions/348736/… @shabunc: os navegadores podem parecer entendê-lo, mas o que realmente está acontecendo é colocar o conteúdo após o <p /> dentro do parágrafo, devido à interpretação da citação do esquadrão, pois desde < p> não está vazio, não pode ser fechado automaticamente. No XHTML 1.1, pode ser fechado automaticamente.Para adicionar o que Brad e esquadrão disseram, a sintaxe XML de fechamento automático é
<script />
realmente o XML correto, mas para que funcione na prática, seu servidor da Web também precisa enviar seus documentos como XML formado corretamente com um tipo de mim XML como no HTTP Cabeçalho do tipo de conteúdo (e não como ).application/xhtml+xml
text/html
No entanto, o envio de um tipo MIME XML fará com que suas páginas não sejam analisadas pelo IE7, que apenas gosta
text/html
.Do w3 :
Fiquei intrigado com isso há alguns meses atrás, e a única solução viável (compatível com FF3 + e IE7) era usar a
<script></script>
sintaxe antiga comtext/html
(sintaxe HTML + mimetipo HTML).Se o servidor enviar o
text/html
tipo em seus cabeçalhos HTTP, mesmo com documentos XHTML adequadamente formados, o FF3 + usará o modo de renderização HTML, o que significa que<script />
não funcionará (isso é uma alteração, o Firefox era anteriormente menos rigoroso).Isso acontecerá independentemente de qualquer alteração nos
http-equiv
meta-elementos, o prólogo ou o tipo de documento XML dentro do documento - o Firefox ramifica assim que obtém otext/html
cabeçalho, que determina se o analisador de HTML ou XML olha dentro do documento e o analisador de HTML não entende<script />
.fonte
.html
arquivos locais renderizados como uma sopa de tags, independentemente das meta tags, por razões semelhantes. Para arquivos XHTML, o Firefox só os renderiza de acordo com o nome.xhtml
.application/xhtml+xml
, nãotext/xml
.Caso alguém esteja curioso, o motivo final é que o HTML era originalmente um dialeto da SGML, que é o irmão mais velho e estranho de XML. Na terra SGML, os elementos podem ser especificados no DTD como fechamento automático (por exemplo, BR, HR, INPUT), fechamento implicitamente (por exemplo, P, LI, TD) ou fechamento explicitamente (por exemplo, TABLE, DIV, SCRIPT). XML, é claro, não tem conceito 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 SGML. E, é claro, seu XHTML cuidadosamente criado 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 que ...
... é interpretado pelo navegador como:
... que é a receita para um adorável bug obscuro que pode causar problemas quando você tenta codificar no DOM.
fonte
P
elemento não pode conterDIV
elementos (este é HTML inválido); portanto, o navegador fecha implicitamente oP
elemento (definido como "implicitamente fechado") antes daDIV
tag de abertura . No entanto, os navegadores tendem a se comportar de maneira diferente a esse respeito (como podem acontecer com qualquer HTML inválido).</p>
tag final ausente, por outro lado, faz parte da definição de HTML!Outros responderam "como" e citaram as especificações. Aqui está a verdadeira história do "por que não
<script/>
", depois de muitas horas pesquisando relatórios de bugs e listas de discussão.HTML 4
O HTML 4 é baseado no SGML .
SGML tem algumas shorttags , tais como
<BR//
,<B>text</>
,<B/text/
, ou<OL<LI>item</LI</OL>
. O XML assume a primeira forma, redefine a finalização como ">" (SGML é flexível), para que se torne<BR/>
.No entanto, o HTML não redefiniu, então
<SCRIPT/>
deve significar<SCRIPT>>
.(Sim, o '>' deve fazer parte do conteúdo e a tag ainda não está fechada.)
Obviamente, isso é incompatível com XHTML e vai quebrar muitos sites (pelos navegadores tempo estavam maduros o suficiente para cuidar sobre isso ), então ninguém implementado shorttags ea especificação aconselha contra eles .
Efetivamente, todas as tags automáticas 'funcionando' são tags com tag final proibida em analisadores tecnicamente não conformes e são de fato inválidas. Foi o W3C que criou esse truque para ajudar na transição para o XHTML, tornando -o compatível com HTML .
E
<script>
a tag final não é proibida .A tag "Auto-terminante" é um hack no HTML 4 e não faz sentido.
HTML 5
O HTML5 possui cinco tipos de tags e somente as tags 'nulas' e 'estrangeiras' podem ser fechadas automaticamente .
Como
<script>
não é nulo ( pode ter 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, fazer um caso especial ou algo assim?
O HTML 5 visa ser compatível com versões anteriores das implementações do HTML 4 e XHTML 1. Não é baseado em SGML ou XML; sua sintaxe está principalmente preocupada em documentar e unir as implementações. É por isso que
<br/>
<hr/>
etc. são HTML 5 válidos, apesar de HTML4 inválido.O fechamento automático
<script>
é uma das tags em que as implementações costumavam diferir. Ele costumava trabalhar no Chrome, Safari , e Opera ; que eu saiba, nunca funcionou no Internet Explorer ou Firefox.Isso foi discutido quando o HTML 5 estava sendo redigido e foi rejeitado porque quebra a compatibilidade do navegador . As páginas da Web que fecham a marca de script podem não ser renderizadas corretamente (se houver) nos navegadores antigos. Havia outras propostas , mas elas também não podem resolver o problema de compatibilidade.
Após o lançamento do rascunho, o WebKit atualizou o analisador para estar em conformidade.
O fechamento automático
<script>
não ocorre 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 afirmaram.Exceto que a especificação diz que deveria ter funcionado quando serviu como HTML:
Então o que aconteceu?
As pessoas pediram à Mozilla que deixasse o Firefox analisar documentos em conformidade como XHTML, independentemente do cabeçalho de conteúdo especificado (conhecido como sniffing de conteúdo ). Isso permitiria scripts de fechamento automático, e o sniffing de conteúdo era necessário de qualquer maneira, porque os hosts da web não eram maduros o suficiente para servir o cabeçalho correto; O IE era bom nisso .
Se a primeira guerra de navegadores não terminou com o IE 6, o XHTML também pode estar na lista. Mas acabou. E o IE 6 tem um problema com o XHTML. Na verdade IE não suportar o tipo MIME correto em tudo , forçando todo mundo a usar
text/html
para XHTML porque o IE realizada grande quota de mercado para toda uma década.E também cheirar conteúdo pode ser muito ruim e as pessoas estão dizendo que deve ser interrompido .
Finalmente, verifica-se que o W3C não XHTML média para ser sniffable : o documento é tanto , HTML e XHTML, e
Content-Type
regras. Pode-se dizer que eles estavam firmes em "basta seguir nossas especificações" e ignorar o que era prático . Um erro que continuou nas versões XHTML posteriores.De qualquer forma, essa decisão resolveu o problema para o Firefox. Foram sete anos antes do Chrome nascer ; não havia outro navegador significativo. Assim foi decidido.
Especificar o doctype sozinho não aciona a análise XML devido às seguintes especificações.
fonte
<p>
ou<li>
, não podem ser "fechadas automaticamente", pois podem ter conteúdo; portanto, o código like<p/>
nada mais é do que uma tag inicial (malformada) e o conteúdo após ela, se permitido neste elemento , acabaria dentro dele.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 IE antigo ainda analisará o documento como HTML simples. E em HTML simples, a sintaxe de fechamento automático não é suportada. A barra à direita é ignorada; você precisa usar uma tag de fechamento explícita.
Mesmo os navegadores com suporte para análise XHTML, como o IE 9 e posterior , ainda analisarão o documento como HTML, a menos que você sirva o documento com um tipo de conteúdo XML. Mas, nesse caso, o IE antigo não exibirá o documento!
fonte
As pessoas acima já explicaram bastante a questão, mas uma coisa que pode esclarecer as coisas é que, embora as pessoas usem
<br/>
isso o tempo todo em documentos HTML, qualquer pessoa/
nessa posição é basicamente ignorada e usada apenas ao tentar fazer algo parseable como XML e HTML. Tente<p/>foo</p>
, por exemplo, e você obtém um parágrafo regular.fonte
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.
Se você deseja que a tag de script seja fechada automaticamente, não pode fazer isso como eu disse, mas existe uma alternativa, embora não seja inteligente. Você pode usar a tag de link com fechamento automático e o link para seu JavaScript, fornecendo um tipo de texto / javascript e rel como script, algo como abaixo:
fonte
<style>
tags, mas usamos tags de link para arquivos CSS externos. Definição da tag de link: "A tag <link> define um link entre um documento e um recurso externo". Parece perfeitamente lógico que a tag do link seja usada para CSS ou JS externo ... é para isso que serve ... vinculação em arquivos externos. note que não estou falando de spec / cross-browserness / etc, estou apenas comentando a natureza lógica do uso de tags de link para trazer CSS e JS ... na verdade, faria muito sentido se desse jeito . Não tenho certeza se o sapato [analogia] se encaixa.Ao contrário de XML e 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 fechada automaticamente; 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 /="/">
.fonte
/
como parte da construção da NET (Null End Tag).O Internet Explorer 8 e versões mais antigas não oferecem suporte ao tipo MIME adequado para XHTML
application/xhtml+xml
,. Se você estiver servindo XHTML comotext/html
, o que você precisa para que essas versões mais antigas do Internet Explorer façam algo, ele 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. Consulte a especificação HTML 4.01 .O XML 'short form' é interpretado como um atributo chamado /, que (porque não há sinal de igual) é interpretado como tendo um valor implícito de "/". Isso está estritamente errado no HTML 4.01 - atributos não declarados não são permitidos - mas os navegadores o ignoram.
O IE9 e mais tarde suportam XHTML 5 veiculados com
application/xhtml+xml
.fonte
Isso porque SCRIPT TAG não é um elemento vazio.
Em um documento HTML - VOID ELEMENTS não precisa de uma "tag de fechamento"!
No xhtml , tudo é genérico, portanto todos precisam ser rescindidos, por exemplo, uma "tag de fechamento"; Incluindo br, uma quebra de linha simples, como
<br></br>
ou sua abreviação<br />
.No entanto, um Elemento de Script nunca é um Elemento nulo ou paramétrico, porque a tag de script antes de qualquer outra coisa é 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 "etiqueta de fechamento" é necessária apenas para processar instruções cuja semântica não pode ser finalizada por uma etiqueta subsequente. Por exemplo:
<H1>
a semântica não pode ser terminada por uma sequência,<P>
porque ela não carrega sua própria semântica para substituir e, portanto, encerrar o conjunto de instruções H1 anterior. Embora seja capaz de dividir o fluxo em uma nova linha de parágrafo, não é "forte o suficiente" para substituir o tamanho da fonte atual e o estilo da altura da linha que escorre pelo fluxo , ou seja, vazando do H1 (porque P não o possui) )É assim que e por que a sinalização "/" (terminação) foi inventada.
Uma tag genérica de terminação sem descrição
< />
, como , seria suficiente para qualquer queda individual da cascata encontrada, por exemplo:<H1>Title< />
mas nem sempre é o caso, porque também queremos ser capazes de "aninhar" várias tags intermediárias do Stream: split em torrents antes de envolver / cair em outra cascata. Como conseqüência, um terminador genérico, como< />
não seria capaz de determinar o destino de uma propriedade a ser finalizada. Por exemplo:<b>
negrito<i>
-itálico< />
itálico</>
normal. Indubitavelmente não conseguiríamos acertar nossa intenção e provavelmente a interpretaria como negrito negrito-itálico negrito normal.Foi assim que nasceu a noção de invólucro, ou seja, recipiente. (Essas noções são tão semelhantes que é impossível discernir e, às vezes, o mesmo elemento pode ter ambos.
<H1>
É ao mesmo tempo invólucro e contêiner. Considerando que<B>
apenas um invólucro semântico). Vamos precisar 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 chegada do CSS tornou toda a situação mais estranha do que seria e causou uma grande confusão com muitas consequências - indiretamente!
Como com o CSS, você pode facilmente substituir o comportamento BR pré e pós-nativo de um DIV recém-inventado, geralmente é chamado de "contêiner" não faça nada ". O que é, naturalmente errado! DIVs são elementos de bloco e quebram 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 chegada do CSS com sua capacidade de substituir e redefinir completamente o comportamento nativo de qualquer Tag HTML, de alguma forma conseguiu confundir e desfocar 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 finalidade originais. De alguma forma, você teria a impressão de que eles não são mais necessários. Dizendo: Uma única tag de empacotador de contêiner seria suficiente para toda a apresentação de dados. Basta adicionar os atributos necessários. Por que não ter tags significativas? Invente os nomes das tags à medida que avança e deixe o CSS se preocupar com o resto.
Foi assim que nasceu o xhtml e, é claro, o grande embotamento, pago com tanto carinho pelos recém-chegados e com uma visão distorcida do que é o quê e do que é o objetivo de tudo. O W3C passou da World Wide Web para O que deu errado, camaradas? !!
O objetivo do HTML é transmitir dados significativos para o destinatário humano.
Para entregar informações.
A parte formal existe para ajudar apenas a clareza da entrega de informações. O xhtml não leva em consideração as informações. - Para isso, a informação é absolutamente irrelevante.
O mais importante é saber e ser capaz de entender que o xhtml não é apenas uma versão de algum HTML estendido ; o xhtml é um animal completamente diferente; fundamentos; e, portanto , é aconselhável mantê-los separados.
fonte
A diferença entre 'XHTML verdadeiro', 'XHTML falso' e HTML, bem como a importância do tipo MIME enviado pelo servidor já foram descritas aqui também . Se você quiser experimentá-lo agora, aqui está um snippet editável simples com visualização ao vivo, incluindo tag de script fechado automaticamente para navegadores capazes:
Você deve ver
Hello, true XHTML. Nice to meet you!
abaixo a área de texto.Para navegadores incapazes, você pode copiar o conteúdo da área de texto e salvá-lo como um arquivo com extensão (
.xhtml
ou.xht
) ( obrigado Alek por esta dica ).fonte
A resposta simplesmente moderna é porque a tag é denotada como obrigatória dessa maneira
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script
fonte