Tại sao các phần tử script tự đóng không hoạt động?


1346

Lý do trình duyệt không nhận ra chính xác là gì:

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

Chỉ điều này được công nhận:

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

Điều này có phá vỡ khái niệm về hỗ trợ XHTML không?

Lưu ý: Tuyên bố này đúng ít nhất cho tất cả IE (6-8 beta 2).


12
Hoạt động trong Chrome và Opera
corymathews

46
Một số phiên bản gần đây của Chrome dường như đã phá vỡ điều này, các thẻ script tự đóng không còn hoạt động trong Chrome
Adam Ness

13
Nó không chỉ là các thẻ script. Tôi cũng không tin thẻ div tự đóng cũng hoạt động.
DOK

6
Kể từ tháng 7 năm 2011, Chrome và Firefox có vấn đề này. "Đó không phải là một lỗi, đó là một tính năng" - thực sự gây phiền nhiễu.
Martin Konicek

4
Phiên bản tổng quát hơn của điều này đã được hỏi hai ngày sau: stackoverflow.com/questions/97522/
triệt

Câu trả lời:


481

Đặc tả XHTML 1 cho biết:

3. Tối thiểu hóa phần tử và nội dung phần tử rỗng

Cho một phiên bản trống của một phần tử có mô hình nội dung không EMPTY(ví dụ: tiêu đề hoặc đoạn trống) không sử dụng biểu mẫu thu nhỏ (ví dụ: sử dụng <p> </p>và không <p />).

XHTML DTD chỉ định các thành phần tập lệnh là:

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

111
Tuy nhiên, không phải là không giống như trên thế giới. Đây là một hướng dẫn (để tương thích, như được đề xuất bởi tiêu đề của phần), không phải là một quy tắc.
Konrad Rudolph

42
Trên thực tế, tôi không thể tìm thấy bất kỳ sử dụng cho hạn chế này :) Nó dường như hoàn toàn nhân tạo.
phi đội

22
Câu trả lời đúng được đưa ra bởi olavk. Phụ lục C của XHTML 1.0 không phải là lý do tại sao mọi thứ lại theo cách của họ, đó chỉ là cách giải quyết mọi thứ.
hsivonen

32
Nó không phải là một phần quy chuẩn của đặc điểm kỹ thuật. Đây chỉ là phụ lục về cách xử lý các trình duyệt không hỗ trợ XHTML
Kornel

12
Vấn đề <script />không phải là thông số kỹ thuật không cho phép, mà các trình duyệt không hiểu nó là "súp không gắn thẻ" nếu loại nội dung không phải là application / xhtml + xml. Xem: stackoverflow.com/questions/348736/... @shabunc: các trình duyệt có thể xuất hiện để hiểu điều đó, nhưng những gì đang thực sự xảy ra là nó đặt nội dung sau thẻ <p /> bên đoạn, do giải thích quote squadette để có nghĩa là kể từ < p> không trống, nó không thể tự đóng. Trong XHTML 1.1, nó thể tự đóng.
Joe

241

Để thêm vào những gì Brad và phi đội đã nói, cú pháp XML tự đóng <script />thực sự XML chính xác, nhưng để nó hoạt động trong thực tế, máy chủ web của bạn cũng cần gửi các tài liệu của bạn dưới dạng XML đúng với một mô hình XML giống như application/xhtml+xmltrong HTTP Tiêu đề loại nội dung (và không phảitext/html).

Tuy nhiên, việc gửi một mô phỏng XML sẽ khiến các trang của bạn không bị IE7 phân tích cú pháp, chỉ thích text/html.

Từ w3 :

Tóm lại, 'application / xhtml + xml' NÊN được sử dụng cho các tài liệu Gia đình XHTML và việc sử dụng 'text / html' NÊN được giới hạn trong các tài liệu XHTML 1.0 tương thích HTML. 'application / xml' và 'text / xml' cũng có thể được sử dụng, nhưng bất cứ khi nào thích hợp, 'application / xhtml + xml' NÊN được sử dụng thay vì các loại phương tiện XML chung.

Tôi đã bối rối về điều này một vài tháng trước và giải pháp khả thi duy nhất (tương thích với FF3 + và IE7) là sử dụng <script></script>cú pháp cũ với text/html(cú pháp HTML + mô phỏng HTML).

Nếu máy chủ của bạn gửi text/htmlloại trong các tiêu đề HTTP, ngay cả với các tài liệu XHTML được tạo đúng cách, FF3 + sẽ sử dụng chế độ kết xuất HTML của nó, điều đó có nghĩa là nó <script />sẽ không hoạt động (đây là một thay đổi, trước đây Firefox ít nghiêm ngặt hơn).

Điều này sẽ xảy ra bất kể mọi vấn đề liên quan đến http-equivcác yếu tố meta, prolog hay doctype XML trong tài liệu của bạn - Các nhánh của Firefox một khi nó có text/htmltiêu đề, xác định xem trình phân tích cú pháp HTML hoặc XML có nhìn vào bên trong tài liệu hay không và trình phân tích cú pháp HTML không hiểu <script />.


3
Có đúng không khi kết luận rằng nếu bạn bỏ hỗ trợ cho IE7, việc gửi văn bản / xml sẽ giúp bạn hỗ trợ trình duyệt rộng hơn cho <script />?
Chris Moschini

7
Vì vậy, trong ngắn hạn, <script /> sẽ chỉ hoạt động nếu loại MIME của trang của bạn là xhtml / xml. Đối với các trang văn bản / html thông thường, nó sẽ không hoạt động. VÀ nếu chúng ta thử sử dụng loại MIME "xhtml / xml", nó sẽ phá vỡ tính tương thích của IE. Để tóm tắt, Giữ Bình tĩnh và Sử dụng <script> ... </ script> Cảm ơn Joe ;-)
Navin Israni

1
Giải thích tuyệt vời. Một điểm đáng chú ý khác là Firefox cũng sẽ có các .htmltệp cục bộ được hiển thị dưới dạng súp-tag bất kể thẻ meta, vì lý do tương tự. Đối với các tệp XHTML, Firefox sẽ chỉ hiển thị chúng phù hợp nếu chúng được đặt tên .xhtml.
alecov

@ChrisMoschini. Có thể, nhưng sử dụng application/xhtml+xml, không text/xml.
TRiG

167

Trong trường hợp bất kỳ ai cũng tò mò, lý do cuối cùng là HTML ban đầu là một phương ngữ của SGML, là anh trai kỳ lạ của XML. Trong vùng đất SGML, các yếu tố có thể được chỉ định trong DTD là tự đóng (ví dụ BR, HR, INPUT), có thể đóng hoàn toàn (ví dụ P, LI, TD) hoặc có thể đóng rõ ràng (ví dụ TABLE, DIV, SCRIPT). XML, tất nhiên, không có khái niệm về điều này.

Các trình phân tích cú pháp thẻ-canh được sử dụng bởi các trình duyệt hiện đại đã phát triển từ di sản này, mặc dù mô hình phân tích cú pháp của chúng không còn là SGML thuần túy nữa. Và tất nhiên, XHTML được chế tạo cẩn thận của bạn đang bị coi là súp-tag lấy cảm hứng từ SGML được viết xấu trừ khi bạn gửi nó với một loại mime XML. Đây cũng là lý do ...

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

... được trình duyệt diễn giải là:

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

... đó là công thức cho một lỗi tối nghĩa đáng yêu có thể khiến bạn rơi vào tình trạng phù hợp khi bạn cố gắng mã hóa chống lại DOM.


4
Tôi tò mò. Tại sao trình duyệt chọn giải thích theo cách đó?
Ahmed Aeon Axan

32
@AhmedAeonAxan: Phần Ptử không thể chứa DIVcác phần tử (đây là HTML không hợp lệ), do đó trình duyệt hoàn toàn đóng Pphần tử (được định nghĩa là "có thể đóng hoàn toàn") trước DIVthẻ mở . Tuy nhiên, các trình duyệt có xu hướng hành xử khác nhau về mặt này (như chúng có thể làm với bất kỳ HTML không hợp lệ nào).
MrWhite

5
@ColeJohnson Không, đây không phải là món súp; greim đang làm rối ranh giới giữa HTML hợp lệ và không hợp lệ. Thẻ súp là những gì bạn nhận được khi các tác giả không quan tâm đến các quy tắc, bởi vì các trình duyệt sử dụng sửa lỗi. </p>Mặt khác, thẻ kết thúc bị thiếu thực sự là một phần của định nghĩa về HTML!
Ông Lister

3
@MrLister - Sắp xếp. "Súp súp" mô tả cách HTML được phân tích cú pháp, chứ không phải cách nó được tạo ra. Đó là một thuật ngữ được sử dụng để mô tả các chiến lược khác nhau mà các trình duyệt sử dụng để hiểu về HTML và trái ngược với phân tích cú pháp XML nghiêm ngặt. Phân tích cú pháp XML chỉ được phép cho các loại mime XML, nhưng vì chúng không bao giờ được sử dụng rộng rãi, các trình duyệt đã quay trở lại các lược đồ "thẻ súp" khác nhau, ngay cả đối với các tài liệu hợp lệ.
greim

8
HTML5 thực sự đã chuẩn hóa việc phân tích cú pháp 'súp thẻ', bao gồm một cách nhất quán để xử lý đánh dấu không hợp lệ. Cho đến lúc đó, các trình duyệt phải tự mình tìm ra cách làm với đánh dấu không hợp lệ, gây ra sự không nhất quán. Trình phân tích cú pháp HTML trong các trình duyệt hiện tại là một trong những phần mềm tiên tiến nhất từng được viết. Nhanh chóng và có thể đối phó với hầu hết mọi đầu vào, tạo ra kết quả nhất quán.
Stijn de Witt

161

Những người khác đã trả lời "làm thế nào" và trích dẫn spec. Đây là câu chuyện thực sự về "tại sao không <script/>", sau nhiều giờ đào sâu vào các báo cáo lỗi và danh sách gửi thư.


HTML 4

HTML 4 dựa trên SGML .

SGML có một số shorttags , chẳng hạn như <BR//, <B>text</>, <B/text/, hoặc <OL<LI>item</LI</OL>. XML có dạng đầu tiên, xác định lại kết thúc là ">" (SGML là linh hoạt), để nó trở thành <BR/>.

Tuy nhiên, HTML không redfine, vì vậy <SCRIPT/> nên có ý nghĩa <SCRIPT>> .
(Có, '>' phải là một phần của nội dung và thẻ vẫn chưa bị đóng.)

Rõ ràng, điều này không tương thích với XHTML và sẽ phá vỡ nhiều trang web (vào thời điểm các trình duyệt đã đủ chín chắn để quan tâm đến vấn đề này ), vì vậy không ai thực hiện các shorttags và thông số kỹ thuật khuyên họ .

Thực tế, tất cả các thẻ tự kết thúc 'làm việc' là các thẻ có thẻ kết thúc bị cấm trên các trình phân tích cú pháp không phù hợp về mặt kỹ thuật và trên thực tế không hợp lệ. Chính W3C đã đưa ra bản hack này để giúp chuyển sang XHTML bằng cách làm cho nó tương thích với HTML .

<script>thẻ kết thúc không bị cấm .

Thẻ "Tự kết thúc" là một hack trong HTML 4 và là vô nghĩa.


HTML 5

HTML5 có năm loại thẻ và chỉ các thẻ 'void' và 'nước ngoài' mới được phép tự đóng .

