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

1346

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).

dimarzionista
fonte
12
Funciona no Chrome e Opera
corymathews
46
Algumas versões recentes do Chrome parecem ter quebrado isso, as tags de script de fechamento automático não funcionam mais no Chrome
Adam Ness
13
Não são apenas tags de script. Também não acredito que as tags div de fechamento automático funcionem.
DOK
6
Em julho de 2011, o Chrome e o Firefox têm esse problema. "Não é um bug, é um recurso" - realmente irritante.
Martin Konicek
4
A versão mais geral disso foi perguntada dois dias depois: stackoverflow.com/questions/97522/…
Ciro Santilli escreveu

Respostas:

481

A especificação XHTML 1 diz:

С.3. Minimização de elemento e conteúdo de 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 a forma minimizada (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)>
esquadrão
fonte
111
Ainda assim, “não” não é o mesmo que “não deve”. Esta é uma diretriz (para compatibilidade, conforme sugerido pelo título da seção), não uma regra.
21978 Konrad Rudolph
42
Na verdade, não consigo encontrar nenhum uso para essa restrição :) Parece completamente artificial.
squadette
22
A resposta certa foi dada por olavk. O Apêndice C do XHTML 1.0 não é a razão pela qual as coisas são do jeito que são - é apenas como solucionar o problema.
hsivonen 9/10/08
32
Não é uma parte normativa da especificação. É apenas um apêndice sobre como lidar com navegadores que não suportam XHTML
Kornel
12
O problema com <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.
28411 Joe
241

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+xmltext/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 :

Em resumo, 'application / xhtml + xml' DEVE ser usado para documentos da família XHTML, 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 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 atrás, e a única solução viável (compatível com FF3 + e IE7) era usar a <script></script>sintaxe antiga com text/html(sintaxe HTML + mimetipo HTML).

Se o servidor enviar o text/htmltipo 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-equivmeta-elementos, o prólogo ou o tipo de documento XML dentro do documento - o Firefox ramifica assim que obtém o text/htmlcabeçalho, que determina se o analisador de HTML ou XML olha dentro do documento e o analisador de HTML não entende <script />.

joelhardi
fonte
3
É correto concluir que, se você abandonar o suporte ao IE7, o envio de text / xml fornecerá amplo suporte ao navegador para <script />?
Chris Moschini
7
Portanto, em resumo, <script /> funcionará apenas se o seu tipo MIME da página for xhtml / xml. Para páginas regulares de texto / html, não funcionará. E se tentarmos usar o tipo MIME "xhtml / xml", isso quebrará a compatibilidade do IE. Para resumir, Mantenha a calma e Uso <script> ... </ script> Graças Joe ;-)
Navin Israni
1
Excelente explicação. Outro ponto digno de nota é que o Firefox também terá .htmlarquivos 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.
alecov
@ChrisMoschini. Provavelmente, mas use application/xhtml+xml, não text/xml.
TRIG
167

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 ...

<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 problemas quando você tenta codificar no DOM.

gritar
fonte
4
Estou curioso. por que o navegador escolhe interpretá-lo dessa maneira?
Ahmed Aeon Axan
32
@AhmedAeonAxan: o Pelemento não pode conter DIVelementos (este é HTML inválido); portanto, o navegador fecha implicitamente o Pelemento (definido como "implicitamente fechado") antes da DIVtag de abertura . No entanto, os navegadores tendem a se comportar de maneira diferente a esse respeito (como podem acontecer com qualquer HTML inválido).
precisa
5
@ColeJohnson Não, isso não é sopa de etiquetas; greim está atrapalhando a fronteira entre HTML válido e inválido. Sopa de tags é o que você obtém quando os autores não se importam com as regras, porque os navegadores usam a correção de erros. Uma </p>tag final ausente, por outro lado, faz parte da definição de HTML!
Sr. Lister
3
@MrLister - Mais ou menos. "Sopa de tags" descreve como o HTML é analisado, não como é criado. Era um termo usado para descrever estratégias diferentes que os navegadores usavam para entender o HTML e contrasta com a análise estrita de XML. A análise de XML é permitida apenas para tipos de mime XML, mas, como esses nunca atingiram o uso generalizado, os navegadores voltaram a vários esquemas de "sopa de tags", mesmo para documentos válidos.
greim
8
Na verdade, o HTML5 padronizou a análise da 'sopa de tags', incluindo uma maneira consistente de lidar com a marcação inválida. Até então, os navegadores tinham que descobrir o que fazer com a marcação inválida por conta própria, causando inconsistências. O analisador de HTML nos navegadores atuais é um dos mais avançados softwares já escritos. Incrivelmente rápido e pode lidar com quase todas as informações, produzindo resultados consistentes.
Stijn de Witt
161

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:

