Tengo el siguiente campo en una vista MVC:
@Html.TextBoxFor(model => model.Course.Title, new { data_helptext = "Old Text" })</span>
En un archivo js separado, quiero establecer el data-helptext
atributo en un valor de cadena. Aquí está mi código:
alert($(targetField).data("helptext"));
$(targetField).data("helptext", "Testing 123");
La alert()
llamada funciona bien, muestra el texto "Texto antiguo" en un diálogo de alerta. Sin embargo, la llamada para establecer el data-helptext
atributo en "Prueba 123" no funciona. "Texto antiguo" sigue siendo el valor actual del atributo.
¿Estoy usando la llamada a datos () incorrectamente? He buscado esto en la web y no puedo ver qué estoy haciendo mal.
Aquí está el marcado 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
fuente
fuente
data-
atributo HTML5 personalizado ?Respuestas:
Se menciona en la
.data()
documentación.Esto también se cubrió en ¿Por qué los cambios en jQuery $ .fn.data () actualizan los atributos html 5 data- * correspondientes?
La demostración de mi respuesta original a continuación ya no parece funcionar.
Respuesta actualizada
De nuevo, de la
.data()
documentación.Entonces, para
<div data-role="page"></div>
lo siguiente es cierto$('div').data('role') === 'page'
Estoy bastante seguro de que
$('div').data('data-role')
funcionó en el pasado, pero ese ya no parece ser el caso. Creé un mejor escaparate que registra en HTML en lugar de tener que abrir la consola y agregué un ejemplo adicional de la conversión de múltiples guiones a los atributos de datos de camelCase .Demo actualizada (2015-07-25)
Ver también jQuery Data vs Attr?
HTML
JavaScript (jQuery 1.6.2+)
Demo anterior
Respuesta original
Para este HTML:
y este JavaScript (con jQuery 1.6.2)
Ver demo
Al usar la Consola Chrome DevTools para inspeccionar el DOM, no actualiza el valor como se ve en la Consola, pero sí lo hace.
$('#foo').data('helptext', 'Testing 123');
$('#foo').attr('data-helptext', 'Testing 123');
fuente
data('key', 'value')
método hace actualizar el valor en la memoria caché de jQuery, pero por razones de rendimiento (supongo mutación DOM) el DOM en sí y no se actualiza..attr('key','value')
independientemente de si lo hiciste.data('key', 'value')
o no, ¿verdad? Eso me parece redundante, y tengo problemas para imaginar un escenario en el que desee escribir en el DOM en caché, pero no en el DOM real. Tal vez no entiendo el caché jQuery; Entonces, ¿vería un visitante todas las cosas que se.data()
modifican en su pantalla, o no?Estaba teniendo serios problemas con
No estaba configurando el
data-property
atributo.Comenzó a usar jQuery's
.attr()
:para establecer el valor y
para recuperar el valor
¡Ahora simplemente funciona!
fuente
La respuesta aceptada de @andyb tiene un pequeño error. Además de mi comentario en su publicación anterior ...
Para este HTML:
Necesita acceder al atributo de esta manera:
pero el método de datos como este:
La corrección anterior para el método .data () evitará "indefinido" y el valor de los datos se actualizará (mientras que el HTML no)
El objetivo del atributo "datos" es vincular (o "vincular") un valor con el elemento. Muy similar al
onclick="alert('do_something')"
atributo, que une una acción al elemento ... el texto es inútil, solo desea que la acción funcione cuando hacen clic en el elemento.Una vez que los datos o la acción están vinculados al elemento, generalmente no es necesario * actualizar el HTML, solo los datos o el método, ya que eso es lo que usaría su aplicación (JavaScript). En cuanto al rendimiento, no veo por qué querría actualizar también el HTML de todos modos, nadie ve el atributo html (excepto en Firebug u otras consolas).
Una forma en que puede pensar: el HTML (junto con los atributos) son solo texto. Los datos, funciones, objetos, etc. que utiliza JavaScript existen en un plano separado. Solo cuando se le indique a JavaScript que lo haga, leerá o actualizará el texto HTML, pero todos los datos y la funcionalidad que cree con JavaScript actúan completamente separados del texto / atributos HTML que ve en su consola Firebug (u otra).
* Pongo énfasis en general, porque si usted tiene un caso en el que hay que preservar y HTML de exportación (por ejemplo, algún tipo de formato de micro / datos editor de texto conscientes) donde el HTML se carga fresca en otra página, entonces tal vez usted necesita actualizado el código HTML también.
fuente
data
en elattr('data-helptext'
que hace la diferencia, donde la respuesta aceptada y los que tienen muchos votos no están funcionando. +1Me pasó lo mismo a mí. Resulta que
le da un objeto que no se puede escribir. Lo resolví usando:
Y a partir de entonces,
data
fue un objeto JS estándar y grabable.fuente
$.extend...
, puedes usardata
lo que quieras:data.name = 'Nico'; data.questionSolved = true;
yconsole.log(data)
mostrará estas propiedades recién agregadasPara citar una cotización:
.data()
- Documentación jQueryTenga en cuenta que esta limitación (francamente extraña ) solo se retiene al uso de
.data()
.¿La solución? Usar en su
.attr
lugar.Por supuesto, varios de ustedes pueden sentirse incómodos al no usar su método dedicado. Considere el siguiente escenario:
Sentido común: ¿por qué cambiarían un atributo ya establecido como ese? Imagínese
class
comenzar a cambiar el nombre al grupo yid
al identificador . Internet se rompería.E incluso entonces, Javascript en sí mismo tiene la capacidad de solucionar esto. Y, por supuesto, a pesar de su infame incompatibilidad con HTML, REGEX (y una variedad de métodos similares) podría cambiar rápidamente el nombre de sus atributos a este nuevo 'estándar' mítico.
TL; DR
fuente
Como se mencionó, el
.data()
método en realidad no establecerá el valor deldata-
atributo, ni leerá valores actualizados si eldata-
atributo cambia.Mi solución fue extender jQuery con un
.realData()
método que realmente corresponde al valor actual del atributo:NOTA: Claro que podría usarlo
.attr()
, pero desde mi experiencia, la mayoría de los desarrolladores (también conocido como yo) cometen el error de verlo.attr()
y.data()
son intercambiables, y a menudo sustituyen uno por el otro sin pensar. Puede funcionar la mayor parte del tiempo, pero es una excelente manera de introducir errores, especialmente cuando se trata de cualquier tipo de enlace de datos dinámico. Entonces.realData()
, usando , puedo ser más explícito sobre el comportamiento previsto.fuente
Tuve el mismo problema Como todavía puede obtener datos utilizando el método .data (), solo tiene que encontrar una manera de escribir en los elementos. Este es el método auxiliar que uso. Como la mayoría de la gente ha dicho, tendrá que usar .attr. Lo tengo reemplazando cualquier _ con - como sé que lo hace. No conozco ningún otro personaje que reemplace ... sin embargo, no he investigado eso.
EDITAR: 01/05/2017
Descubrí que todavía había casos en los que no podía obtener los datos correctos utilizando los métodos integrados, por lo que lo que uso ahora es el siguiente:
fuente