Dlaczego elementy samozamykającego skryptu nie działają?

1346

Z jakiego powodu przeglądarki nie rozpoznają poprawnie:

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

Tylko to jest rozpoznawane:

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

Czy to łamie koncepcję obsługi XHTML?

Uwaga: To stwierdzenie jest poprawne przynajmniej dla wszystkich IE (6-8 beta 2).

dimarzionist
źródło
12
Działa w Chrome i Operze
corymathews
46
Wygląda na to, że niektóre najnowsze wersje Chrome zepsuły to samozamykające się tagi skryptów nie działają już w Chrome
Adam Ness
13
To nie tylko tagi skryptowe. Nie wierzę też, żeby działały samozamykające się tagi div.
DOK
6
Od lipca 2011 r. Chrome i Firefox mają ten problem. „To nie jest błąd, to funkcja” - naprawdę denerwujące.
Martin Konicek,
4
Bardziej ogólna wersja tego została
zadana

Odpowiedzi:

481

Specyfikacja XHTML 1 mówi:

С.3. Minimalizacja elementu i pusta zawartość elementu

Biorąc pod uwagę pustą instancję elementu, którego model treści nie jest EMPTY(na przykład pusty tytuł lub akapit), nie używaj zminimalizowanej formy (np. Użyj <p> </p>i nie <p />).

XHTML DTD określa elementy skryptu jako:

<!-- script statements, which may include CDATA sections -->
<!ELEMENT script (#PCDATA)>
eskadra
źródło
111
Mimo to „nie” nie jest tym samym, co „nie wolno”. Jest to wskazówka (dla zgodności, jak sugeruje tytuł rozdziału), a nie reguła.
Konrad Rudolph,
42
Właściwie nie mogę znaleźć zastosowania dla tego ograniczenia :) Wydaje się to całkowicie sztuczne.
eskadra
22
Prawidłową odpowiedź udzielił olavk. Dodatek C XHTML 1.0 nie jest powodem, dla którego rzeczy są takie, jakie są - chodzi tylko o obejście tego, jak jest.
hsivonen
32
To nie jest normatywna część specyfikacji. To tylko dodatek o tym, jak radzić sobie z przeglądarkami, które nie obsługują XHTML
Kornel,
12
Problem <script />nie polega na tym, że specyfikacja go nie zezwala, ale na tym, że przeglądarki nie interpretują go jako „non-tag-soup”, jeśli typ zawartości nie jest application / xhtml + xml. Zobacz: stackoverflow.com/questions/348736/... @shabunc: przeglądarki mogą pojawić się go zrozumieć, ale co faktycznie dzieje się to oddanie treść po <p /> wewnątrz akapitu, z powodu interpretacji cytat squadette do myśli, że skoro < p> jest niepuste, nie może być samozamykające. W XHTML 1.1 może być samozamykający.
Joe
241

Aby dodać do tego, co powiedzieli Brad i squadette, samozamykająca się składnia XML jest w<script /> rzeczywistości poprawnym XML, ale aby działała w praktyce, Twój serwer internetowy musi również wysyłać dokumenty jako poprawnie sformatowany XML o typie XML podobnym do mate-riału HTTP Nagłówek Content-Type (a nie as ).application/xhtml+xmltext/html

Jednak wysłanie mimetype XML spowoduje, że strony nie będą analizowane przez IE7, co tylko polubi text/html.

Od w3 :

Podsumowując, „application / xhtml + xml” MUSI być używany w przypadku dokumentów rodziny XHTML, a użycie „text / html” MUSI być ograniczone do dokumentów zgodnych z HTML XHTML 1.0. Można również użyć „application / xml” i „text / xml”, ale w każdym przypadku POWINNY być używane „application / xhtml + xml” zamiast tych ogólnych typów nośników XML.

Zastanawiałem się nad tym kilka miesięcy temu, a jedynym wykonalnym (kompatybilnym z FF3 + i IE7) rozwiązaniem było użycie starej <script></script>składni z text/html(składnia HTML + typ mimetyczny HTML).