Os 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?

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/htmlpara 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-Typeregras. 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.

Sheepy
fonte
1
@AndyE Quando você escreve <script> de fechamento automático, os principais navegadores da época não acham que ele está fechado e analisam o html subsequente como javascript, causando a quebra de HTML5 válido nesses navegadores antigos. Assim, a proposta é rejeitada. Isso é explicado na lista de correspondência HTML5 vinculada.
Sheepy
2
@ Andy: O que você está descrevendo é compatibilidade direta - a capacidade do código antigo de trabalhar com o novo compilador / intérprete / analisador. Compatibilidade com versões anteriores é a capacidade do novo código funcionar com o compilador / interpretador / analisador antigo. Portanto, sim, a compatibilidade com versões anteriores era o problema, caso contrário, as páginas escritas com as novas especificações em mente não funcionariam em navegadores antigos (e sim, é uma tradição da programação da Web tentar fazer com que o novo código funcione o máximo possível em navegadores antigos).
Slebetman
3
@Dmitry A realidade é que não permitir scripts fechados é uma via de mão única. Como vinculado , o <script> fechado automaticamente quebrará todos os navegadores, os usuários simplesmente verão a página em branco - consoles de jogos, TV na Internet, o IE 11 no novo PC corporativo Win7, milhões de tempo de execução Java ou bilhões de smartphones. Você pode atualizar a maioria dos WebView da maioria dos idiomas na maioria dos dispositivos? Se o HTML5 tentasse, eles teriam falhado como o XHTML2.
Sheepy 27/04/16
6
resposta muito subestimada
Kamil Tomšík
2
Um pouco de correção: as tags que parecem funcionar como fechadas automaticamente em HTML não são aquelas com tags finais opcionais , mas com tags finais proibidas (tags vazias ou nulas). Tags com tags finais opcionais , como <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.
Ilya Streltsyn
44

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!

JacquesB
fonte
9
"O IE não suporta a análise XHTML." era verdadeiro para as versões do IE no momento em que foi escrito, mas não é mais verdadeiro.
EricLaw
@ EricLaw, você pode esclarecer qual versão do IE corrigiu isso? (e quaisquer condições específicas - por exemplo, tipo de documento válido)
scunliffe
2
O @scunliffe IE9 foi a primeira versão com suporte completo para XHTML. blogs.msdn.com/b/ie/archive/2010/11/01/…
EricLaw
28

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.

Marijn
fonte
22

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 possui uma excelente tag para incluir referências a recursos externos: a <link>tag e pode ser fechada automaticamente. Ele já é usado para incluir folhas de estilo, feeds RSS e Atom, URIs canônicos e todos os tipos de outras guloseimas. Por que não JavaScript?

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:

<link type="text/javascript" rel ="script" href="/path/tp/javascript" />
defau1t
fonte
4
Eu gosto disso, por que não é "inteligente"?
18713 Josh M.
5
Como existe uma tag de script predefinida para executar exatamente o trabalho de carregar um script. Por que você confunde os assuntos usando outra coisa? Um martelo martela pregos. Seria inteligente usar um sapato?
Dave Lawrence
8
@daveL - E temos <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.
Jimbo Jonny
20

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 /="/">.

rpetrich
fonte
33
Por mais elegante que seja essa explicação, ela está de fato errada. Se fosse verdade, haveria um atributo "/" para o elemento de script no DOM. Eu verifiquei o IE, Firefox e Opera, e nenhum deles realmente contém esse atributo.
Alohci
11
/ não é um caractere de nome de atributo válido, portanto é descartado. Caso contrário, essa explicação é bastante clara.
hallvors - restore Monica
1
Na verdade, alguns analisadores de HTML (e especialmente validadores) podem interpretar isso /como parte da construção da NET (Null End Tag).
IllidanS4 quer Monica de volta 07/07
18

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 como text/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.

Mike Dimmick
fonte
O IE 9 suporta XHTML e o IE não é mais> 51%. Você poderia atualizar sua resposta?
Damian Yerrick
5

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.

Bekim Bacaj
fonte
3

A diferença entre 'XHTML verdadeiro', 'XHTML falso' e HTML, bem como a importância do tipo MIME enviado pelo servidor 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:

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 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 ( .xhtmlou .xht) ( obrigado Alek por esta dica ).

meu f
fonte