2014-05-16 3 views
9

Я играл вокруг с attr-data-* атрибутами HTML5 и соответствующей JavaScript datasetПреобразование данных- * атрибуты объекта

Я делаю много динамической обработки формы, так что я в конечном итоге получить вещи, как это:

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

с HTMLElement.dataset возвращает DOM string map, единственный способ, которым я могу понять, как превратить его в родной объект является:

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

Есть ли лучший способ сделать это?

Edit:

Почему я хочу, чтобы это сделать? Допустим, у меня много, многие из этих элементов. Я хочу, чтобы перебрать их все и толкать их в массив для последующей обработки, т.е.

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

Теперь у меня есть массив объектов, то есть [{feaux: "bar", fizz:"buzz"}....], что я могу работать.

Однако, когда я не превратить DOM string map в объект, массив не заполнит список (т.е. выше код не работает)

Edit 2

Приглядевшись, это фактически DOM string map, а не object. Исправление опечаток в исходном вопросе, чтобы отразить это.

+0

Это уже объект. Почему вы хотите, чтобы это было родным? –

+1

@cookiemonster, потому что 'DOM string object' не нравится вставлять в массив, и я теряю ключи; Я отредактировал мой вопрос, чтобы привести пример – CamelBlues

+0

В каком браузере это не работает? Работает отлично для меня в Firefox. ... также работает в Chrome. –

ответ

11

Вы можете использовать Object.assign

Object.assign({}, element.dataset) 

Для браузеров, которые Безразлично 't support Object.assign вы можете использовать polyfill

+7

В последнем Safari это не работает. Возвращает всегда пусто {} Поэтому вам сначала нужно преобразовать набор данных в обычный объект. – Mevrael

+2

был просто укушен этим. Safari 9.x не работает. Safari 10.x + работает. –

2

Вот небольшая функция для извлечения элемента набора данных в качестве обычного объекта:

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; 
} 

почерпнутый: Get list of data-* attributes using javascript/jQuery

0

Не забудьте про JSON.stringify и JSON.parse.

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

По Mozilla это должно работать весь путь обратно в IE 8 без polyfill.

Смежные вопросы