Bởi vì <script>không phải là void (nó có thể có nội dung) và không phải là nước ngoài (như MathML hoặc SVG), <script>không thể tự đóng, bất kể bạn sử dụng nó như thế nào.

Nhưng tại sao? Họ không thể coi nó là nước ngoài, làm cho trường hợp đặc biệt, hoặc một cái gì đó?

HTML 5 nhằm mục đích tương thích ngược với việc triển khai HTML 4 và XHTML 1. Nó không dựa trên SGML hoặc XML; cú pháp của nó chủ yếu liên quan đến tài liệu và thống nhất thực hiện. (Đây là lý do tại sao <br/> <hr/>vv là HTML 5 hợp lệ mặc dù HTML4 không hợp lệ.)

Tự đóng <script>là một trong những thẻ nơi triển khai được sử dụng để khác nhau. Nó sử dụng để làm việc trong Chrome, Safari , và Opera ; theo hiểu biết của tôi, nó không bao giờ hoạt động trong Internet Explorer hoặc Firefox.

Điều này đã được thảo luận khi HTML 5 đang được soạn thảo và bị từ chối vì nó phá vỡ tính tương thích của trình duyệt . Các trang web tự đóng thẻ script có thể không hiển thị chính xác (nếu có) trong các trình duyệt cũ. Có những đề xuất khác , nhưng chúng cũng không thể giải quyết vấn đề tương thích.

Sau khi bản nháp được phát hành, WebKit đã cập nhật trình phân tích cú pháp để phù hợp.

Tự đóng <script>không xảy ra trong HTML 5 vì khả năng tương thích ngược với HTML 4 và XHTML 1.


XHTML 1 / XHTML 5

Khi thực sự phục vụ như XHTML, <script/>thực sự đóng, như các câu trả lời khác đã nêu.

Ngoại trừ thông số kỹ thuật nói rằng nó đáng lẽ phải hoạt động khi được phục vụ dưới dạng HTML:

Tài liệu XHTML ... có thể được gắn nhãn "Loại văn bản / html" [RFC2854], vì chúng tương thích với hầu hết các trình duyệt HTML.

Vậy chuyện gì đã xảy ra?

Mọi người yêu cầu Mozilla để Firefox phân tích các tài liệu tuân thủ là XHTML bất kể tiêu đề nội dung được chỉ định (được gọi là đánh hơi nội dung ). Điều này sẽ cho phép các kịch bản tự đóng và dù sao việc đánh hơi nội dung là cần thiết bởi vì các máy chủ web không đủ chín chắn để phục vụ tiêu đề chính xác; IE đã giỏi về nó .

Nếu cuộc chiến trình duyệt đầu tiên không kết thúc với IE 6, XHTML cũng có thể có trong danh sách. Nhưng nó đã kết thúc. Và IE 6 có vấn đề với XHTML. Trong thực tế IE không hỗ trợ kiểu MIME đúng ở tất cả , buộc tất cả mọi người sử dụng text/htmlcho XHTML vì IE giữ thị phần lớn cho cả một thập kỷ.

Và nội dung đánh hơi có thể thực sự xấu và mọi người đang nói rằng nó nên được dừng lại .

Cuối cùng, hóa ra W3C không có nghĩa là XHTML có thể đánh hơi được : tài liệu là cả HTML và XHTML và Content-Typecác quy tắc. Người ta có thể nói rằng họ đã đứng vững trên "chỉ cần làm theo thông số kỹ thuật của chúng tôi" và bỏ qua những gì là thực tế . Một lỗi tiếp tục vào các phiên bản XHTML sau này.

Dù sao, quyết định này đã giải quyết vấn đề cho Firefox. Đó là 7 năm trước khi Chrome ra đời ; không có trình duyệt quan trọng nào khác Do đó, nó đã được quyết định.

Chỉ định loại tài liệu một mình không kích hoạt phân tích cú pháp XML vì các thông số kỹ thuật sau.


1
@AndyE Khi bạn viết <script> tự đóng, các trình duyệt chính tại thời điểm đó không nghĩ rằng nó bị đóng và sẽ phân tích cú pháp html sau đó thành javascript, khiến HTML5 hợp lệ bị phá vỡ trên các trình duyệt cũ này. Do đó, đề xuất bị từ chối. Điều này được giải thích trong danh sách gửi thư HTML5 được liên kết.
Cừu

2
@AndyE: Những gì bạn đang mô tả là khả năng tương thích về phía trước - khả năng của mã cũ để làm việc với trình biên dịch / trình thông dịch / trình phân tích cú pháp mới. Khả năng tương thích ngược là khả năng mã mới hoạt động với trình biên dịch / trình thông dịch / trình phân tích cú pháp cũ. Vì vậy, có, khả năng tương thích ngược là vấn đề vì nếu không các trang được viết với thông số mới sẽ không hoạt động trong các trình duyệt cũ (và vâng, đó là truyền thống lập trình web để thử và làm cho mã mới hoạt động trong các trình duyệt cũ càng nhiều càng tốt).
slebetman

3
@Dmitry Thực tế là, không cho phép kịch bản tự đóng là một con đường một chiều. Khi được liên kết , <script> tự đóng sẽ phá vỡ tất cả các trình duyệt, người dùng sẽ chỉ nhìn thấy trang trống - máy chơi game, Internet TV, IE 11 trên PC Win7 mới của công ty, hàng triệu thời gian chạy Java hoặc hàng tỷ điện thoại thông minh. Bạn có thể nâng cấp hầu hết WebView của hầu hết các ngôn ngữ trên hầu hết các thiết bị không? Nếu HTML5 cố gắng thì họ đã thất bại như XHTML2.
Sheepy

6
câu trả lời rất bị đánh giá thấp
Kamil Tomšík

2
Một chút chỉnh sửa: các thẻ có vẻ như tự đóng trong HTML không phải là các thẻ có thẻ kết thúc tùy chọn , mà là các thẻ có thẻ kết thúc bị cấm (trống, hoặc void, thẻ). Các thẻ có thẻ kết thúc tùy chọn , như <p>hoặc <li>, không thể 'tự đóng' vì chúng có thể có nội dung, do đó, mã giống như <p/>không có gì khác là thẻ bắt đầu (không đúng định dạng) và nội dung sau nó, nếu được phép trong phần tử này , sẽ kết thúc bên trong nó.
Ilya Streltsyn

44

Internet Explorer 8 trở về trước không hỗ trợ phân tích cú pháp XHTML. Ngay cả khi bạn sử dụng khai báo XML và / hoặc loại tài liệu XHTML, IE cũ vẫn phân tích tài liệu dưới dạng HTML đơn giản. Và trong HTML đơn giản, cú pháp tự đóng không được hỗ trợ. Dấu gạch chéo chỉ bị bỏ qua, bạn phải sử dụng thẻ đóng rõ ràng.

Ngay cả các trình duyệt có hỗ trợ phân tích cú pháp XHTML, như IE 9 trở lên , vẫn sẽ phân tích tài liệu dưới dạng HTML trừ khi bạn phân phát tài liệu bằng loại nội dung XML. Nhưng trong trường hợp đó, IE cũ sẽ không hiển thị tài liệu nào cả!


9
"IE không hỗ trợ phân tích cú pháp XHTML." đã đúng với các phiên bản IE tại thời điểm nó được viết, nhưng không còn đúng nữa.
EricLaw

@EricLaw bạn có thể làm rõ phiên bản IE nào đã sửa lỗi này không? (và bất kỳ điều kiện cụ thể nào - ví dụ: yêu cầu tài liệu hợp lệ)
scunliffe

2
@scunliffe IE9 là phiên bản đầu tiên hỗ trợ đầy đủ cho XHTML. blogs.msdn.com/b/ie/archive/2010/11/01/...
EricLaw

28

Những người ở trên đã giải thích khá nhiều về vấn đề này, nhưng một điều có thể làm cho mọi thứ rõ ràng là, mặc dù mọi người sử dụng <br/>và mọi lúc như vậy trong các tài liệu HTML, bất kỳ /vị trí nào như vậy về cơ bản đều bị bỏ qua và chỉ được sử dụng khi cố gắng thực hiện một cái gì đó có thể phân tích cú pháp như XML và HTML. Hãy thử <p/>foo</p>, ví dụ, và bạn nhận được một đoạn thông thường.


22

Thẻ script tự đóng sẽ không hoạt động, vì thẻ script có thể chứa mã nội tuyến và HTML không đủ thông minh để bật hoặc tắt tính năng đó dựa trên sự hiện diện của một thuộc tính.

Mặt khác, HTML có một thẻ tuyệt vời để bao gồm các tham chiếu đến các tài nguyên bên ngoài: <link>thẻ và nó có thể tự đóng. Nó đã được sử dụng để bao gồm các bảng định kiểu, nguồn cấp dữ liệu RSS và Atom, URI chính tắc và tất cả các loại tính năng khác. Tại sao không phải là JavaScript?

Nếu bạn muốn thẻ script được tự đóng, bạn không thể làm như tôi đã nói, nhưng có một cách khác, mặc dù không phải là thông minh. Bạn có thể sử dụng thẻ liên kết tự đóng và liên kết đến JavaScript của mình bằng cách cung cấp cho nó một loại văn bản / javascript và rel dưới dạng tập lệnh, đại loại như dưới đây:

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

4
Tôi thích điều đó, tại sao nó không "thông minh"?
Josh M.

5
Bởi vì có một thẻ script được xác định trước để thực hiện chính xác công việc tải tập lệnh .. Tại sao bạn lại nhầm lẫn vấn đề sử dụng cái gì khác? Một cái búa búa trong móng tay .. Sẽ là thông minh khi sử dụng giày?
Dave Lawrence

8
@daveL - Và chúng tôi có <style>các thẻ, nhưng sử dụng các thẻ liên kết cho các tệp CSS bên ngoài. Định nghĩa thẻ liên kết: "Thẻ <link> xác định liên kết giữa tài liệu và tài nguyên bên ngoài." Có vẻ hợp lý hoàn toàn rằng thẻ liên kết sẽ được sử dụng cho CSS hoặc JS bên ngoài ... đó là những gì nó dành cho ... liên kết trong các tệp bên ngoài. lưu ý Tôi không nói về spec / cross-lông mày / v.v. . Không chắc chắn giày [tương tự] phù hợp.
Jimbo Jonny

20

Không giống như XML và XHTML, HTML không có kiến ​​thức về cú pháp tự đóng. Các trình duyệt diễn giải XHTML dưới dạng HTML không biết rằng /ký tự chỉ ra rằng thẻ phải tự đóng; thay vào đó họ diễn giải nó như một thuộc tính trống và trình phân tích cú pháp vẫn cho rằng thẻ là 'mở'.

Cũng như <script defer>được đối xử như <script defer="defer">, <script />được đối xử như <script /="/">.


33
Thanh lịch như lời giải thích này, nó thực tế là sai. Nếu đó là sự thật, sẽ có một thuộc tính "/" cho thành phần tập lệnh trong DOM. Tôi đã kiểm tra IE, Firefox và Opera và không ai trong số chúng thực sự chứa thuộc tính như vậy.
Alohci

11
/ không phải là một ký tự tên thuộc tính hợp lệ, vì vậy nó bị loại bỏ. Nếu không, lời giải thích này là khá rõ ràng.
Hallvors - khôi phục Monica