Jeśli Twój serwer wysyła ten text/htmltyp w swoich nagłówkach HTTP, nawet przy poprawnie sformatowanych dokumentach XHTML, FF3 + użyje trybu renderowania HTML, co oznacza, że <script />nie będzie działać (jest to zmiana, Firefox był wcześniej mniej rygorystyczny).

Stanie się tak bez względu na jakiekolwiek majstrowanie przy http-equivelementach meta, prologu XML lub doctype wewnątrz dokumentu - Firefox rozgałęzia się po otrzymaniu text/htmlnagłówka, który określa, czy parser HTML lub XML zagląda do dokumentu, a parser HTML nie rozumie <script />.

joelhardi
źródło
3
Czy zatem słuszne jest stwierdzenie, że jeśli porzucisz obsługę IE7, wysyłanie tekstu / xml zapewni szeroką obsługę przeglądarki <skrypt />?
Chris Moschini,
7
Krótko mówiąc, <skrypt /> będzie działał tylko wtedy, gdy typ strony MIME to xhtml / xml. W przypadku zwykłych stron tekstowych / HTML nie będzie działać. ORAZ jeśli spróbujemy użyć typu MIME „xhtml / xml”, spowoduje to uszkodzenie kompatybilności z IE. Podsumowując, zachowaj spokój i użyj <script> ... </script> Dzięki Joe ;-)
Navin Israni
1
Doskonałe wyjaśnienie. Inną kwestią, na którą warto zwrócić uwagę, jest to, że Firefox będzie również .htmlrenderował pliki lokalne jako zupa tagów, niezależnie od metatagów, z podobnych powodów. W przypadku plików XHTML Firefox odpowiednio je wyrenderuje, tylko jeśli zostaną nazwane .xhtml.
alecov
@ChrisMoschini. Prawdopodobnie, ale używać application/xhtml+xmlnie text/xml.
TRiG
166

Jeśli ktoś jest ciekawy, ostatecznym powodem jest to, że HTML był pierwotnie dialektem SGML, który jest dziwnym starszym bratem XML. W SGML-land elementy mogą być określone w DTD jako samozamykające (np. BR, HR, INPUT), domyślnie zamykalne (np. P, LI, TD) lub jawnie zamykane (np. TABELA, DIV, SCRIPT). XML oczywiście nie ma na to pojęcia.

Parsery zupy tagów używane przez współczesne przeglądarki ewoluowały z tego dziedzictwa, chociaż ich model parsowania nie jest już czystym SGML. I oczywiście twój starannie spreparowany XHTML jest traktowany jako źle napisana zupa tagowa inspirowana SGML, chyba że wyślesz go z mimem XML. Dlatego też ...

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

... zostaje zinterpretowany przez przeglądarkę jako:

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

... który jest przepisem na piękny, niejasny błąd, który może wpaść w ciebie podczas próby kodowania DOM.

greim
źródło
4
Jestem ciekawy. dlaczego przeglądarka tak to interpretuje?
Ahmed Aeon Axan
32
@AhmedAeonAxan: PElement nie może zawierać DIVelementów (jest to nieprawidłowy HTML), więc przeglądarka domyślnie zamyka Pelement (zdefiniowany jako „niejawnie zamykany”) przed DIVznacznikiem otwierającym . Jednak przeglądarki zazwyczaj zachowują się inaczej pod tym względem (tak jak w przypadku każdego nieprawidłowego kodu HTML).
MrWhite
5
@ColeJohnson Nie, to nie jest zupa tag; greim zamazuje granicę między poprawnym i nieprawidłowym kodem HTML. Zupa tagowa jest tym, co dostajesz, gdy autorzy nie dbają o reguły, ponieważ przeglądarki używają korekcji błędów. Z </p>drugiej strony brakujący znacznik końcowy jest właściwie częścią definicji HTML!
Pan Lister,
3
@MrLister - Sortuj. „Zupa tagów” ​​opisuje sposób parsowania HTML, a nie sposób jego tworzenia. Był to termin używany do opisania różnych strategii, które przeglądarki wykorzystują do zrozumienia HTML, i jest sprzeczny z ścisłą analizą XML. Analiza składni XML jest dozwolona tylko dla typów mimów XML, ale ponieważ nigdy nie uzyskały one powszechnego zastosowania, przeglądarki powróciły do ​​różnych schematów „zupy tagów”, nawet w przypadku innych ważnych dokumentów.
greim
8
HTML5 faktycznie ustandaryzował parsowanie „zupy tagów”, w tym spójny sposób obsługi nieprawidłowych znaczników. Do tego czasu przeglądarki musiały same wymyślić, co zrobić z nieprawidłowym znacznikiem, powodując niespójności. Parser HTML w obecnych przeglądarkach jest jednym z najbardziej zaawansowanych programów, jakie kiedykolwiek napisano. Błyskawicznie szybki i radzi sobie z większością dowolnych danych wejściowych, zapewniając spójne wyniki.
Stijn de Witt
161

