Was ist, wenn benutzerdefinierte HTML-Attribute kein gültiges XHTML sind?


78

Ich weiß, das ist der Grund, warum manche Leute sie nicht gutheißen, aber ist das wirklich wichtig? Ich denke, dass die Leistung, die sie bei der Interaktion mit JavaScript und beim Speichern und Senden von Informationen vom und zum Server bieten, die Bedenken hinsichtlich der Validierung überwiegt. Vermisse ich etwas Was sind die Auswirkungen von "ungültigem" HTML? Und würde eine benutzerdefinierte DTD sie nicht trotzdem lösen?


21
Ich wünschte wirklich, so viele Programmierer wären nicht von Validierung besessen. Dies ist eine dieser Situationen, in denen mein erster Gedanke genau "na und?" Ist. Die meisten Leute denken, dass Blasphemie leider ...
Paolo Bergantino

1
Ich stimme Ihnen zu, aber ich wollte die Gegenargumente hören.
Constantine


10
Ich möchte wissen, dass ich bestätige ... Es macht mich warm und verschwommen
Alex

5
Validieren ist schön. Eine andere Sache ist es, die Interessen Ihres Projekts zur Validierung aufs Spiel zu setzen. Richtige schließende Tags, richtige Syntax, das sind Dinge, die ich hinter mich bringen kann. Eine Lösung wegzuwerfen, weil sie nicht validiert wird, ist eine andere Geschichte. Es gibt einen Grund, warum nur 2 der 1000 besten Websites im Internet validieren. Ich ziehe es vor, Dinge zu erledigen.
Paolo Bergantino

Antworten:


76

Die Konsequenz ist, dass w3c in 2, 5, 10 Jahren erscheint und ein Attribut mit demselben Namen erstellt. Jetzt ist Ihre Seite kaputt.

HTML5 wird einen Datenattributtyp für legale benutzerdefinierte Attribute bereitstellen (wie data-myattr = "foo"), sodass Sie diesen möglicherweise jetzt verwenden und vor zukünftigen Namenskollisionen einigermaßen sicher sein können.

Schließlich übersehen Sie möglicherweise, dass die benutzerdefinierte Logik das Rationale hinter dem Klassenattribut ist. Obwohl es allgemein als Stilattribut angesehen wird, ist es in Wirklichkeit eine legale Möglichkeit, benutzerdefinierte Meta-Eigenschaften für ein Element festzulegen. Leider sind Sie grundsätzlich auf boolesche Eigenschaften beschränkt, weshalb HTML5 das Datenpräfix hinzufügt.

Übrigens meine ich mit "im Grunde boolesch" im Prinzip. In Wirklichkeit hindert Sie nichts daran, einen Trennzeichen in Ihrem Klassennamen zu verwenden, um benutzerdefinierte Werte sowie Attribute zu definieren.

class="document docId.56 permissions.RW"


4
Kann durch Präfixieren gelöst werden. Ganz zu schweigen davon, dass echtes XHTML von Namespaces profitieren kann, aber echtes XHTML ist sowieso selten.
Ionuț G. Stan

3
Ich denke, dies ist ein guter Einwand, obwohl es in vielen Beispielen, die ich mir in jüngsten Projekten ausgedacht habe, keine Gefahr darstellt. (Wird "disbursementId" wahrscheinlich zu einem w3c-Attribut?) Wenn Sie jedoch wissen, warum etwas vermieden werden sollte, erfahren Sie auch, wann es nicht vermieden werden muss.
Constantine

3
Auch wenn etwas nicht zum W3C-Standard wird, kann es in einer proprietären Browsererweiterung, einer Browser-Plugin-Erweiterung oder einem JavaScript eines Drittanbieters verwendet werden, das Sie verwenden möchten. Sie können die Wahrscheinlichkeit einer Kollision verringern, aber wenn Sie nicht standardmäßige Attribute verwenden, wird dies vollständig vermieden.
Quentin

2
Ist es nicht auch plausibel, dass eine proprietäre Browsererweiterung auch die Datennamenskonvention verwendet?
Schmiede

1
Als ein anderer Entwicklerkommentar zum Punkttrennzeichen - es könnte die Klassenselektoren beschädigen: class="thingType.image"-> Denken Sie über das Targeting nach .thingType.image{}oder $('.thingType.image').
Joel Peltonen

22

Ja, Sie können mithilfe von "Daten" legal benutzerdefinierte Attribute hinzufügen.

Zum Beispiel:

<div id="testDiv" data-myData="just testing"></div>

Verwenden Sie danach einfach die neueste Version von jquery, um Folgendes zu tun:

alert($('#testDiv').data('myData'))

oder um ein Datenattribut festzulegen:

$('#testDiv').data('myData', 'new custom data')

Und da jQuery in fast allen Browsern funktioniert, sollten Sie keine Probleme haben;)

aktualisieren

  • data-myData kann in einigen Browsern in Bezug auf die Javascript-Engine in data-mydata konvertiert werden. Halten Sie es am besten ganz in Kleinbuchstaben.

2
Vielen Dank für die Erwähnung von jQuery.data () - macht es nicht nur cool, sondern auch elegant!
Victor Farazdagi

Hinweis: Gemäß dem Standard werden durch Bindestriche getrennte Datenattribute in Javascript in camelCase konvertiert. Sie könnten also data-my-data verwenden und es wäre myData in Javascript.
Matt Browne

10

Die Validierung ist kein Selbstzweck, sondern ein Tool, mit dem Sie Fehler frühzeitig erkennen und die Anzahl mysteriöser Rendering- und Verhaltensprobleme verringern können, mit denen Ihre Webseiten möglicherweise konfrontiert sind, wenn sie in mehreren Browsertypen verwendet werden.

Das Hinzufügen von benutzerdefinierten Attributen wirkt sich derzeit nicht auf eines dieser Probleme aus und wird dies in Zukunft wahrscheinlich nicht tun. Da diese jedoch nicht validiert werden, müssen Sie dies tun, wenn Sie die Ausgabe einer Validierung Ihrer Seite bewerten möchten Wählen Sie sorgfältig zwischen den wichtigen Validierungsproblemen und denen, die dies nicht tun. Jedes Mal, wenn Sie Ihre Seite ändern und erneut validieren, müssen Sie diesen Vorgang wiederholen. Wenn Ihre Seite vollständig validiert ist, erhalten Sie eine schöne grüne PASS-Nachricht, und Sie können mit der nächsten Testphase oder der nächsten Änderung fortfahren, die vorgenommen werden muss.


8

Ich habe Leute gesehen, die von Validierung besessen sind und weitaus schlimmere / seltsamere Dinge tun als ein einfaches benutzerdefiniertes Attribut:

<base href="http://example.com/" /><!--[if IE]></base><![endif]-->

Meiner Meinung nach spielen benutzerdefinierte Attribute wirklich keine Rolle. Wie andere sagen, kann es gut sein, auf zukünftige Ergänzungen von Attributen in den Standards zu achten. Aber jetzt haben wir Daten- * Attribute in HTML5, also sind wir gespeichert.

Was wirklich wichtig ist, ist, dass Sie richtig verschachtelte Tags und richtig zitierte Attributwerte haben.

Ich verwende sogar benutzerdefinierte Tag-Namen (die von HTML5 eingeführten, wie Kopf-, Fuß- usw.), aber diese haben Probleme im IE.

Übrigens finde ich oft ironisch, wie sich all diese Validierungs-Fanatiker vor Googles cleveren Tricks wie Iframe-Uploads verneigen.


7

Anstatt benutzerdefinierte Attribute zu verwenden, können Sie Ihre HTML-Elemente mit JSON den Attributen zuordnen:

var customAttributes = { 'Id1': { 'custAttrib1': '', ... }, ... };

Und was die Konsequenzen angeht , siehe SpliFFs Antwort .


Ordentliche und prägnante Lösung - nur durch die Tatsache enttäuscht, dass das Element und die Attribute nicht zusammen gespeichert werden.
Belugabob

Ich bin mir nicht sicher, ob dies besser ist, als nur die Daten als (JavaScript-) Eigenschaften des DOM-Elementobjekts (object.attribute = "value") zu speichern. Ich weiß, dass Safari Empfehlungen dazu hat.
Ionuț G. Stan

@Ionut, das kann auch gemacht werden; Aber dann müssen wir die DOM-Objekte erstellen und im Speicher speichern.
Kirtan

5

Das Speichern mehrerer Werte im Klassenattribut ist keine korrekte Codekapselung und nur eine komplizierte Hack-Methode. Nehmen Sie zum Beispiel einen benutzerdefinierten Anzeigenrotator, der jquery verwendet. Es ist viel sauberer auf der Seite zu tun

<div class="left blue imagerotator" AdsImagesDir="images/ads/" startWithImage="0" endWithImage="10" rotatorTimerSeconds="3" />

und lassen Sie einen einfachen JQuery-Code die Arbeit von hier aus erledigen. Jeder Entwickler oder Webdesigner kann jetzt am Anzeigenrotator arbeiten und die Werte ändern, wenn er ohne viel Aufforderung dazu aufgefordert wird.

Ein Jahr später zum Projekt zurückzukehren oder zu einem neuen zu wechseln, bei dem sich der vorherige Entwickler trennte und auf eine Insel irgendwo im Pazifik ging, kann die Hölle sein, wenn man versucht, Absichten herauszufinden, wenn Code auf eine unklare verschlüsselte Weise wie diese geschrieben wird:

<div class="left blue imagerotator dir:images-ads endwith:10 t:3 tf:yes"  />

Wenn wir Code in c # und anderen Sprachen schreiben, schreiben wir keinen Code, der alle benutzerdefinierten Eigenschaften in einer Eigenschaft als durch Leerzeichen getrennte Zeichenfolge platziert, und müssen diese Zeichenfolge jedes Mal analysieren, wenn wir darauf zugreifen oder darauf schreiben müssen. Denken Sie an die nächste Person, die an Ihrem Code arbeitet.


2
Ihre Behauptung, dass einer verwirrender ist als der andere, wird nur durch Ihre eigene Meinung gestützt. In beiden Fällen müssten Sie die Attribute irgendwo dokumentieren, damit die nächste Person mit beiden Formaten arbeiten kann. Die Tatsache, dass Sie die Bezeichner in Ihrem zweiten Beispiel absichtlich in vage Abkürzungen geändert haben, um einen Punkt zu verdeutlichen, zeigt, dass Sie überhaupt keine hatten.
SpliFF

2

Die Sache mit der Validierung ist, dass es HEUTE vielleicht keine Rolle spielt, aber Sie können nicht wissen, ob es morgen eine Rolle spielt (und nach Murphys Gesetz wird es morgen eine Rolle spielen).

Es ist einfach besser, eine zukunftssichere Alternative zu wählen. Wenn sie nicht existieren ( in diesem speziellen Fall ), müssen Sie eine zukunftssichere Alternative erfinden.

Die Verwendung benutzerdefinierter Attribute ist wahrscheinlich harmlos. Warum sollten Sie jedoch eine potenziell schädliche Lösung wählen, nur weil Sie der Meinung sind (Sie können nie sicher sein), dass sie keinen Schaden anrichtet? Es könnte sich lohnen, dies weiter zu diskutieren, wenn die zukunftssichere Alternative zu kostspielig oder unhandlich wäre, aber dies ist sicherlich nicht der Fall.


Welches schlagen Sie in der Frage vor, mit der Sie verlinkt haben? Die am besten gewählte Antwort wird nicht als XHTML
Paolo Bergantino

1
Die Antwort mit der höchsten Bewertung ist nicht konstant, daher kann ich nicht wissen, worauf Sie sich beziehen. Auf jeden Fall hatte ich die XHTML-Tags in der Frage verpasst.
Vinko Vrsalovic

Darüber hinaus scheint der Kommentaransatz zukunftssicher genug zu sein, da JavaScript zum Speichern der Daten anstelle von benutzerdefinierten Attributen verwendet wird. Ich mag auch den HTML5-Ansatz, der auf einen zukünftigen Standard setzt.
Vinko Vrsalovic

2

Alte Diskussion aber trotzdem; Meiner Meinung nach ist HTML ein Markup und keine Programmiersprache. Daher sollte es für Markup-Fehler immer mit Nachsicht interpretiert werden. Ein Browser ist dazu in der Lage. Ich denke nicht, dass sich dies jemals ändern wird und sollte. Daher ist das einzige wichtige praktische Kriterium, dass Ihr HTML von den meisten Browsern korrekt angezeigt wird und dies auch in einigen Jahren tun wird. Nach dieser Zeit wird Ihr HTML-Code wahrscheinlich trotzdem neu gestaltet.


2

Um meine Zutat in die Mischung aufzunehmen, ist die Validierung auch wichtig, wenn Sie Inhalte erstellen müssen, die mit automatisierten Tools nachbearbeitet werden können / könnten. Wenn Ihr Inhalt gültig ist, können Sie Markups viel einfacher von einem Format in ein anderes konvertieren. Beispielsweise ist es viel einfacher, gültiges XHTML in XML mit einem bestimmten Schema auszuführen, wenn Sie Daten analysieren, die Sie kennen und überprüfen können, um einem vorhersehbaren Format zu folgen.

Ich brauche zum Beispiel, dass mein Inhalt gültiges XHTML ist, da er sehr oft für verschiedene Jobs in XML konvertiert und dann ohne Datenverlust oder unerwartete Rendering-Ergebnisse zurückkonvertiert wird.


1

Nun, es hängt von Ihrem Kunden / Chef / etc ab. Benötigen sie die Validierung von XHTML?

Einige Leute sagen, es gibt viele Problemumgehungen - und je nach Szenario können sie großartig funktionieren. Dies umfasst das Hinzufügen von Klassen, die Nutzung des relAttributs und jemanden, der sogar einen eigenen Parser geschrieben hat, um JSON aus HTML-Kommentaren zu extrahieren.

HTML5 bietet eine Standardmethode, indem Sie Ihren benutzerdefinierten Attributen "data-" voranstellen. Ich würde dies jetzt sowieso empfehlen, da die Möglichkeit besteht, dass Sie ein Attribut verwenden, das später in Standard-XHTML verwendet wird.


0

Die Verwendung von nicht standardmäßigem HTML kann dazu führen, dass der Browser die Seite im "Mackenmodus" rendert. In diesem Fall werden einige andere Teile der Seite möglicherweise anders gerendert, und andere Dinge wie die Positionierung können geringfügig abweichen. Die Verwendung einer benutzerdefinierten DTD kann dies jedoch umgehen.


2
Eine benutzerdefinierte DTD macht die Sache normalerweise schlimmer als benutzerdefinierte Attribute. Und löst kein anderes Problem als Validierungswarnungen, da Browser Doctypes ignorieren.
Ionuț G. Stan

Können Sie ein Beispiel für einen Browser geben, der durch benutzerdefinierte Attribute in den Mackenmodus versetzt wird, wenn Sie einen gültigen DOCTYPE haben? Das klingt für mich unwahrscheinlich ...
Paolo Bergantino

AFAIK Die meisten Browser sollten in Ordnung sein, solange es ein <! DOCTYPE-HTML> gibt. Deshalb schlägt HTML 5 nur vor, genau das zu verwenden (dh keine PUBLIC-ID oder keinen SYSTEM-Pfad). Browser lesen ohnehin keine DTDs, da Browser nicht validieren. Im Allgemeinen sollten sie nicht einmal brechen, wenn sie mit benutzerdefinierten Elementen konfrontiert werden (aus diesem Grund funktionieren HTML 5-Elemente überhaupt).
Alan Plum

Browser werden sowieso verschiedene DTDs ausprobieren, wenn sie versuchen, eine Seite zu rendern
Radek

0

Da sie nicht zum Standard gehören, wissen Sie weder jetzt noch in Zukunft, was passieren könnte. Wie andere gesagt haben, könnte W3C in Zukunft dieselben Namen verwenden. Noch gefährlicher ist jedoch, dass Sie nicht wissen, was die Entwickler von "browser xxx" getan haben, wenn sie auf sie stoßen.

Vielleicht ist die Seite im Quirks - Modus gerendert, vielleicht die Seite nicht rendert alle auf einem obskuren mobilen Browser, vielleicht wird der Browser eines Speicherleck, vielleicht ein Virus Killer auf Ihrer Seite ersticken, etc, etc, etc.

Ich weiß, dass das religiöse Befolgen der Standards wie Snobismus erscheinen kann. Sobald Sie jedoch Probleme haben, weil Sie ihnen nicht folgen, neigen Sie dazu, nicht mehr so ​​zu denken. Dann ist es jedoch meistens zu spät und Sie müssen Ihre Anwendung mit einem anderen Framework von Grund auf neu starten ...


1
Dies klingt eher nach Angstmacherei als nach einem legitimen Grund, benutzerdefinierte Attribute zu vermeiden. Seite wird aufgrund eines benutzerdefinierten Attributs überhaupt nicht gerendert? Ja wirklich? Speicherleck? Ja wirklich?
Paolo Bergantino

