Zapis i odczyt data-attribute w DOM

Czasami trzeba zapisać coś w strukturze DOM, a potem odczytać te dane ponownie. I ponownie zapisać i odczytać i jeszcze raz. Z pomocą przychodzi wtedy nieśmiertelne jQuery. Znajdujemy wtedy interesujący nas element $(element) a następnie przy pomocy metody .data(“…”) odczytujemy wartość, lub .data(“…”,”…..”) zapisujemy wartość. jQuery lubi te dane sobie zapisać w swoim cache. Może się więc okazać, że każdy kolejny odczyt wskazywać będzie zawsze tą wartość, którą odczytaliśmy za pierwszym razem. Co wtedy? Są dwa sposoby; kiedyś udało nam się rozwiązać ten problem korzystając z innej metody, ale też jQuery; mianowicie .attr(“data-….”) i symetrycznie .attr(“data-…”, “…”) do odpisu i zaczytu (literówki!). Czasem i to nie wystarcza i wtedy należy sięgnąć po wanilie i skorzystać z getAttribute(“data-…”) oraz setAttribute(“data-…”,”…”) – te ostatnie zawsze działają. Jeden jedyny minusiczek, to taki: że jest to wyłom w spójności kodu, tzn. jeśli wszędzie używamy jQuery, a gdzieś wanilii, to dla części może to kłuć w oczy.

 

//EDIT (05.03.2016)
Przygotowałem przykład dostępny w jsfiddle jak i w giscie. Wygląda na to, w zmęczeniu przegapiłem pewne zależności lub coś działało jeszcze inaczej. Mianowicie problem z odczytem pojawia się wtedy gdy zapiszemy do data przy pomocy setAttribute a odczytamy za pomocą $.data, lub zapiszemy $.attr i odczytamy $.data. W tych przypadkach dane nie zostaną odświeżone. Sami sprawdźcie. Podziękowania dla @jarekkoziol za bycie ciekawskim.

GIST:

<!document html>
<html>
<head>
<meta charset="utf-8" />
<script src="https://code.jquery.com/jquery-2.2.1.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container">
<div class="row">
<div class="col-lg-6" id="outputPlain">Tutaj będzie widać wartość która ustawisz w data</div>
<div class="col-lg-6" id="outputData">Do tego elementu będę wypisaywać wartość odczytaną z data</div>
</div>
<div class="row">
<input id="inputSource" type="text" name="textInput"/>
</div>
<div class="row">
<button id="writeData">Zapisz z jQuery data</button>
<button id="writeAttr">Zapisz z jQuery attr</button>
<button id="writeJS">Zapisz z setAttribute</button>
<button id="readData">Czytaj z jQuery data</button>
<button id="readAttr">Czytaj z jQuery attr</button>
<button id="readJS">Czytaj z setAttribute</button>
</div>
</div>
<script type="text/javascript">
var onWriteDataClick=function(){
var text = $("#inputSource").val();
$("#outputPlain").text(text);
$("#outputData").data("blog-example", text);
};
var onWriteAttrClick=function(){
var text = $("#inputSource").val();
$("#outputPlain").text(text);
$("#outputData").attr("data-blog-example", text);
};
var onWriteJSClick=function(){
var text = $("#inputSource").val();
$("#outputPlain").text(text);
document.getElementById("outputData").setAttribute("data-blog-example", text);
};
var onReadDataClick=function(){
var text = $("#outputData").data("blog-example");
$("#outputData").text(text);
};
var onReadAttrClick=function(){
var text = $("#outputData").attr("data-blog-example");
$("#outputData").text(text);
};
var onReadJSClick=function(){
var text = document.getElementById("outputData").getAttribute("data-blog-example");
$("#outputData").text(text);
};
$("#writeData").on("click", onWriteDataClick);
$("#writeAttr").on("click", onWriteAttrClick);
$("#writeJS").on("click", onWriteJSClick);
$("#readData").on("click", onReadDataClick);
$("#readAttr").on("click", onReadAttrClick);
$("#readJS").on("click", onReadJSClick);
</script>
</body>
</html>

JSFiddle:
https://jsfiddle.net/jstadnicki/ydtry0c9/

3 thoughts on “Zapis i odczyt data-attribute w DOM

  1. Pingback: dotnetomaniak.pl
  2. Ciekawy problem. Masz jakiś przykład w którym jquery zwracała zcachowaną wartość z .data(..)? Bytam bo jeszcze nie spotkałem się z takim problemem, a dobrze byłoby wiedzieć czego unikać.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.