Inni odpowiedzieli „jak” i zacytowali specyfikację. Oto prawdziwa historia „dlaczego nie <script/>” po wielu godzinach zagłębiania się w raporty o błędach i listy mailingowe.


HTML 4

HTML 4 jest oparty na SGML .

SGML ma pewne shorttags , takie jak <BR//, <B>text</>, <B/text/, lub <OL<LI>item</LI</OL>. XML przyjmuje pierwszą formę, redefiniuje końcówkę jako „>” (SGML jest elastyczny), dzięki czemu staje się <BR/>.

Jednak HTML nie zmienił definicji, więc <SCRIPT/> powinno to znaczyć <SCRIPT>> .
(Tak, „>” powinno być częścią treści, a tag nadal nie jest zamknięty).

Oczywiście jest to niezgodne z XHTML i spowoduje uszkodzenie wielu witryn (do czasu, gdy przeglądarki będą wystarczająco dojrzałe, aby się tym przejmować ), więc nikt nie wdrożył shorttagów, a specyfikacja odradza .

W efekcie wszystkie „działające” samozakończone znaczniki są znacznikami z zabronionym znacznikiem końcowym w parserach niezgodnych pod względem technicznym i są w rzeczywistości nieprawidłowe. To W3C wymyślił ten hack, aby pomóc przejść do XHTML, dzięki czemu jest kompatybilny z HTML .

I <script>„s tag końcowy nie jest zakazane .

Tag „Self-ending” to hack w HTML 4 i jest bez znaczenia.


HTML 5

HTML5 ma pięć typów znaczników i tylko tagi „void” i „obcych” mogą być samozamykające .

Ponieważ <script>nie jest nieważny ( może mieć treść) i nie jest obcy (jak MathML lub SVG), <script>nie może być samozamykający się, niezależnie od tego, jak go używasz.

Ale dlaczego? Czy nie mogą uznać go za obcy, zrobić specjalny przypadek czy coś takiego?

HTML 5 ma być kompatybilny wstecz z implementacjami HTML 4 i XHTML 1. Nie jest oparty na SGML ani XML; jego składnia dotyczy głównie dokumentowania i łączenia implementacji. (Właśnie dlatego <br/> <hr/>itd. Są poprawne HTML 5, mimo że są nieprawidłowe HTML4.)

Samozamykanie <script>jest jednym ze znaczników, w których implementacje były różne. Jest wykorzystywany do pracy w Chrome, Safari , Opera i ; według mojej wiedzy nigdy nie działał w Internet Explorerze ani Firefoxie.

Zostało to omówione podczas opracowywania HTML 5 i zostało odrzucone, ponieważ narusza kompatybilność przeglądarki . Strony internetowe, które zamykają się automatycznie, mogą nie wyświetlać się poprawnie (jeśli w ogóle) w starych przeglądarkach. Były też inne propozycje , ale nie mogą też rozwiązać problemu ze zgodnością.

Po wydaniu wersji roboczej WebKit zaktualizował analizator składni, aby był zgodny.

Samozamykanie <script>nie występuje w HTML 5 z powodu wstecznej kompatybilności z HTML 4 i XHTML 1.


XHTML 1 / XHTML 5

Gdy naprawdę służy jako XHTML, <script/>jest naprawdę zamknięty, jak podają inne odpowiedzi .

Z wyjątkiem tego, że specyfikacja mówi, że powinna była działać, gdy jest serwowana jako HTML:

Dokumenty XHTML ... mogą być oznaczone etykietą Internet Media Type „text / html” [RFC2854], ponieważ są one kompatybilne z większością przeglądarek HTML.

Więc co się stało?

Ludzie prosili Mozillę, aby Firefox parsowała dokumenty zgodne ze standardem XHTML bez względu na określony nagłówek treści (znany jako wąchanie zawartości ). Pozwoliłoby to na samozamykające się skrypty, a wąchanie zawartości było i tak konieczne, ponieważ hosty internetowe nie były wystarczająco dojrzałe, aby wyświetlać poprawny nagłówek; IE był w tym dobry .

Jeśli pierwsza wojna przeglądarki nie zakończyła się na IE 6, XHTML mógł być również na liście. Ale to się skończyło. I IE 6 ma problem z XHTML. W rzeczywistości IE nie wspiera prawidłowy typ MIME w ogóle , zmuszając wszystkich do korzystania text/htmlz XHTML, ponieważ IE odbyła poważny udział w rynku na całe dziesięciolecia.

A także wąchanie treści może być naprawdę złe, a ludzie mówią, że należy go zatrzymać .

Wreszcie okazuje się, że W3C nie oznaczało, że XHTML może być wąchany : dokumentem jest zarówno HTML, jak i XHTML oraz Content-Typereguły. Można powiedzieć, że zdecydowanie „po prostu przestrzegaj naszej specyfikacji” i ignorując to, co było praktyczne . Pomyłka, że kontynuowane w późniejszych wersjach XHTML.

W każdym razie ta decyzja rozstrzygnęła sprawę dla Firefoksa. Minęło 7 lat, zanim narodził się Chrome ; nie było innej znaczącej przeglądarki. Tak postanowiono.

Samo określenie typu dokumentu nie powoduje analizowania XML ze względu na następujące specyfikacje.

Owcze
źródło
1
@AndyE Kiedy piszesz samozamykający się <skrypt>, główne przeglądarki w tym czasie nie sądzą, że jest zamknięty i przeanalizują podsekwencję HTML jako javascript, powodując uszkodzenie prawidłowego HTML5 na tych starych przeglądarkach. Dlatego wniosek został odrzucony. Wyjaśniono to na dołączonej liście mailingowej HTML5.
Sheepy
2
@AndyE: Opisujesz kompatybilność do przodu - zdolność starego kodu do pracy z nowym kompilatorem / interpreterem / parserem. Kompatybilność wsteczna to zdolność nowego kodu do pracy ze starym kompilatorem / interpreterem / parserem. Tak, problem polegał na kompatybilności wstecznej, ponieważ w przeciwnym razie strony napisane z myślą o nowej specyfikacji nie działałyby w starych przeglądarkach (i tak, tradycją jest programowanie sieciowe, aby starać się, aby nowy kod działał w miarę możliwości w starych przeglądarkach).
slebetman,
3
@Dmitry Rzeczywistość jest taka, że ​​nie zezwalanie na samozamykający się skrypt to ulica jednokierunkowa. Po połączeniu , samozamykający się <skrypt> zepsuje wszystkie przeglądarki, użytkownicy po prostu zobaczą pustą stronę - konsole do gier, telewizję internetową, IE 11 na nowym korporacyjnym komputerze Win7, miliony czasu wykonywania Java lub miliardy smartfonów. Czy możesz uaktualnić większość WebView większości języków na większości urządzeń? Gdyby HTML5 próbował, nie udałoby się to jak XHTML2.
Owca
6
bardzo niedoceniana odpowiedź
Kamil Tomšík
2
Trochę korekty: tagi, które wydają się działać w HTML jako samozamykające się, nie są tagami z opcjonalnymi tagami końcowymi, ale tagami z zabronionymi tagami końcowymi (tagi puste lub nieważne). Tagi z opcjonalnymi tagami końcowymi, takimi jak <p>lub <li>, nie mogą być „samozamykające się”, ponieważ mogą zawierać treść, więc kod podobny <p/>jest niczym więcej niż (zniekształcony) tag początkowy i treść po nim, jeśli jest dozwolony w tym elemencie skończyłby w nim.
Ilya Streltsyn
44

Internet Explorer 8 i wcześniejsze nie obsługują parsowania XHTML. Nawet jeśli używasz deklaracji XML i / lub typu XHTML, stary IE nadal analizuje dokument jako zwykły HTML. I w zwykłym HTML, samozamykająca się składnia nie jest obsługiwana. Końcowy ukośnik jest po prostu ignorowany, musisz użyć jawnego znacznika zamykającego.

Nawet przeglądarki obsługujące parsowanie XHTML, takie jak IE 9 i nowsze wersje, nadal będą analizować dokument jako HTML, chyba że dokument zostanie udostępniony z typem treści XML. Ale w takim przypadku stary IE w ogóle nie wyświetli dokumentu!

JacquesB
źródło
9
„IE nie obsługuje parsowania XHTML.” było prawdziwe dla wersji IE w czasie, gdy zostało napisane, ale nie jest już prawdą.
EricLaw,
@EricLaw czy możesz wyjaśnić, która wersja IE to naprawiła? (oraz wszelkie szczególne warunki - np. wymagany ważny typ dokumentu)
scunliffe
2
@scunliffe IE9 to pierwsza wersja z pełnym wsparciem dla XHTML. blogs.msdn.com/b/ie/archive/2010/11/01/…
EricLaw
28

Ludzie powyżej wyjaśnili już ten problem, ale jedną rzeczą, która może to wyjaśnić, jest to, że chociaż ludzie używają <br/>i tak przez cały czas w dokumentach HTML, każdy /w takiej pozycji jest w zasadzie ignorowany i używany tylko podczas próby coś zarówno analizowalnego jak XML i HTML. Spróbuj <p/>foo</p>na przykład, a otrzymasz zwykły akapit.

Marijn
źródło
22

Samozamykający się tag skryptu nie będzie działał, ponieważ tag skryptu może zawierać kod wbudowany, a HTML nie jest wystarczająco inteligentny, aby włączyć lub wyłączyć tę funkcję na podstawie obecności atrybutu.

Z drugiej strony HTML ma doskonały znacznik do dołączania odwołań do zasobów zewnętrznych: <link>znacznik i może sam się zamykać. Jest już używany do dołączania arkuszy stylów, kanałów RSS i Atom, kanonicznych identyfikatorów URI i wszelkiego rodzaju innych gadżetów. Dlaczego nie JavaScript?

Jeśli chcesz, aby tag skryptu był samozamykający, nie możesz tego zrobić, jak powiedziałem, ale istnieje alternatywa, choć nie mądra. Możesz użyć tagu samozamykającego linku i linku do skryptu JavaScript, nadając mu typ text / javascript i rel jako skrypt, podobnie jak poniżej:

<link type="text/javascript" rel ="script" href="/path/tp/javascript" />
defau1t
źródło
4
Podoba mi się to, dlaczego nie jest „mądre”?
Josh M.,
5
Ponieważ istnieje predefiniowany tag skryptu, który wykonuje dokładnie zadanie ładowania skryptu. Dlaczego miałbyś mylić sprawy, używając czegoś innego? Młotek w gwoździach. Czy mądrze byłoby używać buta?
Dave Lawrence
8
@daveL - Mamy <style>tagi, ale używamy tagów linków do zewnętrznych plików CSS. Definicja tagu link: Tag <link> definiuje link między dokumentem a zasobem zewnętrznym.” Wydaje się całkowicie logiczne, że tag link byłby używany do zewnętrznego CSS lub JS ... to jest to ... do łączenia w plikach zewnętrznych. uwaga : nie mówię o spec / cross-browserness / etc, po prostu komentuję logiczną naturę używania tagów link do wprowadzenia zarówno CSS, jak i JS ... to naprawdę miałoby sens, gdyby tak było . Nie jestem pewien, czy but [analogia] pasuje.
Jimbo Jonny
20

