2016-12-07 1 views
1

Есть ли способ установить атрибуты элемента DOM с использованием необработанной строки?Есть ли способ установить несколько атрибутов для одного тега за один проход, используя необработанную строку?

data-attr1name="attr1val" data-attr2name="attr2val" data-attr3name="attr3val"

Да я могу разобрать строку и использовать $(..).attr() для установки каждого значения, но я искал способ избежать unnessessary двойного преобразования из-за соображения производительности (там может быть много данных, полученных от сервером и множеством атрибутов на один тег, поэтому установка всех атрибутов для одного тега за один проход может дать значительное улучшение в интерфейсе). В любом случае, если у меня уже есть часть reday-to-use санатизированного HTML-кода - почему бы не использовать его напрямую.

UPD: что НЕ дубликата вопрос о том, как установить несколько атрибутов на один вызов, потому что я ищу способ избегания парсинга атрибуты valueas на всех, поэтому следующее решение оленья кожа ответить на мой вопрос:

d.setAttributes({ 
'id':'my_div', 
'class':'my_class', 
'styles':{ 
    'backgroundColor':'blue', 
    'color':'red' 
}, 
'html':'lol' 
}); 

, потому что я до сих пор должны разобрать строку источника такой способ

UPD2 просто для объяснения: эта строка отправляется контроллером, который генерирует его для использования в шаблоне Smarty следующим образом: <a href="#" class="someclasses"{$additional_tags}></a>, но в этом случае я получаю строку не как переменную smarty, а как часть ответа ajax.

+0

Я не полностью понять, чего вы пытаетесь избежать. Можете ли вы просто отформатировать значение атрибута таким образом, чтобы его можно было легко проанализировать, чтобы извлечь несколько разных значений? – kinakuta

+0

Возможный дубликат [Установка нескольких атрибутов для элемента сразу с помощью JavaScript] (http://stackoverflow.com/questions/12274748/setting-multiple-attributes-for-an-element-at-once-with-javascript) – Pineda

+0

@Pineda nope, а не дубликат, я ищу способ избежать разбора вообще – AlexandrX

ответ

2

Это ответ на вопрос, но не обязательно отличная идея.

Он использует обратный вызов замены на outerHTML, а обратные вызовы почти всегда дороже альтернативного подхода.

Я не могу себе представить, что падение производительности установки атрибутов в последовательности имеет большое значение, если у вас есть серьезно сумасшедшее число элементов, но здесь идет, тем не менее:

var 
el = document.querySelector('p'), 
attrs = 'style="color: blue" title="hello" data-etc="foo"'; 
el.outerHTML = el.outerHTML.replace(/<[^ >]+/i, function(tag) { return tag+' '+attrs; }); 

Fiddle

+1

, по крайней мере, вы дали идею, спасибо за идею :) – AlexandrX

+0

... но мало что показало, что это действительно больше дорогой, а затем одноразовый регулярный анализ регулярного выражения :( – AlexandrX

+0

... hmmm ... но почему callback вызывается один раз за матч, другими словами - один раз за тег, как мне хотелось ... callback может быть заменен на «match + конкатенация "... внутренний парсер shoul parse атрибут быстрее, чем я ... в чем причина улучшения? да, я знаю, что это обсуждение выходит из SE-формата, поэтому я извиняюсь заранее :) .. но на самом деле ... почему? – AlexandrX