自關閉腳本元素爲什麼不起做用?

瀏覽器沒法正確識別的緣由是什麼: javascript

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

只有這是公認的: css

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

這是否打破了XHTML支持的概念? html

注意:此聲明至少對全部IE(6-8 beta 2)都是正確的。 html5


#1樓

自閉腳本標籤將沒法工做,由於腳本標籤能夠包含內聯代碼,而且HTML不夠靈巧,沒法根據屬性的存在打開或關閉該功能。 java

另外一方面,HTML確實具備出色的標記,能夠包含對外部資源的引用: <link>標記,它能夠是自動關閉的。 它已經包括樣式表,RSS和Atom提要,規範URI以及各類其餘功能。 爲何不使用JavaScript? node

若是您但願腳本標籤是自封閉的,則不能像我所說的那樣進行,可是有一種替代方法,儘管不是明智的選擇。 您可使用自行關閉連接標記,並經過將其指定爲文本/ JavaScript和rel做爲腳本的類型來連接至JavaScript,以下所示: web

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

#2樓

其餘人回答了「如何」並引用了規範。 通過數小時的研究,他們找到了錯誤報告和郵件列表,這是「爲何沒有<script/> 」的真實故事。 windows


HTML 4 瀏覽器

HTML 4基於SGML服務器

SGML有一些shorttags ,如<BR// <B>text</> <B/text/<OL<LI>item</LI</OL> XML採用第一種形式,將結尾從新定義爲「>」(SGML是靈活的),所以它成爲<BR/>

可是,HTML沒有從新定義,所以<SCRIPT/> 應該表示 <SCRIPT>>
(是的,「>」應的內容部分,而且所述標籤還沒有關閉。)

顯然,這與XHTML不兼容,而且破壞許多站點(在瀏覽器足夠成熟時能夠解決 這一問題 ),所以沒有人實現短標籤 ,而且規範不建議這樣作

實際上,全部「有效的」自封尾標籤都是技術上不合格的解析器上帶有禁止的結束標籤的標籤,其實是無效的。 W3C 提出了此hack ,以經過使其與HTML兼容來幫助過渡到XHTML。

而且<script>的end標籤不是禁止的

「 Self-end」標記是HTML 4中的一種hack,沒有意義。


HTML 5

HTML5具備五種類型的標記,而且僅容許「 void」和「 foreign」標記爲自動關閉

由於<script>不是無效的( 可能有內容)而且不是外來的(例如MathML或SVG),因此不管如何使用, <script>都不能自封閉。

但爲何? 他們難道不能認爲它是外國的,特例或其餘東西嗎?

HTML 5旨在與HTML 4和XHTML 1的實現 向後兼容 。它不基於SGML或XML;它不基於SGML或XML。 它的語法主要涉及文檔化和實現統一。 (這就是爲何<br/> <hr/>等儘管是無效的HTML4也有效的HTML 5的緣由 。)

自閉合<script>是實現方式不一樣的標記之一。 它曾經在Chrome,Safari 和Opera中運行 ; 據我所知,它歷來沒有在Internet Explorer或Firefox中起做用。

在起草HTML 5並遭到拒絕時,討論了該問題 ,由於它破壞了 瀏覽器的 兼容性 。 具備自關閉腳本標記的網頁在舊瀏覽器中可能沒法正確呈現(若是有的話)。 還有其餘建議 ,但它們也不能解決兼容性問題。

在草稿發佈以後,WebKit更新瞭解析器以使其符合要求。

因爲與HTML 4和XHTML 1的向後兼容性,在HTML 5中不會發生自閉合<script>


XHTML 1 / XHTML 5

其餘答案所述,當真正用做XHTML時, <script/>確實是封閉的。

除了規範說它在用做HTML時應該已經起做用:

XHTML文檔...能夠標記爲Internet媒體類型「 text / html」 [RFC2854],由於它們與大多數HTML瀏覽器兼容。

因此發生了什麼事?

人們要求Mozilla 容許Firefox將符合條件的文檔解析XHTML,而無論指定的內容標頭(稱爲Content Sniffing )如何。 這將容許自動關閉腳本,而且不管如何都必須進行內容嗅探,由於Web託管者還不夠成熟,沒法提供正確的標頭。 IE很擅長

若是第一次瀏覽器之戰沒有以IE 6結束,那麼XHTML可能也已列入清單。 但它確實結束了。 IE 6的XHTML 有問題 。 實際上,IE 根本不支持正確的MIME類型,這迫使每一個人都text/html用於XHTML,由於IE 佔據了整整十年的主要市場份額

並且內容嗅探可能 真的很糟 ,人們表示應該中止嗅探。

最終,事實證實W3C 並不意味着XHTML是可嗅探的 :該文檔既是 HTML和XHTML,又是Content-Type規則。 能夠說他們堅決地堅持「只是遵循咱們的規範」,而忽略了實際的作法 。 這個錯誤一直持續到後來的XHTML版本。

不管如何,這個決定解決了 Firefox 的問題 。 Chrome 誕生已有7年了; 沒有其餘重要的瀏覽器。 這樣就決定了。

因爲遵循如下規範,僅指定doctype不會觸發XML解析。


