2489 votes

.prop() vs .attr()

Alors jQuery 1.6 a la nouvelle fonction prop().

$(selector).click(function(){
    //au lieu de:
    this.getAttribute('style');
    //dois-je utiliser:
    $(this).prop('style');
    //ou:
    $(this).attr('style');
})

ou dans ce cas, est-ce qu'ils font la même chose?

Et si je dois passer à utiliser prop(), est-ce que tous les anciens appels à attr() vont casser si je passe à la version 1.6?

MISE À JOUR

selector = '#id'

$(selector).click(function() {
    //au lieu de:
    var getAtt = this.getAttribute('style');
    //dois-je utiliser:
    var thisProp = $(this).prop('style');
    //ou:
    var thisAttr = $(this).attr('style');

    console.log(getAtt, thisProp, thisAttr);
});

test

(voir aussi ce fiddle: http://jsfiddle.net/maniator/JpUF2/)

La console enregistre le getAttribute comme une chaîne, et le attr comme une chaîne, mais le prop comme une CSSStyleDeclaration, Pourquoi? Et comment cela affecte-t-il mon codage à l'avenir?

17 votes

Cela sera d'un intérêt certain : books.google.ca/…

29 votes

@Neal, c'est parce que ce changement va au-delà de jQuery. La différence entre les attributs HTML et les propriétés du DOM est énorme.

0 votes

@Matt mais qu'est-ce que attr retournait avant 1.6? est-ce que cela retournait toujours une chaîne de caractères?

61voto

agjmills Points 131

TL;DR

Utilisez prop() plutôt que attr() dans la plupart 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 de caractères.

1 votes

S'il est possible de fournir quelques échantillons simples de ce que vous dites et également de montrer quand utiliser prop() et quand opter pour attr(). En attente de votre réponse :)

42voto

Ciro Santilli Points 3341

Dirty checkedness

Ce concept fournit un exemple où la différence est observable : http://www.w3.org/TR/html5/forms.html#concept-input-checked-dirty

Essayez-le :

  • cliquez sur le bouton. Les deux cases à cocher sont cochées.
  • décochez les deux cases à cocher.
  • cliquez à nouveau sur le bouton. Seule la case à cocher prop est cochée. BANG !

    $('button').on('click', function() { $('#attr').attr('checked', 'checked') $('#prop').prop('checked', true) })

    attr prop Définir les attributs checked attr et prop.

Pour certains attributs comme disabled sur button, ajouter ou supprimer l'attribut de contenu disabled="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 :

L'attribut IDL disabled doit refléter l'attribut de contenu disabled.

donc vous pourriez vous en sortir, bien que ce soit moche car cela modifie inutilement le HTML.

Pour d'autres attributs comme checked="checked" sur type="checkbox", les choses se compliquent, car une fois que vous cliquez dessus, elle devient sale, et ensuite ajouter ou supprimer l'attribut de contenu checked="checked" ne bascule plus l'état coché.

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 liés à la modification du HTML.

0 votes

Pour plus de complétude, essayez également ces variations : 1) Avant de cliquer sur le bouton, cochez puis décochez la première case à cocher 2) (Pour celle-ci, vous devrez changer l'extrait) Donnez au premier élément d'entrée un attribut checked : checked="checked"

38voto

Arnaud F. Points 3841

Tout est dans la documentation:

La différence entre les attributs et les propriétés peut être importante dans des situations spécifiques. Avant jQuery 1.6, la méthode .attr() prenait parfois en compte les valeurs de propriété lors de la récupération de certains attributs, ce qui pouvait entraîner un comportement incohérent. Depuis jQuery 1.6, la méthode .prop() fournit un moyen de récupérer explicitement les valeurs de propriété, tandis que .attr() récupère les attributs.

Alors utilisez prop !

2 votes

Donc cela signifie que lorsque je passe à 1.6, beaucoup de choses vont se casser ?

0 votes

Non, c'est juste un comportement incohérent, si ça fonctionne avant, ça fonctionnera toujours avec jQuery 1.6, c'est juste que prop est plus sûr ;)

6 votes

Je me souviens que .$.attr() récupère la plupart du temps des propriétés lorsque je travaillais avec lui, pas "parfois". La confusion qu'il cause est encore résonnante aujourd'hui. Malheureusement, j'ai beaucoup de mal à trouver une lecture définitive sur les attributs HTML par rapport aux propriétés du DOM, donc je pourrais écrire une réponse ici dans un instant.

34voto

lakesare Points 6279

attributs sont dans votre fichier document texte HTML (== imaginez que c'est le résultat de l'analyse de votre balisage HTML), tandis que
propriétés sont dans l'arbre DOM HTML (== fondamentalement une propriété réelle de certains objets dans le sens de JS).

Importamment, beaucoup d'entre eux sont synchronisés (si vous mettez à jour la propriété class, l'attribut class en html sera également mis à jour; et vice versa). Mais certains attributs peuvent être synchronisés avec des propriétés inattendues - par exemple, l'attribut checked correspond à la propriété defaultChecked, ainsi

  • cocher manuellement une case à cocher changera la valeur de .prop('checked'), mais ne changera pas les valeurs de .attr('checked') et .prop('defaultChecked')
  • définir $('#input').prop('defaultChecked', true) changera également .attr('checked'), mais cela ne sera pas visible sur un élément.

La règle à suivre est: la méthode .prop() devrait être utilisée pour les attributs/propriétés booléens et pour les propriétés qui n'existent pas dans le html (comme window.location). Tous les autres attributs (ceux que vous pouvez voir dans le html) peuvent et devraient continuer à être manipulés avec la méthode .attr(). (http://blog.jquery.com/2011/05/10/jquery-1-6-1-rc-1-released/)

Et voici un tableau qui montre où .prop() est préféré (même si .attr() peut toujours être utilisé).

tableau avec utilisation préférée


Pourquoi voudriez-vous parfois utiliser .prop() au lieu de .attr() alors que ce dernier est officiellement recommandé?

  1. .prop() peut retourner n'importe quel type - string, integer, boolean; tandis que .attr() retourne toujours une chaîne de caractères.
  2. .prop() est dit être environ 2,5 fois plus rapide que .attr().

0 votes

Quelque chose a été modifié, comme ceci : $('#myImageId').prop('src', 'http://example.com/img.png'), var class = $('.myDivClass').prop('class'), ou $('#myTextBox').prop('type', 'button'). Et ainsi de suite...

0 votes

@Monsieur Loup, désolé, je ne comprends toujours pas ce que vous voulez dire. Qu'est-ce qui a 'changé'? La syntaxe a toujours été comme cela.

0 votes

Je pense que le tableau dans votre réponse est inutile. Parce que .prop() fonctionne bien avec toutes les propriétés. Vous ne voulez pas marquer toutes les propriétés dans la colonne .prop(), n'est-ce pas ?

27voto

Kgn-web Points 1871

.attr():

  • Obtenez la valeur d'un attribut pour le premier élément dans l'ensemble des éléments appariés.
  • Vous donne la valeur de l'élément telle qu'elle a été définie dans le html lors du chargement de la page.

.prop():

  • Obtenez la valeur d'une propriété pour le premier élément dans l'ensemble des éléments appariés.
  • Donne les valeurs mises à jour des éléments qui ont été modifiés via javascript/jquery.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X