it-swarm-vi.tech

Tin tin sao cụm dữ liệu và tin?

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 là cho tất cả IE (6-8 beta 2).

1247
dimarzionist

Đặ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 phải là 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)>
456
squadette

Để 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 trên thực tế, web của bạn máy chủ cũng cần gửi các tài liệu của bạn dưới dạng XML được định dạng đúng với mô hình XML giống như application/xhtml+xml trong tiêu đề Kiểu nội dung HTTP (và chứ không phải text/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ị phân tích cú pháp bởi IE7, mà chỉ thích text/html.

Từ w :

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 cú pháp <script></script> cũ với text/html (cú pháp HTML + mô phỏng HTML).

Nếu máy chủ của bạn gửi loại text/html trong các tiêu đề HTTP, ngay cả với các tài liệu XHTML được hình thành đúng cách, FF3 + sẽ sử dụng chế độ kết xuất HTML của nó, điều đó có nghĩa là <script /> sẽ không hoạt động (đây là một thay đổi, Firefox trước đây í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 các phần tử meta http-equiv, 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ó tiêu đề text/html, xác định xem trình phân tích cú pháp HTML hay XML có nhìn vào bên trong tài liệu không hiểu <script />.

225
joelhardi

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ụ: BẢNG, 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 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.

150
greim

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 có thật 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 xác định lại, 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 còn không đã đó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 (theo thời gian trình duyệt đã đủ trưởng thành để quan tâmvề điều này ), vì vậy không ai thực hiện shorttags và thông số kỹ thuật khuyên chống lại chúng .

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 tùy chọn trên các trình phân tích cú pháp không tuân thủ kỹ thuật và trên thực tế không hợp lệ. Đó là W3C mà đã đư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 .

Và thẻ kết thúc của <script>không bắt buộc .

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' là được phép tự đóng .

<script> không trống (nó có thể có nội dung) và không phải là nước ngoài (như MathML hoặc SVG), nên <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 trở thành tương thích ngược với các triển khai của 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/>, v.v ... là HTML 5 hợp lệ mặc dù là 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ó được sử dụng để hoạt động 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ó breakbrowsertương thích . 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ó các đề 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ự được dùng làm XHTML, <script/> thực sự bị đóng, vì các câu trả lời khác đã nêu.

Ngoại trừ điều đó thông số kỹ thuật nói it nên đã 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 đã hỏi Mozilla đến hãy phân tích Firefox tuân thủ các tài liệu 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 tập lệnh tự đóng và nội dung đánh hơi là cần thiết dù sao vì các máy chủ web không đủ chín chắn để phục vụ tiêu đề chính xác; IE was giỏi về nó .

Nếu cuộc chiến trình duyệt đầu tiên không kết thúc bằng 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ợ loại MIME chính xác hoàn toàn , buộc mọi người sử dụng text/html cho XHTML vì IE có thị phần lớn trong cả thập kỷ.

Và nội dung cũng đánh hơi có thểthực sự tồi tệ và mọi người đang nói 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ả hai quy tắc , HTML và XHTML và Content-Type. 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ì thực tế . Một lỗi mà 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. Đã 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.

139
Sheepy

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 một 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 đó cũ IE sẽ không hiển thị tài liệu nào cả!

44
JacquesB

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à như vậy mọi lúc trong các tài liệu HTML, về cơ bản, mọi / đều bị bỏ qua để làm cho một cái gì đó có thể phân tích cú pháp như XML và HTML. Ví dụ, hãy thử <p/>foo</p> và bạn sẽ có được một đoạn văn thông thường.

26
Marijn

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: thẻ <link> 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 chuẩn 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à dựa trên tập lệnh, như sau:

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

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

Giống như <script defer> được coi là <script defer="defer">, <script /> được coi là <script /="/">.

20
rpetrich

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 dưới dạng text/html, mà bạn phải cho các phiên bản Internet Explorer cũ hơn 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ả 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 trở lên hỗ trợ XHTML 5 được phục vụ với application/xhtml+xml.

18
Mike Dimmick

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

Trong một tài liệu HTML - VOID ElementS không cần một "thẻ đóng" nào cả!

Trong xhtml , mọi thứ đều là Chung, do đó tất cả đều cần chấm dứt ví dụ: một "thẻ đóng"; Bao gồm br, ngắt dòng đơn giản, như <br></br> hoặc tốc ký 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ố, bởi vì thẻ tập lệnh trước mọi thứ 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ể bị chấm dứt bởi <P> sau 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ẻ kết thúc không có mô tả không có mô tả 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", nhiều thẻ trung gian của Luồng: tách thành dòng chảy trước khi gói/rơi vào một tầng khác. Do đó, một bộ kết thúc chung chung như < /> sẽ không thể xác định mục tiêu của một thuộc tính để chấm dứt. Ví dụ: <b>bold<i> bold-italic < /> in nghiêng </>n normal. 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ẽ hiểu nó là bold bold-itallic bold bình thường.

Đây là cách khái niệm của một trình 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 phần tử có thể có cả hai. <H1> là cả trình bao bọc và bộ 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 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à 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, đượ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à phát trực tuyến dữ liệu có ý nghĩa với người nhận.

Để cung cấp thông tin.

Phần chính thức là có để 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à 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 đó nên giữ chúng tách biệt.

5
Bekim Bacaj

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 là đã đượ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 sẽ 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ó đuôi .xhtml (hoặc .xht) ( cảm ơn vì gợi ý này ).

2
myf