JS код говорит, что все атрибут изменен и даже выводит новое значение, но физически ничего не меняется...
Если посмотреть код, атрибут data-id по прежнему 12, как такое может быть?
data в jquery работает по-своему, а исходные значения берет из data-* аттрибутов. Для изменения аттрибутов напрямую их надо менять через attr('data-x', val)
habrahabr.ru/post/139210
"Один минус (а может и не минус) — это то, что в data() сохранится только изначальное значение (кешируется), и если мы изменим значение атрибута (например, через .attr(‘data-foo-bar’, 456)), то получая .data('fooBar') увидим наше старое значение."
Потому что атрибут data-{name} и функция data({name}) это разные вещи.
Если у элемента не указан element.data({name}, value), то jquery берет значение из атрибута.