W przeciwieństwie do XML i XHTML, HTML nie ma wiedzy o składni samozamykającej. Przeglądarki, które interpretują XHTML jako HTML, nie wiedzą, że /znak wskazuje, że tag powinien się samozamykać; zamiast tego interpretują go jak pusty atrybut, a parser nadal uważa, że ​​tag jest „otwarty”.

Tak jak <script defer>jest traktowane jako <script defer="defer">, <script />jest traktowane jako <script /="/">.

rpetrich
źródło
33
Choć to wyjaśnienie jest eleganckie, w rzeczywistości jest błędne. Gdyby tak było, istniałby atrybut „/” dla elementu skryptu w DOM. Sprawdziłem IE, Firefox i Operę i żadne z nich nie zawiera takiego atrybutu.
Alohci
11
/ nie jest prawidłowym znakiem nazwy atrybutu, więc zostaje odrzucony. W przeciwnym razie to wyjaśnienie jest dość jasne.
korytarze - przywróć Monikę
1
W rzeczywistości niektóre parsery HTML (a zwłaszcza walidatory) mogą interpretować /jako część konstrukcji NET (Null End Tag).
IllidanS4 chce, aby Monica wróciła
18

Internet Explorer 8 i starszych nie obsługują odpowiedni typ MIME dla XHTML application/xhtml+xml. Jeśli podajesz XHTML as text/html, co musisz zrobić, aby te starsze wersje Internet Explorera zrobiły cokolwiek, będzie to interpretowane jako HTML 4.01. Krótkiej składni można używać tylko z dowolnym elementem, który pozwala na pominięcie znacznika zamykającego. Zobacz specyfikację HTML 4.01 .

„Skrócona forma” XML jest interpretowana jako atrybut o nazwie /, który (ponieważ nie ma znaku równości) jest interpretowany jako posiadający domyślną wartość „/”. Jest to całkowicie błędne w HTML 4.01 - niezadeklarowane atrybuty są niedozwolone - ale przeglądarki to zignorują.

IE9 i nowsze wersje obsługują XHTML 5 obsługiwany z application/xhtml+xml.

Mike Dimmick
źródło
IE 9 obsługuje XHTML, a IE nie jest już> 51%. Czy możesz zaktualizować swoją odpowiedź?
Damian Yerrick
5

To dlatego, że TAG SKRIPU nie jest ELEMENTEM PUSTYM.

W dokumencie HTML - VOID ELEMENTS wcale nie potrzebują „tagu zamykającego”!

W xhtml wszystko jest ogólne, dlatego wszystkie wymagają zakończenia, np. „Tag zamykający”; W tym br, prosty podział linii, as <br></br>lub jego skrót <br /> .

Jednak element skryptu nigdy nie jest pustym ani parametrycznym elementem, ponieważ znacznik skryptu jest przede wszystkim instrukcją przeglądarki, a nie deklaracją opisu danych.

Zasadniczo semantyczna instrukcja kończąca, np. „Znacznik zamykający” jest potrzebna tylko do przetwarzania instrukcji, których semantyki nie można zakończyć przez kolejny znacznik. Na przykład:

<H1>semantyka nie może być zakończona przez następujące, <P>ponieważ nie ma wystarczającej ilości własnej semantyki, aby zastąpić, a zatem zakończyć poprzedni zestaw instrukcji H1. Chociaż będzie w stanie podzielić strumień na nową linię akapitu, nie jest on „wystarczająco silny”, aby zastąpić obecny rozmiar czcionki i wysokość linii stylu, zlewając strumień , tj. Wyciek z H1 (ponieważ P go nie ma ).

W ten sposób i dlaczego wynaleziono sygnalizację „/” (zakończenie).

