Donc jQuery 1.6 a la nouvelle fonction prop()
.
$(selector).click(function(){
//instead of:
this.getAttribute('style');
//do i use:
$(this).prop('style');
//or:
$(this).attr('style');
})
ou dans ce cas font-ils la même chose?
Et si je dois passer à l'utilisation prop()
, tous les anciens attr()
appels seront interrompus si je passe à 1.6?
MISE À JOUR
selector = '#id'
$(selector).click(function() {
//instead of:
var getAtt = this.getAttribute('style');
//do i use:
var thisProp = $(this).prop('style');
//or:
var thisAttr = $(this).attr('style');
console.log(getAtt, thisProp, thisAttr);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.0/jquery.min.js"></script>
<div id='id' style="color: red;background: orange;">test</div>
(voir aussi ce violon: http://jsfiddle.net/maniator/JpUF2/ )
La console enregistre en getAttribute
tant que chaîne et en attr
tant que chaîne, mais en prop
tant que CSSStyleDeclaration
, pourquoi? Et comment cela affectera-t-il mon codage à l'avenir?
Réponses:
Mise à jour 1 novembre 2012
Ma réponse originale s'applique spécifiquement à jQuery 1.6. Mon conseil reste le même mais jQuery 1.6.1 a légèrement changé les choses: face à la pile prédite de sites Web cassés, l'équipe jQuery est revenue
attr()
à quelque chose de proche (mais pas exactement le même que) son ancien comportement pour les attributs booléens . John Resig a également blogué à ce sujet . Je peux voir la difficulté dans laquelle ils se trouvaient, mais je suis toujours en désaccord avec sa recommandation de préférerattr()
.Réponse originale
Si vous n'avez utilisé que jQuery et pas le DOM directement, cela pourrait être un changement déroutant, bien qu'il s'agisse définitivement d'une amélioration conceptuelle. Pas si bon pour les bazillions de sites utilisant jQuery qui se briseront à la suite de ce changement.
Je vais résumer les principaux problèmes:
prop()
plutôt queattr()
.prop()
fait ce qu'ilattr()
faisait. Remplacer les appels àattr()
parprop()
dans votre code fonctionne généralement.checked
propriété est un booléen, lastyle
propriété est un objet avec des propriétés individuelles pour chaque style, lasize
propriété est un nombre.value
etchecked
: pour ces attributs, la propriété représente toujours l'état actuel tandis que le L'attribut (sauf dans les anciennes versions d'IE) correspond à la valeur / vérification par défaut de l'entrée (reflétée dans la propriétédefaultValue
/defaultChecked
).Si vous êtes un développeur jQuery et que toute cette entreprise est confuse à propos des propriétés et des attributs, vous devez prendre du recul et en apprendre un peu plus, car jQuery n'essaie plus si fort de vous protéger de ce genre de choses. Pour le mot faisant autorité mais un peu sec sur le sujet, il y a les spécifications: DOM4 , HTML DOM , DOM niveau 2 , DOM niveau 3 . La documentation DOM de Mozilla est valide pour la plupart des navigateurs modernes et est plus facile à lire que les spécifications, vous pouvez donc trouver leur référence DOM utile. Il y a une section sur les propriétés des éléments .
Pour illustrer la façon dont les propriétés sont plus simples à gérer que les attributs, considérons une case à cocher initialement cochée. Voici deux éléments HTML valides possibles pour ce faire:
Alors, comment savoir si la case est cochée avec jQuery? Regardez sur Stack Overflow et vous trouverez généralement les suggestions suivantes:
if ( $("#cb").attr("checked") === true ) {...}
if ( $("#cb").attr("checked") == "checked" ) {...}
if ( $("#cb").is(":checked") ) {...}
C'est en fait la chose la plus simple au monde à faire avec la
checked
propriété booléenne, qui existe et fonctionne parfaitement dans tous les principaux navigateurs scriptables depuis 1995:if (document.getElementById("cb").checked) {...}
La propriété rend également cocher ou décocher la case triviale:
document.getElementById("cb").checked = false
Dans jQuery 1.6, cela devient sans ambiguïté
$("#cb").prop("checked", false)
L'idée d'utiliser l'
checked
attribut pour écrire une case à cocher est inutile et inutile. La propriété est ce dont vous avez besoin.checked
attributla source
value
exemple de Tim , par exemple. Une fonction appeléeattr
qui récupère la propriétévalue
plutôt que l'attribut "valeur" n'a pas beaucoup de sens (et ils peuvent être différents). À l'avenir,attr
faire des attributs etprop
faire des propriétés sera plus clair, même si la transition sera pénible pour certains. Ne prenez pas cela dans le mauvais sens, rien de tel que de prendre du recul et de lire les spécifications pour avoir une idée de ce que sont les propriétés.value
par exemple), mais essayons d'ignorer la plupart du temps. 99% du temps, vous voulez travailler avec des accessoires. Si vous devez travailler avec un attribut réel, vous le saurez probablement.value
propriété d'une entrée ne change pas sonvalue
attribut dans les navigateurs modernes" Je ne le pensais pas, c'est pourquoi j'ai commencé à l'utiliser comme exemple, mais quand j'ai commencé à coder l'exemple, sacrément s'il n'a pas été mis à jour sur Chrome, Firefox, Opera, IE ... - jsbin.com/ahire4 Il s'avère que c'est parce que j'utilisais uninput[type="button"]
pour mon expérience. Il ne met pas à jour l'attribut sur uninput[type="text"]
- jsbin.com/ahire4/2 Parlez de compliqué !! Pas seulement l'élément, mais le type de celui-ci ...Je pense que Tim l'a très bien dit , mais revenons en arrière:
Un élément DOM est un objet, une chose en mémoire. Comme la plupart des objets dans la POO, il a des propriétés . Il a également, séparément, une carte des attributs définis sur l'élément (provenant généralement du balisage que le navigateur a lu pour créer l'élément). Certaines propriétés de l'élément tirent leurs valeurs initiales d' attributs portant des noms identiques ou similaires (
value
obtient sa valeur initiale de l'attribut "value";href
obtient sa valeur initiale de l'attribut "href", mais ce n'est pas exactement la même valeur;className
de la attribut "classe"). D'autres propriétés obtiennent leurs valeurs initiales de différentes manières: Par exemple, laparentNode
propriété obtient sa valeur en fonction de son élément parent;style
, qu'elle ait ou non un attribut "style".Considérons cette ancre dans une page à
http://example.com/testing.html
:De l'art ASCII gratuit (et en laissant de côté beaucoup de choses):
Notez que les propriétés et les attributs sont distincts.
Maintenant, bien qu'ils soient distincts, parce que tout cela a évolué plutôt que d'être conçu à partir de zéro, un certain nombre de propriétés réécrivent l'attribut dont elles dérivent si vous les définissez. Mais tous ne le font pas, et comme vous pouvez le voir
href
ci-dessus, le mappage n'est pas toujours une simple "transmission de la valeur", parfois une interprétation est impliquée.Quand je parle de propriétés étant des propriétés d'un objet, je ne parle pas dans l'abstrait. Voici du code non jQuery:
(Ces valeurs sont celles de la plupart des navigateurs; il existe certaines variations.)
L'
link
objet est une chose réelle, et vous pouvez voir qu'il y a une réelle distinction entre accéder à une propriété et accéder à un attribut .Comme l'a dit Tim, la grande majorité du temps, nous voulons travailler avec des propriétés. C'est en partie parce que leurs valeurs (même leurs noms) ont tendance à être plus cohérentes entre les navigateurs. La plupart du temps, nous ne voulons travailler avec des attributs que lorsqu'aucune propriété ne leur est associée (attributs personnalisés), ou lorsque nous savons que pour cet attribut particulier, l'attribut et la propriété ne sont pas 1: 1 (comme avec
href
et "href" ci-dessus) .Les propriétés standard sont présentées dans les différentes spécifications DOM:
Ces spécifications ont d'excellents index et je recommande de garder les liens à portée de main; Je les utilise tout le temps.
Les attributs personnalisés comprendraient, par exemple, tous les
data-xyz
attributs que vous pourriez mettre sur des éléments pour fournir des métadonnées à votre code (maintenant que cela est valable en HTML5, tant que vous vous en tenez audata-
préfixe). (Les versions récentes de jQuery vous donnent accès auxdata-xyz
éléments via ladata
fonction, mais cette fonction n'est pas seulement un accesseur pour lesdata-xyz
attributs [elle fait à la fois plus et moins que cela]; sauf si vous avez réellement besoin de ses fonctionnalités, j'utiliserais laattr
fonction pour interagir avecdata-xyz
attribut.)La
attr
fonction avait une logique compliquée pour obtenir ce qu'ils pensaient que vous vouliez, plutôt que d'obtenir littéralement l'attribut. Il a confondu les concepts. Déménagerprop
etattr
était censé les déconfigurer. En bref dans v1.6.0 jQuery est allé trop loin à cet égard, mais la fonctionnalité a été rapidement ajouté à nouveau àattr
faire face aux situations communes où les gens utilisentattr
lorsque cela est techniquement , ils devraient utiliserprop
.la source
.attr('class', 'bla')
fonctionne comme prévu pour moi dans 1.7.0 , 1.7.1 et 1.7.2 sur Chrome 17, Firefox 11, Opera 11, IE6, IE8, IE9 et Safari 5..data
- il lira la valeur par défaut de l'attribut, s'il est présent, mais si vous l'écrivez, il changera une propriété cachée de l'élément et ne mettra pas à jour l'attribut.Ce changement a été long à venir pour jQuery. Pendant des années, ils se sont contentés d'une fonction nommée
attr()
qui récupérait principalement les propriétés DOM, pas le résultat que vous attendez du nom. La ségrégation deattr()
etprop()
devrait aider à atténuer une partie de la confusion entre les attributs HTML et les propriétés DOM.$.fn.prop()
saisit la propriété DOM spécifiée, tandis qu'il$.fn.attr()
saisit l'attribut HTML spécifié.Pour bien comprendre comment ils fonctionnent, voici une explication détaillée de la différence entre les attributs HTML et les propriétés DOM:
Attributs HTML
Syntaxe:
<body onload="foo()">
Objectif: permet au balisage d'avoir des données qui lui sont associées pour les événements, le rendu et à d'autres fins.
Visualisation: l' attribut class est affiché ici sur le corps. Il est accessible via le code suivant:
Les attributs sont renvoyés sous forme de chaîne et peuvent être incohérents d'un navigateur à l'autre. Cependant, ils peuvent être essentiels dans certaines situations. Comme illustré ci-dessus, IE 8 Quirks Mode (et ci-dessous) attend le nom d'une propriété DOM dans get / set / removeAttribute au lieu du nom d'attribut. C'est l'une des nombreuses raisons pour lesquelles il est important de connaître la différence.
Propriétés DOM
Syntaxe:
document.body.onload = foo;
Objectif: donne accès aux propriétés appartenant aux nœuds d'élément. Ces propriétés sont similaires aux attributs, mais ne sont accessibles que via JavaScript. Il s'agit d'une différence importante qui permet de clarifier le rôle des propriétés DOM. Veuillez noter que les attributs sont complètement différents des propriétés , car cette affectation de gestionnaire d'événements est inutile et ne recevra pas l'événement (le corps n'a pas d'événement onload, seulement un attribut onload).
Visualisation:
Ici, vous remarquerez une liste de propriétés sous l'onglet "DOM" dans Firebug. Ce sont des propriétés DOM. Vous en remarquerez immédiatement un certain nombre, car vous les avez déjà utilisés sans le savoir. Leurs valeurs sont ce que vous recevrez via JavaScript.
Documentation
Exemple
HTML:
<textarea id="test" value="foo"></textarea>
JavaScript:
alert($('#test').attr('value'));
Dans les versions antérieures de jQuery, cela renvoie une chaîne vide. En 1.6, il renvoie la valeur correcte,
foo
.Sans avoir jeté un coup d'œil au nouveau code de l'une ou l'autre fonction, je peux dire avec confiance que la confusion a plus à voir avec la différence entre les attributs HTML et les propriétés DOM qu'avec le code lui-même. J'espère que cela a clarifié certaines choses pour vous.
-Mat
la source
$.prop()
obtient les propriétés DOM,$.attr()
obtient les attributs HTML. J'essaie de combler l'écart psychologiquement afin que vous puissiez comprendre la différence entre les deux.$('#test').prop('value')
ne retourne rien? Ni.attr('checked')
pour une case à cocher? Mais avant? Vous devez maintenant le changer enprop('checked')
? Je ne comprends pas la nécessité de cette distinction - pourquoi est-il important de faire la différence entre les attributs HTML et les propriétés DOM? Quel est le cas d'utilisation courant qui a fait que ce changement "arrive longtemps" ? Quel est le problème avec l'abstraction de la distinction entre les deux, car il semble que leurs cas d'utilisation se chevauchent principalement?value
est l'un des cas les plus évidents, car lavalue
propriété vous donnera la valeur actuelle d'un champ, mais l'value
attribut vous donnera la valeur d'origine qui a été déclarée dans l'value="..."
attribut, qui est en fait ladefaultValue
propriété. (Bien que ce cas particulier soit à nouveau confondu par des bogues dans IE <9.)attr('value', ...)
dans jQuery <1.6 définit la propriété, donc la valeur actuelle change et la valeur par défaut ne change pas. En 1.6, il définit l'attribut, donc en théorie la valeur par défaut change et la valeur actuelle ne change pas. Cependant, il existe (plus) d'incohérences dans le navigateur quant à la définition exacte de l'value
attribut. Dans IE, il définit également la valeur actuelle; dans certains navigateurs, il ne définit la valeur actuelle que si la valeur actuelle n'a pas déjà été définie auparavant. [cris]Une propriété est dans le DOM; un attribut est dans le HTML qui est analysé dans le DOM.
Plus de détails
Si vous changez un attribut, le changement sera reflété dans le DOM (parfois avec un nom différent).
Exemple: la modification de l'
class
attribut d'une balise modifie laclassName
propriété de cette balise dans le DOM. Si vous n'avez aucun attribut sur une balise, vous avez toujours la propriété DOM correspondante avec une valeur vide ou par défaut.Exemple: alors que votre balise n'a pas d'
class
attribut, la propriété DOMclassName
existe avec une valeur de chaîne vide.Éditer
Si vous changez l'un, l'autre sera changé par un contrôleur, et vice versa. Ce contrôleur n'est pas dans jQuery, mais dans le code natif du navigateur.
la source
jQuery('p').prop('className', 'foo');
dans la console Chrome et vous verrez comment l'class
attribut thg de chaque paragraphe est'foo'
. Bien sûr, pas dans le code source, qui vient du serveur. C'est une constante.C'est juste la distinction entre les attributs HTML et les objets DOM qui crée une confusion. Pour ceux qui sont à l'aise d'agir sur les propriétés natives des éléments DOM tels qu'un
this.src
this.value
this.checked
etc,.prop
c'est un accueil très chaleureux dans la famille. Pour d'autres, c'est juste une couche supplémentaire de confusion. Clarifions cela.La façon la plus simple de voir la différence entre
.attr
et.prop
est l'exemple suivant:$('input').attr('blah')
: retourne'hello'
comme prévu. Pas de surprise ici.$('input').prop('blah')
: renvoieundefined
- car il essaie de le faire[HTMLInputElement].blah
- et aucune propriété de ce type sur cet objet DOM n'existe. Il n'existe que dans la portée en tant qu'attribut de cet élément, à savoir[HTMLInputElement].getAttribute('blah')
Maintenant, nous changeons quelques choses comme ceci:
$('input').attr('blah')
: renvoie'apple'
hein? Pourquoi ne pas "poire" car cela a été réglé en dernier sur cet élément. Parce que la propriété a été modifiée sur l'attribut d'entrée, et non sur l'élément d'entrée DOM lui-même - ils fonctionnent pratiquement presque indépendamment les uns des autres.$('input').prop('blah')
: Retour'pear'
La chose à laquelle vous devez vraiment faire attention est de ne pas mélanger l'utilisation de ceux-ci pour la même propriété dans votre application pour la raison ci-dessus.
Voir un violon démontrant la différence: http://jsfiddle.net/garreh/uLQXc/
.attr
vs.prop
:Tour 1: style
.attr('style')
- renvoie des styles en ligne pour l'élément correspondant, c'est-à-dire"font:arial;"
.prop('style')
- retourne un objet de déclaration de style ieCSSStyleDeclaration
Tour 2: valeur
.attr('value')
- retourne'hello'
*.prop('value')
-- Retour'i changed the value'
* Remarque: jQuery pour cette raison a une
.val()
méthode, qui en interne est équivalente à.prop('value')
la source
TL; DR
Utilisez
prop()
plusattr()
dans la majorité des cas.Une propriété est l'état actuel de l'élément d'entrée. Un attribut est la valeur par défaut.
Une propriété peut contenir des éléments de différents types. Un attribut ne peut contenir que des chaînes
la source
prop() and when to go for attr()
. en attente de réponse :)Contrôle sale
Ce concept fournit un exemple où la différence est observable: http://www.w3.org/TR/html5/forms.html#concept-input-checked-dirty
Essaye le:
prop
case à cocher a été cochée. COUP!Pour certains attributs comme
disabled
onbutton
, l'ajout ou la suppression de l'attribut contentdisabled="disabled"
bascule toujours la propriété (appelée attribut IDL en HTML5) car http://www.w3.org/TR/html5/forms.html#attr-fe-disabled dit:vous pourriez donc vous en tirer, bien qu'il soit moche car il modifie le HTML sans besoin.
Pour d'autres attributs comme
checked="checked"
oninput type="checkbox"
, les choses se cassent, car une fois que vous cliquez dessus, il devient sale, puis l'ajout ou la suppression de l'checked="checked"
attribut content ne fait plus basculer la vérification .C'est pourquoi vous devriez utiliser principalement
.prop
, car cela affecte directement la propriété effective, au lieu de compter sur des effets secondaires complexes de modification du code HTML.la source
checked
attribut:checked="checked"
Tout est dans le doc :
Alors utilisez un accessoire!
la source
$.attr()
récupérer des propriétés la plupart du temps, je travaillais avec elle, pas «parfois». La confusion qui en résulte est toujours d'actualité. Malheureusement, j'ai beaucoup de mal à trouver une lecture définitive sur les attributs HTML par rapport aux propriétés DOM, donc je pourrais écrire une réponse ici dans un instant.les attributs sont dans votre document / fichier texte HTML (== imaginez que c'est le résultat de votre balisage html analysé), tandis que les
propriétés sont dans l' arborescence DOM HTML (== essentiellement une propriété réelle d'un objet au sens JS).
Surtout, beaucoup d'entre eux sont synchronisés (si vous mettez à jour la
class
propriété, l'class
attribut en html sera également mis à jour; et sinon). Mais certains attributs peuvent être synchronisés avec des propriétés inattendues - par exemple, l' attributchecked
correspond à la propriétédefaultChecked
, de sorte que.prop('checked')
valeur, mais ne changera pas.attr('checked')
et les.prop('defaultChecked')
valeurs$('#input').prop('defaultChecked', true)
changera également.attr('checked')
, mais cela ne sera pas visible sur un élément.Et voici un tableau qui montre où
.prop()
est préféré (même s'il.attr()
peut encore être utilisé).Pourquoi voudriez-vous parfois utiliser .prop () au lieu de .attr () où ce dernier est officiellement conseillé?
.prop()
peut renvoyer n'importe quel type - chaîne, entier, booléen; tandis que.attr()
renvoie toujours une chaîne..prop()
est censé être environ 2,5 fois plus rapide que.attr()
.la source
$('#myImageId').prop('src', 'http://example.com/img.png')
,var class = $('.myDivClass').prop('class')
ou$('#myTextBox').prop('type', 'button')
. Et ainsi de suite ....prop()
fonctionne très bien avec toutes les propriétés. Vous ne voulez pas marquer toutes les propriétés dans la.prop()
colonne, n'est-ce pas ?.prop()
est préféré (même s'il.attr()
peut encore être utilisé)».attr()
pour définir un événement ce qui.prop()
ne peut pas. Comme ceci:$('.myDiv').attr('onclick', 'alert("Hello world!")')
. Si vous passez.attr()
à.prop()
, cela ne fonctionnera pas. Totalement, je pense qu'il n'y a aucune raison d'utiliser.attr()
pour définir ou obtenir la valeur deid/class/href/checked/src.....
. Remarquez que je ne dis pas que vous vous trompez..attr()
:.prop()
:la source
Habituellement, vous souhaiterez utiliser des propriétés. N'utilisez des attributs que pour:
<input value="abc">.
la source
attributes
-> HTMLproperties
-> DOMla source
attirbutes
également une propriété deDOM
Avant jQuery 1.6, la
attr()
méthode prenait parfois en compte les valeurs des propriétés lors de la récupération des attributs, ce qui provoquait un comportement plutôt incohérent.L'introduction de la
prop()
méthode fournit un moyen de récupérer explicitement les valeurs des propriétés, tout en.attr()
récupérant les attributs.Les documents:
jQuery.attr()
Obtenez la valeur d'un attribut pour le premier élément de l'ensemble d'éléments correspondants.jQuery.prop()
Obtenez la valeur d'une propriété pour le premier élément de l'ensemble des éléments correspondants.la source
Rappelez doucement l'utilisation
prop()
, par exemple:La fonction ci-dessus permet de vérifier si checkbox1 est cochée ou non, si cochée: return 1; sinon: retourne 0. Fonction prop () utilisée ici comme fonction GET.
La fonction ci-dessus est utilisée pour définir la case à cocher1 à vérifier et toujours retourner 1. Maintenant, la fonction prop () est utilisée comme fonction SET.
Ne vous trompez pas.
P / S: Lorsque je vérifie la propriété Image src . Si le src est vide, prop renvoie l'URL actuelle de la page (incorrecte) et attr retourne une chaîne vide (droite).
la source
<img src="smiley.gif" alt="Smiley face" width="42" height="42" onclick="alert($(this).prop('src'))">
. Cela devrait fonctionner et renvoyer l'emplacement de l'image.Une chose
.attr()
peut faire qui ne.prop()
peut pas: affecter les sélecteurs CSSVoici un problème que je n'ai pas vu dans les autres réponses.
Sélecteur CSS
[name=value]
.attr('name', 'value')
.prop('name', 'value')
.prop()
affecte seulement quelques sélecteurs d'attributsinput[name]
(merci @TimDown ).attr()
affecte tous les sélecteurs d'attributsinput[value]
input[naame]
span[name]
input[data-custom-attribute]
(aucun.data('custom-attribute')
n'affectera ce sélecteur)la source
Généralement, nous voulons utiliser un objet DOM plutôt qu'un attribut personnalisé comme
data-img, data-xyz
.Également une certaine différence lors de l'accès à la
checkbox
valeur ethref
avecattr()
et auprop()
fur et à mesure que la chose change avec la sortie DOM avecprop()
comme lien complet à partir deorigin
etBoolean
valeur pour la case à cocher(pre-1.6)
On ne peut accéder aux éléments DOM qu'avec d'
prop
autres alors ça donneundefined
Afficher l'extrait de code
la source
Il y a quelques autres considérations dans prop () vs attr ():
selectedIndex, tagName, nodeName, nodeType, ownerDocument, defaultChecked et defaultSelected..etc doivent être récupérés et définis avec la méthode .prop (). Ceux-ci n'ont pas d'attributs correspondants et ne sont que des propriétés.
Case à cocher pour le type d'entrée
La méthode prop renvoie une valeur booléenne pour les éléments cochés, sélectionnés, désactivés, readOnly..etc tandis que attr renvoie la chaîne définie. Ainsi, vous pouvez directement utiliser .prop ('coché') dans if condition.
.attr () appelle .prop () en interne, donc la méthode .attr () sera légèrement plus lente que d'y accéder directement via .prop ().
la source
La réponse de Gary Hole est très pertinente pour résoudre le problème si le code est écrit de cette manière
Étant donné que la fonction prop renvoie un
CSSStyleDeclaration
objet, le code ci-dessus ne fonctionnera pas correctement dans certains navigateurs (testé avecIE8 with Chrome Frame Plugin
dans mon cas).Le changeant ainsi en code suivant
résolu le problème.
la source