#3樓

萬一有人好奇,最終的緣由是HTML最初是SGML的方言,SGML是XML的怪異哥哥。 在SGML域中,能夠在DTD中將元素指定爲自動關閉(例如BR,HR,INPUT),隱式關閉(例如P,LI,TD)或顯式關閉(例如TABLE,DIV,SCRIPT)。 XML固然沒有這個概念。

儘管現代的瀏覽器的解析模型再也不是純粹的SGML,但現代瀏覽器所使用的標記湯解析器倒是今後繼承而來的。 固然,除非您使用XML mime類型發送它,不然您精心設計的XHTML會被視爲編寫不良的SGML風格的標記湯。 這也是爲何

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

...被瀏覽器解釋爲:

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

...這是一個可愛的,難以理解的錯誤的祕訣,當您嘗試對DOM進行編碼時,可能會使您陷入困境。


#4樓

那是由於SCRIPT TAG不是無效元素。

HTML文檔中 -VOID ELEMENTS 根本不須要「結束標記」!

xhtml中 ,全部內容都是通用的,所以都須要終止,例如「結束標記」; 包括br,一個簡單的換行符,如<br></br>或它的速記 <br />

可是,腳本元素決不能是void或參數化元素,由於在其餘任何內容以前, 腳本標籤都是瀏覽器指令,而不是數據描述聲明。

原則上,僅當處理語義不能被後續標籤終止的指令時,才須要「語義終止指令」,例如「關閉標籤」。 例如:

<H1>語義不能由後面的<P>終止,由於它沒有足夠的自身語義來覆蓋並所以終止先前的H1指令集。 儘管它可以將分紅新的段落行,可是它不足以覆蓋當前的字體大小和樣式行高,使之流中傾瀉而下 ,即從H1泄漏(由於P沒有) )。

這就是發明「 /」(終止)信號的方式和緣由。

通用的無描述終止標記(如< />足以知足所遇到的級聯的任何單個降低,例如: <H1>Title< />但並不是老是如此,由於咱們還但願可以「嵌套」 」,Stream的多箇中間標記:在包裝/掉落到另外一個級聯以前分紅種子。 結果,諸如< />類的通用終止符將沒法肯定要終止的屬性的目標。 例如: <b> 粗體 <i> 粗體斜體 < /> 斜體 </>正常。 無疑將沒法正確理解咱們的意圖,而且極可能會將其解釋爲粗體, 粗體,斜體,粗體

這就是包裝器(即容器) 這一律念的誕生。 (這些概念是如此類似,以致於沒法辨別,有時同一元素可能同時具備。 <H1>是包裝器和容器。而<B>只是語義包裝器)。 咱們須要一個沒有語義的普通容器。 固然,DIV元素的發明也隨之而來。

DIV元素其實是2BR容器。 固然,CSS的出現使整個狀況變得比之前更怪異,並形成了許多巨大後果的混亂-間接地!

由於使用CSS能夠輕鬆地覆蓋新發明的DIV的本地BR先後行爲,因此一般將其稱爲「不執行任何操做的容器」。 這是天然的錯誤! DIV是塊元素,將在結束信號發送以前和以後天然中斷流的行。 不久,WEB開始遭受頁面DIV感染。 他們大多數仍是。

CSS的到來,它具備徹底覆蓋和徹底從新定義任何HTML Tag的本機行爲的能力,從而以某種方式設法混淆和模糊了HTML存在的所有含義...

忽然,全部HTML標記彷佛都已過期,它們被污損了,剝奪了全部原始含義,身份和用途。 您會以某種方式得到再也不須要它們的印象。 說:一個容器包裝標籤就足夠了全部數據表示。 只需添加所需的屬性。 爲何沒有有意義的標籤呢? 隨便發明標籤名稱,而後讓CSS其他的地方都麻煩。

這就是xhtml的誕生方式,固然是巨大的挫折,它是由新來者付出瞭如此高昂的代價,而且對什麼是什麼以及這一切的目的是什麼產生了錯誤的認識。 W3C從萬維網發展到哪裏錯了,同志們!

HTML的目的是有意義的數據流傳輸給人類接收者。

傳遞信息。

正式的部分只是爲了幫助信息傳遞的清晰。 xhtml對此信息沒有絲毫考慮。 -對此,信息絕對可有可無。

這件事中最重要的事情是要知道並可以理解xhtml不只僅是某些擴展HTML的版本 ,xhtml是徹底不一樣的野獸; 地面 所以, 最好將它們分開。


#5樓

這裏已經很好地描述了 「真正的XHTML」,「僞XHTML」和HTML之間的區別以及服務器發送的MIME類型的重要性。 若是您想當即嘗試,這裏是帶有實時預覽的簡單可編輯代碼段,其中包括適用於功能強大的瀏覽器的自封閉腳本標籤:

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>

您應該看到Hello, true XHTML. Nice to meet you! Hello, true XHTML. Nice to meet you! 在文本區域下方。

對於沒法使用的瀏覽器,您能夠複製文本區域的內容並將其另存爲擴展名爲.xhtml (或.xht )的文件( 感謝Alek的提示 )。

相關文章
相關標籤/搜索