Eu tenho o seguinte campo em uma exibição MVC:
@Html.TextBoxFor(model => model.Course.Title, new { data_helptext = "Old Text" })</span>
Em um arquivo js separado, desejo definir o data-helptext
atributo como um valor de sequência. Aqui está o meu código:
alert($(targetField).data("helptext"));
$(targetField).data("helptext", "Testing 123");
A alert()
chamada funciona bem, mostra o texto "Texto antigo" em uma caixa de diálogo de alerta. No entanto, a chamada para definir o data-helptext
atributo como "Testando 123" não funciona. "Texto antigo" ainda é o valor atual do atributo.
Estou usando a chamada para dados () incorretamente? Eu procurei isso na web e não consigo ver o que estou fazendo de errado.
Aqui está a marcação HTML:
<input data-helptext="Old Text" id="Course_Title" name="Course.Title" type="text" value="" />
jquery
model-view-controller
attributes
custom-data-attribute
Jason Evans
fonte
fonte
data-
atributo HTML5 personalizado ?Respostas:
É mencionado na
.data()
documentaçãoIsso também foi abordado no Por que as alterações no jQuery $ .fn.data () atualizam os atributos correspondentes do html 5 data- *?
A demonstração da minha resposta original abaixo parece não funcionar mais.
Resposta atualizada
Novamente, a partir da
.data()
documentaçãoEntão, para
<div data-role="page"></div>
o seguinte é verdade$('div').data('role') === 'page'
Tenho certeza de que
$('div').data('data-role')
funcionou no passado, mas isso não parece mais ser o caso. Criei uma vitrine melhor que registra em HTML, em vez de ter que abrir o console, e adicionei um exemplo adicional da conversão de atributos de dados multi-hífen para camelCase .Demonstração atualizada (25-07-2015)
Veja também jQuery Data vs Attr?
HTML
JavaScript (jQuery 1.6.2+)
Demo mais antiga
Resposta original
Para este HTML:
e esse JavaScript (com jQuery 1.6.2)
Ver demonstração
Usando o Chrome DevTools Console para inspecionar o DOM,
$('#foo').data('helptext', 'Testing 123');
ele não atualiza o valor como visto no console, mas$('#foo').attr('data-helptext', 'Testing 123');
sim.fonte
data('key', 'value')
método faz atualizar o valor no cache jQuery, mas por motivos de desempenho (eu acho mutação DOM) do próprio DOM não é atualizado..attr('key','value')
independentemente de fazer.data('key', 'value')
ou não, certo? Isso me parece redundante, e estou tendo problemas para imaginar um cenário em que você deseje gravar no DOM em cache, mas não no DOM real. Talvez eu não esteja entendendo o cache do jQuery; Então, um visitante veria todas as coisas que são.data()
modificadas na tela ou não?Eu estava tendo sérios problemas com
Não estava definindo o
data-property
atributo.Começou a usar jQuery
.attr()
:para definir o valor e
para recuperar o valor.
Agora simplesmente funciona!
fonte
A resposta aceita do @yyb tem um pequeno erro. Além do meu comentário em seu post acima ...
Para este HTML:
Você precisa acessar o atributo assim:
mas o método de dados como este:
A correção acima para o método .data () impedirá "indefinido" e o valor dos dados será atualizado (enquanto o HTML não)
O objetivo do atributo "data" é vincular (ou "vincular") um valor ao elemento Muito parecido com o
onclick="alert('do_something')"
atributo, que liga uma ação ao elemento ... o texto é inútil, você só quer que a ação funcione quando eles clicarem no elemento.Depois que os dados ou ações são vinculados ao elemento, geralmente * não há necessidade de atualizar o HTML, apenas os dados ou o método, pois é isso que seu aplicativo (JavaScript) usaria. Em termos de desempenho, não vejo por que você também desejaria atualizar o HTML, ninguém vê o atributo html (exceto no Firebug ou em outros consoles).
Uma maneira de pensar sobre isso: o HTML (junto com os atributos) são apenas texto. Os dados, funções, objetos etc. usados pelo JavaScript existem em um plano separado. Somente quando o JavaScript é instruído a fazê-lo, ele lê ou atualiza o texto HTML, mas todos os dados e funcionalidades que você cria com JavaScript agem completamente separados do texto / atributos HTML que você vê no console do Firebug (ou outro).
* Eu enfatizo geralmente porque, se você tem um caso em que precisa preservar e exportar HTML (por exemplo, algum tipo de editor de texto com micro-formato / reconhecimento de dados) em que o HTML será carregado em outra página, talvez seja necessário atualizar o HTML também.
fonte
data
inattr('data-helptext'
faz a diferença, onde a resposta aceita e aquelas com muitos votos não estão funcionando. +1Aconteceu o mesmo comigo. Acontece que
fornece um objeto não gravável. Eu o resolvi usando:
E a partir de então,
data
era um objeto JS gravável e padrão.fonte
$.extend...
, você pode usardata
o que quiser:data.name = 'Nico'; data.questionSolved = true;
econsole.log(data)
exibirá as propriedades adicionadas recentementePara citar uma citação:
.data()
- Documentação de jQueryObserve que essa limitação (francamente ímpar ) é retida apenas para o uso de
.data()
.A solução? Use em
.attr
vez disso.Obviamente, muitos de vocês podem se sentir desconfortáveis por não usar seu método dedicado. Considere o seguinte cenário:
Bom senso - Por que eles mudariam um atributo já estabelecido como esse? Basta imaginar
class
começar renomeado para grupo eid
de identificador . A Internet quebraria.E mesmo assim, o próprio Javascript tem a capacidade de corrigir isso - e, é claro, apesar da infame incompatibilidade com o HTML, o REGEX (e uma variedade de métodos semelhantes) pode renomear rapidamente seus atributos para esse novo mítico 'padrão'.
TL; DR
fonte
Como mencionado, o
.data()
método não definirá realmente o valor dodata-
atributo, nem lerá valores atualizados se odata-
atributo for alterado.Minha solução foi estender o jQuery com um
.realData()
método que realmente corresponde ao valor atual do atributo:OBSERVAÇÃO: Claro que você pode usar
.attr()
, mas, pela minha experiência, a maioria dos desenvolvedores (eu) cometem o erro de visualizar.attr()
e.data()
são intercambiáveis, e geralmente substituem um pelo outro sem pensar. Pode funcionar na maioria das vezes, mas é uma ótima maneira de introduzir bugs, especialmente quando se lida com qualquer tipo de ligação de dados dinâmicos. Portanto, usando.realData()
, posso ser mais explícito sobre o comportamento pretendido.fonte
Teve o mesmo problema. Como você ainda pode obter dados usando o método .data (), você só precisa descobrir uma maneira de gravar nos elementos. Este é o método auxiliar que eu uso. Como a maioria das pessoas disse, você terá que usar .attr. Eu tenho que substituir qualquer _ por - como eu sei que faz isso. Eu não estou ciente de nenhum outro personagem que ele substitua ... no entanto, eu não pesquisei isso.
EDIT: 1/5/2017
Eu descobri que ainda havia casos em que você não conseguia obter os dados corretos usando métodos internos, então o que eu uso agora é o seguinte:
fonte