Konvertieren von data-*-Attributen in ein Objekt

Lesezeit: 3 Minuten

Benutzer-Avatar
Kamelblau

Ich spiele mit dem herum attr-daten-* Attribute von HTML5 und dem entsprechenden Javascript Datensatz

Ich mache viel dynamische Formularverarbeitung, also bekomme ich am Ende Sachen wie diese:

<input data-feaux="bar" data-fizz="buzz"/>

Seit HTMLElement.dataset gibt a zurück DOM string mapder einzige Weg, wie ich herausfinden kann, wie ich es in ein natives Objekt umwandeln kann, ist:

var obj = JSON.parse(JSON.stringify(input_el.dataset))

Gibt es einen besseren Weg, dies zu tun?

Bearbeiten:

Warum sollte ich das tun wollen? Nehmen wir an, ich habe viele, viele dieser Elemente. Ich möchte sie alle durchlaufen und sie zur späteren Verarbeitung in ein Array schieben, dh

elements = document.querySelectorAll("input")
my_data_array = []
for(var i = 0; i < elements.length; i++) {
    my_data_array.push(elements[i].dataset)
}

Jetzt habe ich ein Array von Objekten, dh [{feaux: "bar", fizz:"buzz"}....] mit dem ich arbeiten kann.

Wenn ich die jedoch nicht umwandle DOM string map in ein Objekt, das Array wird nicht gefüllt (dh der obige Code funktioniert nicht)

Bearbeiten 2

Bei näherer Betrachtung handelt es sich tatsächlich um eine DOM string mapnicht ein object. Korrektur von Tippfehlern in der ursprünglichen Frage, um dies widerzuspiegeln.

  • Es ist bereits ein Objekt. Warum willst du, dass es nativ ist?

    – Keks Monster

    16. Mai 2014 um 19:30 Uhr


  • @cookiemonster weil DOM string object mag es nicht, in ein Array gedrängt zu werden und ich verliere die Schlüssel; Ich habe meine Frage bearbeitet, um ein Beispiel zu geben

    – Kamelblau

    30. Mai 2014 um 19:29 Uhr

  • In welchem ​​Browser geht das nicht? Funktioniert bei mir im Firefox einwandfrei. …funktioniert auch in Chrome.

    – Keks Monster

    30. Mai 2014 um 20:04 Uhr


  • …wie auch immer, wenn man das speichern wollte dataset Objekte, Sie könnten genauso gut die Elemente selbst speichern, da Sie die gespeichert haben dataset wird einen Verweis auf das Element beibehalten, da die dataset verlässt sich darauf, dass das Element funktioniert.

    – Keks Monster

    30. Mai 2014 um 20:06 Uhr

  • @cookiemonster ja, ich kann das in der Konsole von Chrome zum Laufen bringen, aber aus irgendeinem Grund wird es aus einer Skriptdatei geladen oder mit einem kopflosen Webbrowser ausgeführt, der DOM string maps Gehen Sie nicht richtig in das Array. Ich werde weitere Tests durchführen; Dies könnte ein Fehler weiter oben in der Zeile sein: P

    – Kamelblau

    30. Mai 2014 um 20:38 Uhr

Benutzer-Avatar
Agung Prasetyo

Sie können verwenden Objektzuweisung

Object.assign({}, element.dataset) 

Für Browser, die Object.assign nicht unterstützen, können Sie verwenden Polyfill

  • Auf dem neuesten Safari funktioniert dies nicht. Gibt immer leer zurück {} Also müssen Sie den Datensatz zuerst in ein normales Objekt umwandeln.

    – Mevrael

    25. Juli 2016 um 11:05 Uhr

  • wurde gerade von diesem gebissen. Safari 9.x schlägt fehl. Safari 10.x+ funktioniert.

    – Georg Katsanos

    15. Juni 2017 um 8:28 Uhr

in es6 können Sie die Objektverteilung verwenden.
{ ...element.dataset }

Vergessen Sie nicht JSON.stringify und JSON.parse.

var data = document.getElementById('someElement').dataset;
data = JSON.parse(JSON.stringify(data));

Entsprechend Mozilla Dies sollte ohne Polyfill bis zurück zu IE 8 funktionieren.

Benutzer-Avatar
Bob

Hier ist eine kleine Funktion, um den Elementdatensatz als normales Objekt abzurufen:

function datasetToObject(elem){
    var data = {};
    [].forEach.call(elem.attributes, function(attr) {
        if (/^data-/.test(attr.name)) {
            var camelCaseName = attr.name.substr(5).replace(/-(.)/g, function ($0, $1) {
                return $1.toUpperCase();
            });
            data[camelCaseName] = attr.value;
        }
    });
    return data;
}

Geschöpft von: Holen Sie sich eine Liste von Daten-*-Attributen mit Javascript / jQuery

1054870cookie-checkKonvertieren von data-*-Attributen in ein Objekt

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy