2009-04-01 8 views
16

Certains attributs HTML sont des "booléens" - les navigateurs les traitent comme "vrais" s'ils sont présents, quelle que soit la valeur. Un exemple d'un tel attribut est sélectionné sur l'étiquette <option>. Un autre est vérifié sur <input type="checkbox">.Attributs HTML booléens

Si vous avez un appel à setAttribute() pour un tel attribut, il ne semble y avoir aucune valeur que vous pouvez définir pour que les navigateurs se comportent de manière cohérente comme si l'attribut était manquant.

Par exemple

option.setAttribute("selected", false) 

marquera toujours l'option sélectionnée. null, chaîne vide ou undefined ne fonctionnent pas non plus. Si quelqu'un connaît une valeur que je peux définir pour atteindre mon objectif, s'il vous plaît faites le moi savoir, mais je ne pense pas qu'il existe. (En raison de un code-cadre que je l'utilise, pas appeler setAttribute(), ou en appelant removeAttribute() est difficile.)

J'essaie de trouver une liste exhaustive de ces attributs à leur cas particulier. Voici ce que j'ai jusqu'à présent:

  • sélectionné de <option>
  • vérifié de <input>
  • désactivé, readonly de <input>, <select>, <option>, <optgroup>, <button>, <textarea>
  • multiples de <select>

S'il vous plaît aidez-moi à compléter cette liste - ou à moi de un.

Répondre

24

(En raison de un code-cadre que je l'utilise, ne pas appeler setAttribute(), ou en appelant removeAttribute() est difficile.)

Ensuite, je soumettrais que le code de l'infrastructure a besoin d'être corrigé, ou de dumping.

Vous ne pouvez pas définir Attribut pour annuler la définition d'un attribut, par définition. Toute solution trouvée impliquant des valeurs hors bande comme 'null', si cela fonctionnait dans un navigateur particulier, serait totalement invalide selon la norme DOM Core.

setAttribute() est dans tous les cas mieux évité dans les contextes HTML de navigateur (non-XML). IE pre-8 ne connaît pas la différence entre un attribut DOM et une propriété JavaScript, ce qui peut facilement entraîner de nombreux problèmes vraiment bizarres. Si vous essayez de définir 'checked' comme un attribut (ce que vous devriez théoriquement faire en le définissant sur la chaîne "checked"), ne vous attendez pas à ce qu'EI coopère.

La liste complète des attributs booléens en HTML 4.01 (et donc XHTML 1.0) est (avec les noms de propriétés où ils diffèrent en cas):

checked    (input type=checkbox/radio) 
selected   (option) 
disabled   (input, textarea, button, select, option, optgroup) 
readonly   (input type=text/password, textarea) 
multiple   (select) 
ismap  isMap  (img, input type=image) 

defer    (script) 
declare    (object; never used) 
noresize noResize (frame) 
nowrap noWrap (td, th; deprecated) 
noshade noShade (hr; deprecated) 
compact    (ul, ol, dl, menu, dir; deprecated) 
+0

J'ajouterais aussi un attribut ['itemscope'] (http://www.w3.org/TR/html5/microdata.html) à cette liste – Nazariy

+0

Oui, il y a potentiellement plus de bundle lorsque vous ajoutez des extensions HTML5 aujourd'hui . – bobince

+1

Voici une liste d'attributs booléens en HTML5: https://github.com/kangax/html-minifier/issues/63 Notez qu'il inclut quelques attributs non-booléens qui ont un comportement similaire (ie la valeur de chaîne vide correspond à un valeur par défaut différente), telles que 'contenteditable' et' spellcheck'. –

2

sur des cellules de tableau, par ex. TD, TH

nowrap 

pour l'enregistrement, pour modifier des attributs tels que vérifiés (sur les éléments case/radio) que vous pouvez faire.

myCheckBoxElem.checked = true|false; 

ou

myCheckBoxElem.checked = !myCheckBoxElem.checked;//toggles to the opposite state 
+0

Cela change la propriété, pas l'attribut. Comme je l'ai dit - je suis un peu enfermé dans setAttribute par le code d'autres personnes – levik

+0

ah, raté ce peu. pas de problème, utilisez simplement l'appel removeAttribute() que d'autres ont noté. – scunliffe

1

Tu ne peux pas utiliser juste removeAttribute()?

+0

Non. Fondamentalement, je renvoie une valeur et cette valeur est transmise à un appel setAttribute() que je ne contrôle pas. – levik

3

Essayez removeAttribute:

option.removeAttribute("selected"); 

EDIT: Après avoir lu votre commentaire, lire this à propos setAttribute. Notamment:

Même si getAttribute() renvoie null pour les attributs manquants, vous devez utiliser removeAttribute() au lieu de elt.setAttribute (attr, null) pour supprimer l'attribut.

+0

Je connais removeAttribute(). Malheureusement, le code cadre sur lequel je m'appuie rend l'appel difficile. – levik

1

Pas exactement ce que vous demandez au sujet, mais aussi la « classe » et « pour des » attributs recevoir différents noms DOM

element.className 
element.htmlFor 
Questions connexes