Ogólny znacznik zakończenia bez opisu, taki jak < />, byłby wystarczający dla każdego pojedynczego upadku napotkanej kaskady, np .: <H1>Title< />ale nie zawsze tak jest, ponieważ chcemy również być w stanie „zagnieżdżać”, wielokrotne pośrednie tagowanie strumienia: split w torrenty przed owijaniem / spadaniem na inną kaskadę. W rezultacie ogólny terminator, taki jak < />, nie byłby w stanie określić celu właściwości do zakończenia. Na przykład: <b>pogrubienie <i>pogrubienie-kursywa < /> kursywa </> normalna. Bez wątpienia nie uda nam się zrealizować naszej intencji i najprawdopodobniej zinterpretuje ją jako odważną, odważną, metaliczną, odważną normalność.

Tak narodziło się pojęcie opakowania, tzn. Pojemnika. (Te pojęcia są tak podobne, że nie można ich rozróżnić, a czasami ten sam element może mieć oba. <H1>Jest jednocześnie opakowaniem i pojemnikiem w tym samym czasie. Natomiast <B>tylko opakowanie semantyczne). Będziemy potrzebować zwykłego kontenera bez semantyki. I oczywiście przyszedł wynalazek elementu DIV.

Element DIV jest tak naprawdę kontenerem 2BR. Oczywiście pojawienie się CSS sprawiło, że cała sytuacja była dziwniejsza niż w innym przypadku i spowodowała wielkie zamieszanie z wieloma wielkimi konsekwencjami - pośrednio!

Ponieważ w CSS można łatwo zastąpić natywne zachowanie przed i po BR nowo wynalezionego DIV, często nazywane jest to „kontenerem nic nie rób”. Co jest oczywiście błędne! DIV są elementami blokowymi i natywnie przerywają linię strumienia zarówno przed, jak i po sygnalizacji końcowej. Wkrótce sieć zaczęła cierpieć na stronę DIV-itis. Większość z nich jest nadal.

Pojawienie się CSS z możliwością pełnego zastąpienia i ponownego zdefiniowania natywnego zachowania dowolnego tagu HTML, w jakiś sposób zdezorientowało i zatarło całe znaczenie istnienia HTML ...

Nagle wszystkie tagi HTML wyglądały na przestarzałe, zostały zamazane, pozbawione pierwotnego znaczenia, tożsamości i celu. W jakiś sposób uzyskasz wrażenie, że nie są już potrzebne. Mówiąc: Pojedynczy znacznik opakowania byłby wystarczający dla wszystkich prezentacji danych. Po prostu dodaj wymagane atrybuty. Dlaczego zamiast tego nie mieć znaczących znaczników; Wymyślaj nazwy znaczników w trakcie pracy i pozwól CSS zawracać sobie głowę resztą.

Tak narodził się xhtml i oczywiście wielki tępak, który tak drogo opłacali nowi przybysze, i zniekształcona wizja tego, co jest i do czego to cholerny cel. W3C przeszło z World Wide Web na What Went Wrong, towarzysze? !!

Celem HTML jest przesyłanie znaczących danych do odbiorcy.

Aby dostarczyć informacje.

Część formalna ma na celu jedynie zwiększenie przejrzystości dostarczania informacji. xhtml nie uwzględnia w najmniejszym stopniu informacji. - Dla tego informacja jest absolutnie nieistotna.

Najważniejsze w tej sprawie jest to, aby wiedzieć i być w stanie zrozumieć, że xhtml to nie tylko wersja rozszerzonego HTML , xhtml to zupełnie inna bestia; podstawa; i dlatego mądrze jest trzymać je oddzielnie.

Bekim Bacaj
źródło
3

Różnica między „prawdziwym XHTML”, „fałszywym XHTML” i HTML, a także znaczenie typu MIME wysyłanego przez serwer zostały już tutaj dobrze opisane . Jeśli chcesz go teraz wypróbować, oto prosty edytowalny fragment kodu z podglądem na żywo, w tym samozamykający się tag skryptu dla odpowiednich przeglądarek:

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>

Powinieneś zobaczyć Hello, true XHTML. Nice to meet you!poniżej textarea.

W przypadku niezdolnych przeglądarek możesz skopiować zawartość obszaru tekstowego i zapisać go jako plik z .xhtml(lub .xht) rozszerzeniem ( dzięki Alek za tę podpowiedź ).

myf
źródło