Agora, esta não é apenas outra questão de qual é a diferença , eu fiz alguns testes (http://jsfiddle.net/ZC3Lf/) modificando o prop
e attr
de <form action="/test/"></form>
com a saída sendo:
1) Teste de modificação de prop.
Prop:http://fiddle.jshell.net/test/1
Attr:http://fiddle.jshell.net/test/1
2) Teste de modificação de atributo
Prop:http://fiddle.jshell.net/test/1
Attr:/test/1
3) Teste de modificação de atributo, em seguida,
Prop:http://fiddle.jshell.net/test/11
Atr:http://fiddle.jshell.net/test/11
4) Teste de Modificação de Prop, em seguida,
Prop:http://fiddle.jshell.net/test/11
Attr:http://fiddle.jshell.net/test/11
Agora estou confuso sobre algumas coisas, tanto quanto meu conhecimento vai:
Prop: O valor em seu estado atual após qualquer modificação via JavaScript
Attr: O valor como foi definido no html no carregamento da página.
Agora, se isso estiver correto,
- Por que modificar o
prop
parece torná-loaction
totalmente qualificado e, inversamente, por que modificar o atributo não? - Por que modificar o
prop
in1)
modifica o atributo, que não faz sentido para mim? - Por que modificar o
attr
em2)
modifica a propriedade, eles devem ser vinculados dessa forma?
Código de Teste
HTML
JavaScript
var element = $('form');
var property = 'action';
/*You should not need to modify below this line */
var body = $('body');
var original = element.attr(property);
body.append('<h1>Prop Modification test</h1>');
element.prop(property, element.prop(property) + 1);
body.append('Prop: '+element.prop(property)+'<br />');
body.append('Attr: '+element.attr(property)+'<hr />');
//reset
element.prop(property, original);
element.attr(property, original);
body.append('<h1>Attr Modification test</h1>');
element.attr(property, element.attr(property) + 1);
body.append('Prop: '+element.prop(property)+'<br />');
body.append('Attr: '+element.attr(property)+'<hr />');
//reset
element.prop(property, original);
element.attr(property, original);
body.append('<h1>Attr then Prop Modification test</h1>');
element.attr(property, element.attr(property) + 1);
element.prop(property, element.prop(property) + 1);
body.append('Prop: '+element.prop(property)+'<br />');
body.append('Attr: '+element.attr(property)+'<hr />');
//reset
element.prop(property, original);
element.attr(property, original);
body.append('<h1>Prop then Attr Modification test</h1>');
element.prop(property, element.prop(property) + 1);
element.attr(property, element.attr(property) + 1);
body.append('Prop: '+element.prop(property)+'<br />');
body.append('Attr: '+element.attr(property)+'<hr />');
fonte
Respostas:
Infelizmente, nenhum de seus links funciona :(
Alguns insights, porém,
attr
são para todos os atributos.prop
é para propriedades.Em versões mais antigas do jQuery (<1.6), nós apenas tínhamos
attr
. Para chegar a propriedades DOM comonodeName
,selectedIndex
oudefaultValue
você tinha que fazer algo como:Isso foi péssimo, então
prop
foi adicionado:Isso era ótimo, mas irritantemente isso não era compatível com versões anteriores, como:
não tem atributo de
checked
, mas tem uma propriedade chamadachecked
.Então, na versão final do 1.6,
attr
também fazprop
para que as coisas não quebrem. Algumas pessoas queriam que fosse uma ruptura limpa, mas acho que a decisão certa foi tomada porque as coisas não quebraram em todos os lugares!A respeito de:
Isso nem sempre é verdade, pois muitas vezes o atributo é realmente alterado, mas para propriedades como as marcadas, não há um atributo a ser alterado, então você precisa usar prop.
Referências:
http://blog.jquery.com/2011/05/03/jquery-16-released/
http://ejohn.org/blog/jquery-16-and-attr
fonte
undefined
e attr () funciona bem.É um caso claro para ver as diferenças entre .prop e .attr
considere o HTML abaixo:
e o JS abaixo usando jQuery:
cria a seguinte saída:
fonte
Eu tentei isso
e sai como abaixo
isso pode indicar que o
action
é normalizado apenas quando é lido comprop
.fonte
2)
seria normalizada!/test/
quando acessar eattr
, em seguida, definir/test/1
paraattr
, que é o atributo do elemento. Não existe nenhum procedimento que desencadeie a normalização.2)
acima é:element.attr(property, element.attr(property) + 1); body.append('Prop: '+element.prop(property)+'<br />'); body.append('Attr: '+element.attr(property)+'<hr />');
Se fosse normalizado quando lido, a linha final não geraria a versão normalizada?property = 'action'; body = $('body'); element = $('form');
desde jquery 1.6.1+ attr () retorna / altera propriedade como antes de 1.6. portanto, seus testes não fazem muito sentido.
esteja ciente de pequenas alterações nos valores de retorno.
por exemplo
attr ('verificado'): antes de 1.6 verdadeiro / falso é retornado, desde 1.6.1. “Verificado” / indefinido é retornado.
attr ('selecionado'): antes de 1.6 verdadeiro / falso ser retornado, pois 1.6.1 “selecionado” / indefinido é retornado
uma visão geral detalhada deste tópico em alemão pode ser encontrada aqui:
http://mabraham.de/jquery-prop-attr-val-richtig-verwenden/
fonte