1
Trên thực tế, một số trình phân tích cú pháp HTML (và đặc biệt là trình xác nhận) có thể diễn giải /như là một phần của cấu trúc NET (Thẻ Null End).
IllidanS4 muốn Monica trở lại vào

18

Internet Explorer 8 trở lên không hỗ trợ loại MIME thích hợp cho XHTML , application/xhtml+xml. Nếu bạn đang phục vụ XHTML như text/html, mà bạn phải cho các phiên bản Internet Explorer cũ này để làm bất cứ điều gì, thì nó sẽ được hiểu là HTML 4.01. Bạn chỉ có thể sử dụng cú pháp ngắn với bất kỳ yếu tố nào cho phép bỏ qua thẻ đóng. Xem Đặc tả kỹ thuật HTML 4.01 .

'Dạng ngắn' của XML được hiểu là một thuộc tính có tên /, vì (không có dấu bằng) được hiểu là có giá trị ngầm định là "/". Điều này hoàn toàn sai trong HTML 4.01 - các thuộc tính không được khai báo không được phép - nhưng các trình duyệt sẽ bỏ qua nó.

IE9 và sau đó hỗ trợ XHTML 5 được cung cấp cùng application/xhtml+xml.


IE 9 hỗ trợ XHTML và IE không còn> 51%. Bạn có thể cập nhật câu trả lời của bạn?
Damian Yerrick 13/03/2015

5

Đó là bởi vì SCRIPT TAG không phải là một yếu tố VOID.

Trong Tài liệu HTML - VOID ElementS hoàn toàn không cần "thẻ đóng"!

Trong xhtml , mọi thứ đều là Chung, do đó tất cả chúng đều cần chấm dứt, ví dụ: "thẻ đóng"; Bao gồm br, ngắt dòng đơn giản, như <br></br>hoặc tốc của nó <br />.

Tuy nhiên, Phần tử tập lệnh không bao giờ là khoảng trống hoặc Phần tử tham số, vì thẻ script trước bất kỳ thứ gì khác, là Hướng dẫn trình duyệt, không phải là khai báo Mô tả dữ liệu.

Về cơ bản, Hướng dẫn chấm dứt ngữ nghĩa, ví dụ: "thẻ đóng" chỉ cần thiết để xử lý các hướng dẫn mà ngữ nghĩa không thể bị chấm dứt bởi thẻ thành công. Ví dụ:

<H1>ngữ nghĩa không thể được chấm dứt bởi một điều sau <P>bởi vì nó không mang đủ ngữ nghĩa của chính nó để ghi đè và do đó chấm dứt tập lệnh H1 trước đó. Mặc dù nó có thể chia luồng thành một dòng đoạn mới, nhưng nó không "đủ mạnh" để ghi đè kích thước phông chữ hiện tại và chiều cao dòng kiểu đổ xuống luồng , tức là rò rỉ từ H1 (vì P không có nó ).

Đây là cách và tại sao tín hiệu "/" (chấm dứt) đã được phát minh.

Thẻ chấm dứt không mô tả chung như< /> , sẽ có hiệu lực cho bất kỳ trường hợp nào rơi ra khỏi tầng gặp phải, ví dụ: <H1>Title< />nhưng không phải lúc nào cũng như vậy, bởi vì chúng tôi cũng muốn có khả năng "lồng", gắn thẻ trung gian của Stream: split vào dòng chảy trước khi quấn / rơi xuống một tầng khác. Kết quả là một kẻ hủy diệt chung chung như < />sẽ không thể xác định mục tiêu của một tài sản để chấm dứt. Ví dụ: <b>in <i>đậm đậm in < /> nghiêng </> bình thường. Chắc chắn sẽ không thực hiện đúng ý định của chúng tôi và rất có thể sẽ giải thích nó là đậm táo bạo-itallic đậm bình thường.