2
Wissen Sie, was "undefiniertes Verhalten" bedeutet, Paolo? Wenn Sie C für eine Weile codiert haben, entwickeln Sie eine sehr gesunde, sehr berechtigte Angst davor. Die meisten Browser behandeln die meisten Seiten mit Kinderhandschuhen. Sehen Sie sich jedoch alle von IE 7/8 "kaputten" Seiten an, um festzustellen, wohin die Richtlinie führt, sich auf nicht standardmäßiges Verhalten zu verlassen.
Chuck

2
... @ Paolo ... Dies ist nicht einer dieser Fälle, dies ist eher der Fall, in dem Sie falsch liegen und Chuck Recht hat ...;)
Thomas Hansen

0

Ich denke, Entwickler validieren nur, um zu validieren, aber es gibt etwas zu sagen, weil es das Markup sauber hält. Da jedoch jeder (Übertreibungswarnung!) Browser alles anders anzeigt, gibt es wirklich keinen Standard. Wir versuchen, Standards zu folgen, weil wir das Gefühl haben, zumindest eine Richtung zu haben. Einige Leute argumentieren, dass das Beibehalten des Code-Standards Probleme und Konflikte in Zukunft verhindern wird. Meine Meinung: Scheiße, dass heute sowieso niemand Standards korrekt und vollständig implementiert, könnte genauso gut davon ausgehen, dass Ihr gesamter Code irgendwann fehlschlägt. Wenn es funktioniert, funktioniert es, verwenden Sie es, es sei denn, es ist chaotisch oder Sie versuchen nur, Standards zu ignorieren, um es an W3C oder so zu halten. Ich denke, es ist wichtig, sich daran zu erinnern, dass Standards sehr langsam implementiert werden. Hat sich das Web in 5 Jahren so sehr verändert? ICH' Ich bin mir sicher, dass jeder jahrelang benachrichtigt wird, wenn er einen potenziellen Konflikt beheben muss. Kein Grund, die Kompatibilität von Standards in Zukunft zu planen, wenn Sie sich nicht einmal auf die heutigen Standards verlassen können.

Oh, ich hätte fast vergessen, wenn Ihr Code nicht bestätigt, dass 10 Babykätzchen sterben werden. Bist du ein Kätzchenkiller?


0

Jquery .html (Markup) funktioniert nicht, wenn das Markup ungültig ist.


Es wäre genauer zu sagen, dass es nicht funktioniert, wenn der Browser es nicht analysieren kann. Obwohl benutzerdefinierte Attribute "ungültig" sind, können alle Browser sie analysieren, sodass .html () einwandfrei funktioniert.
Matt Browne

0

Validierung

Sie sollten keine benutzerdefinierten Attribute benötigen, um die Validierung bereitzustellen. Ein besserer Ansatz wäre das Hinzufügen einer Validierung basierend auf der tatsächlichen Aufgabe der Felder.

Weisen Sie mithilfe von Klassen eine Bedeutung zu. Ich habe Klassennamen wie:

  • date (Termine)
  • zip (Postleitzahl)
  • area (Bereiche)
  • ssn (Sozialversicherungsnummer)

Beispiel-Markup:

<input class="date" name="date" value="2011-08-09" />

Beispiel Javascript (mit jQuery):

$('.date').validate(); // use your custom function/framework etc here.

Wenn Sie spezielle Validatoren für ein bestimmtes Szenario benötigen, erfinden Sie einfach neue Klassen (oder verwenden Selektoren ) für Ihren speziellen Fall:

Beispiel für die Überprüfung, ob zwei Passwörter übereinstimmen:

<input id="password" />
<input id="password-confirm" />

if($('#password').val() != $('#password-confirm').val())
{
 // do something if the passwords don't match
}

(Dieser Ansatz funktioniert ziemlich nahtlos sowohl mit der jQuery-Validierung als auch mit dem mvc .net-Framework und wahrscheinlich auch mit anderen.)

Bonus: Sie können mehrere Klassen zuweisen, die durch eine Leerzeichenklasse getrennt sind = "ssn custom-one custom-two"

Senden von Informationen "vom und zum Server"

Wenn Sie Daten zurückgeben müssen, verwenden Sie <input type="hidden" />. Sie arbeiten sofort.

(Stellen Sie sicher, dass Sie keine vertraulichen Daten mit versteckten Eingaben übergeben, da diese vom Benutzer fast ohne Aufwand geändert werden können.)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.