Przechowuję dane stosując data-
podejście w tagu HTML w następujący sposób:
<td><"button class='delete' data-imagename='"+results[i].name+"'>Delete"</button></td>
Następnie pobieram dane w takim wywołaniu zwrotnym:
$(this).data('imagename');
To działa dobrze. Utknąłem na tym, że próbuję zapisać obiekt zamiast tylko jednej z jego właściwości. Próbowałem to zrobić:
<td><button class='delete' data-image='"+results[i]+"'>Delete</button></td>
Następnie próbowałem uzyskać dostęp do właściwości nazwy w następujący sposób:
var imageObj = $(this).data('image');
console.log('Image name: '+imageObj.name);
Dziennik mi mówi undefined
. Wygląda więc na to, że mogę przechowywać proste ciągi w data-
atrybutach, ale nie mogę przechowywać obiektów JSON ...
Próbowałem też użyć tego dzieciaka składni bez powodzenia:
<div data-foobar='{"foo":"bar"}'></div>
Masz jakiś pomysł, jak zapisać rzeczywisty obiekt w tagu HTML przy użyciu tego data-
podejścia?
htmlspecialchars(json_encode($e))
(pomysł z komentarzy Nicolasa ).jsonObject
musi być poddane stringifikacji? edytuj: na wypadek, gdyby to pomogło komuś innemu, właśnie znalazłem odpowiedź na to pytanie tutaj: stackoverflow.com/a/42864472"You don't need to stringify objects to store them using jQuery.data()"
Właściwie twój ostatni przykład:
wydaje się, że działa dobrze (patrz http://jsfiddle.net/GlauberRocha/Q6kKU/ ).
Fajną rzeczą jest to, że ciąg znaków w atrybucie data jest automatycznie konwertowany na obiekt JavaScript. Nie widzę żadnej wady w tym podejściu, wręcz przeciwnie! Jeden atrybut wystarczy do przechowywania całego zestawu danych, gotowych do użycia w JavaScript poprzez właściwości obiektu.
(Uwaga: aby atrybutom danych automatycznie nadawano typ Object zamiast String, należy zachować ostrożność przy zapisywaniu poprawnego formatu JSON, w szczególności w celu ujęcia nazw kluczy w podwójne cudzysłowy).
źródło
$('div').data('foobar').foo
. api.jquery.com/data'
nie działa dla mnie, gdy jaecho json_encode($array)
z php. Ponieważ kończy wartość atrybutu pojedynczym cudzysłowem. Wszelkie sugestie, z wyjątkiem ręcznego usuwania pojedynczego cudzysłowu z tablicy.?&quot;
(encja HTML z podwójną ucieczką), aby była renderowana w źródle jako„. Ale może właśnie tego chcesz uniknąć, mówiąc „unikanie pojedynczych cytatów ręcznie” ...Tak to u mnie zadziałało.
Obiekt
Zestaw
Zakoduj obiekt z ograniczeniami za pomocą metody encodeURIComponent () i ustaw jako atrybut:
Dostać
Aby uzyskać wartość jako obiekt, przeanalizuj zdekodowaną wartość atrybutu za pomocą decodeURIComponent () :
źródło
Wiele problemów z przechowywaniem serializowanych danych można rozwiązać, konwertując serializowany ciąg na base64 .
Ciąg base64 można zaakceptować prawie wszędzie bez problemu.
Spojrzeć na:
Konwertuj na / z w razie potrzeby.
źródło
window.btoa
JSON.parse
zanim będziesz mógł użyć wyniku jako obiektu.U mnie tak to działa, ponieważ muszę to przechowywać w szablonie ...
źródło
$('body').data('myData', { h: "hello", w: "world" })
_____________________________________________________________________________________________, otrzymasz swój obiekt JSON przez$('body').data().myData
'<div data-dataObj=\''+ JSON.stringify(dataObj) +'\'></div>'
. To są pojedyncze cudzysłowy, początek i koniec są po prostu unikane, więc byłoby to samo, co posiadanie'{"some":"thing"}'
replace()
dotyczy możliwości pojawiania się pojedynczych cudzysłowów w danych json, co jest całkowicie możliwe.Sztuczka polegała na dodaniu podwójnych cudzysłowów wokół kluczy i wartości . Jeśli używasz funkcji PHP, takiej jak
json_encode
, poda ci ciąg zakodowany w formacie JSON i pomysł, jak poprawnie zakodować swój.jQuery('#elm-id').data('datakey')
zwróci obiekt ciągu, jeśli ciąg jest poprawnie zakodowany jako json.Zgodnie z dokumentacją jQuery: ( http://api.jquery.com/jquery.parsejson/ )
Przekazanie zniekształconego ciągu JSON powoduje zgłoszenie wyjątku JavaScript. Na przykład wszystkie poniższe są nieprawidłowe ciągi JSON:
"{test: 1}"
(test
nie ma wokół niego podwójnych cudzysłowów)."{'test': 1}"
('test'
używa pojedynczych cudzysłowów zamiast podwójnych cudzysłowów)."'test'"
('test'
używa pojedynczych cudzysłowów zamiast podwójnych cudzysłowów).".1"
(liczba musi zaczynać się od cyfry;"0.1"
byłaby ważna)."undefined"
(undefined
nie może być reprezentowany w ciągu JSON;null
jednak może być)."NaN"
(NaN
nie może być reprezentowany w ciągu JSON; bezpośrednia reprezentacja Infinity to również nźródło
Połącz użycie
window.btoa
iwindow.atob
razem zJSON.stringify
iJSON.parse
.- Działa to w przypadku ciągów zawierających pojedyncze cudzysłowy
Kodowanie danych:
Dekodowanie danych:
Oto przykład, w jaki sposób dane są konstruowane i dekodowane później za pomocą zdarzenia kliknięcia.
Skonstruuj HTML i zakoduj dane:
Dekoduj dane w module obsługi zdarzeń kliknięcia:
źródło
Użycie udokumentowanej składni jquery .data (obj) umożliwia przechowywanie obiektu w elemencie DOM. Sprawdzanie elementu nie pokaże
data-
atrybutu, ponieważ nie określono klucza dla wartości obiektu. Jednak do danych w obiekcie można się odwoływać za pomocą klucza z.data("foo")
lub można zwrócić cały obiekt za pomocą.data()
.Zakładając więc, że skonfigurujesz pętlę i
result[i] = { name: "image_name" }
:źródło
Z jakiegoś powodu zaakceptowana odpowiedź działała dla mnie tylko wtedy, gdy była używana raz na stronie, ale w moim przypadku próbowałem zapisać dane na wielu elementach na stronie i dane zostały w jakiś sposób utracone na wszystkich poza pierwszym elementem.
Alternatywnie, zapisałem dane do domeny i przeanalizowałem je z powrotem, gdy było to potrzebne. Być może jest mniej wydajna, ale działała dobrze w moim celu, ponieważ naprawdę tworzę prototypy danych i nie piszę ich do produkcji.
Aby zapisać dane, których użyłem:
Odczytanie danych jest takie samo, jak zaakceptowana odpowiedź, a mianowicie:
Zrobienie tego w ten sposób sprawiło, że dane pojawiły się w dom, gdybym miał sprawdzić element za pomocą debugera Chrome.
źródło
.data()
działa idealnie w większości przypadków. Jedyny raz, kiedy miałem problem, miał miejsce, gdy sam ciąg JSON miał pojedynczy cudzysłów. Nie mogłem znaleźć łatwego sposobu na obejście tego, więc uciekłem się do tego podejścia (używam Coldfusion jako języka serwera):źródło
Dla przypomnienia, stwierdziłem, że działa następujący kod. Umożliwia pobranie tablicy ze znacznika danych, przekazanie nowego elementu i zapisanie go z powrotem w znaczniku danych we właściwym formacie JSON. W razie potrzeby ten sam kod może być zatem ponownie użyty do dodania kolejnych elementów do tablicy. Okazało się, że
$('#my-data-div').attr('data-namesarray', names_string);
poprawnie przechowuje tablicę, ale$('#my-data-div').data('namesarray', names_string);
nie działa.źródło
});
źródło
Ten kod działa dobrze dla mnie.
Koduj dane za pomocą btoa
A następnie dekoduj go za pomocą atob
źródło