Đây là cách khái niệm bao bọc tức là., Container được sinh ra. (Các khái niệm này giống nhau đến mức không thể nhận ra và đôi khi cùng một yếu tố có thể có cả hai. <H1>Cả hai trình bao bọc và vùng chứa cùng một lúc. Trong khi đó <B>chỉ là một trình bao bọc ngữ nghĩa). Chúng tôi sẽ cần một đồng bằng, không có thùng chứa ngữ nghĩa. Và tất nhiên, việc phát minh ra một yếu tố DIV đã xuất hiện.

Phần tử DIV thực sự là 2BR-Container. Tất nhiên, sự xuất hiện của CSS đã khiến toàn bộ tình huống trở nên kỳ quặc hơn so với những gì nó đã xảy ra và gây ra một sự nhầm lẫn lớn với nhiều hậu quả lớn - một cách gián tiếp!

Bởi vì với CSS, bạn có thể dễ dàng ghi đè hành vi BR trước và sau của một DIV mới được phát minh, nên nó thường được gọi là "vùng chứa không làm gì". Đó là, tự nhiên sai! DIV là các phần tử khối và thực sự sẽ phá vỡ dòng của luồng cả trước và sau khi báo hiệu kết thúc. Chẳng mấy chốc, WEB bắt đầu đau khổ vì trang DIV-itis. Hầu hết trong số họ vẫn còn.

Sự xuất hiện của CSS với khả năng ghi đè hoàn toàn và xác định lại hoàn toàn hành vi gốc của bất kỳ Thẻ HTML nào, bằng cách nào đó đã quản lý để gây nhầm lẫn và làm mờ toàn bộ ý nghĩa của sự tồn tại HTML ...

Đột nhiên, tất cả các thẻ HTML xuất hiện như thể lỗi thời, chúng bị xóa, bị tước bỏ tất cả ý nghĩa ban đầu, danh tính và mục đích của chúng. Bằng cách nào đó bạn sẽ có được ấn tượng rằng họ không còn cần thiết. Nói: Một thẻ trình bao bọc đơn sẽ đủ cho tất cả các bản trình bày dữ liệu. Chỉ cần thêm các thuộc tính cần thiết. Tại sao không có thẻ có ý nghĩa thay thế; Phát minh tên thẻ khi bạn đi và để CSS làm phiền với phần còn lại.

Đây là cách xhtml được sinh ra và tất nhiên là sự cùn lớn, được trả tiền rất đắt bởi những người mới đến và một tầm nhìn bị bóp méo về những gì là gì, và mục đích chết tiệt của tất cả là gì. W3C đã đi từ World Wide Web đến What Went Wrong, Comrades? !!

Mục đích của HTML là truyền dữ liệu có ý nghĩa đến người nhận.

Để cung cấp thông tin.

Phần chính thức là ở đó chỉ để hỗ trợ sự rõ ràng của việc cung cấp thông tin. xhtml không xem xét thông tin một chút. - Với nó, thông tin hoàn toàn không liên quan.

Điều quan trọng nhất trong vấn đề là phải biết và có thể hiểu rằng xhtml không chỉ là một phiên bản của một số HTML mở rộng , xhtml là một con thú hoàn toàn khác; căn cứ; và do đó , khôn ngoan là giữ chúng tách biệt.


3

Sự khác biệt giữa 'XHTML thật', 'XHTML giả' và HTML cũng như tầm quan trọng của loại MIME do máy chủ gửi đã được mô tả rõ ở đây . Nếu bạn muốn dùng thử ngay bây giờ, đây là đoạn mã có thể chỉnh sửa đơn giản với bản xem trước trực tiếp bao gồm thẻ script tự đóng cho các trình duyệt có khả năng:

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>

Bạn nên thấy Hello, true XHTML. Nice to meet you! bên dưới textarea.

Đối với các trình duyệt không có khả năng, bạn có thể sao chép nội dung của textarea và lưu nó dưới dạng tệp có phần mở rộng ( .xhtmlhoặc .xht) ( cảm ơn vì gợi ý này ).


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.