Когда использовать метод setAttribute и атрибут= в JavaScript?
имеет наилучшую практику использования setAttribute
вместо точки (.
) была разработана нотация атрибутов?
например:
myObj.setAttribute("className", "nameOfClass");
myObj.setAttribute("id", "someID");
или
myObj.className = "nameOfClass";
myObj.id = "someID";
7 ответов
вы всегда должны использовать direct .attribute
форма (но см. ссылку quirksmode ниже), если вы хотите программный доступ в JavaScript. Он должен правильно обрабатывать различные типы атрибутов (думать "onload").
использовать getAttribute
/setAttribute
когда вы хотите иметь дело с DOM как есть (например, только буквальный текст). Разные браузеры путают два. См.режимы причуды: атрибут (в)Совместимость.
С Javascript: Окончательное Руководство, это проясняет ситуацию. Он отмечает, что HTMLElement объекты HTML-документа определяют свойства JS, соответствующие всем стандартным атрибутам HTML.
поэтому вам нужно использовать setAttribute
для нестандартных атрибутов.
пример:
node.className = 'test'; // works
node.frameborder = '0'; // doesn't work - non standard attribute
node.setAttribute('frameborder', '0'); // works
ни один из предыдущих ответов не полным и содержать дезинформацию.
существует три способа доступа к атрибутам DOM элемент в JavaScript. Все три надежно работают в современных браузерах, пока вы понимаете, как их использовать.
1. element.attributes
элементы имеют свойство атрибуты это возвращает live NamedNodeMap of Attr объекты. Индекс эта коллекция может отличаться среди браузеров. Таким образом, заказ не гарантируется. NamedNodeMap
имеет методы добавления и удаления атрибутов (getNamedItem
и setNamedItem
, соответственно).
обратите внимание, что хотя XML явно чувствителен к регистру, спецификация DOM вызывает имена строк для нормализации, поэтому имена переданы getNamedItem
эффективно нечувствительны к регистру.
пример Использование:
var div = document.getElementsByTagName('div')[0];
//you can look up specific attributes
var classAttr = div.attributes.getNamedItem('CLASS');
document.write('attributes.getNamedItem() Name: ' + classAttr.name + ' Value: ' + classAttr.value + '<br>');
//you can enumerate all defined attributes
for(var i = 0; i < div.attributes.length; i++) {
var attr = div.attributes[i];
document.write('attributes[] Name: ' + attr.name + ' Value: ' + attr.value + '<br>');
}
//create custom attribute
var customAttr = document.createAttribute('customTest');
customAttr.value = '567';
div.attributes.setNamedItem(customAttr);
//retreive custom attribute
customAttr = div.attributes.getNamedItem('customTest');
document.write('attributes.getNamedItem() Name: ' + customAttr.name + ' Value: ' + customAttr.value + '<br>');
<div class="class1" id="main" data-test="stuff" nonStandard="1234"></div>
2. element.getAttribute
& element.setAttribute
эти методы существуют непосредственно на Element
без доступа attributes
и его методы, но выполняют те же функции.
опять же, обратите внимание, что имя строки не чувствительны к регистру.
Пример Использования:
var div = document.getElementsByTagName('div')[0];
//get specific attributes
document.write('Name: class Value: ' + div.getAttribute('class') + '<br>');
document.write('Name: ID Value: ' + div.getAttribute('ID') + '<br>');
document.write('Name: DATA-TEST Value: ' + div.getAttribute('DATA-TEST') + '<br>');
document.write('Name: nonStandard Value: ' + div.getAttribute('nonStandard') + '<br>');
//create custom attribute
div.setAttribute('customTest', '567');
//retreive custom attribute
document.write('Name: customTest Value: ' + div.getAttribute('customTest') + '<br>');
<div class="class1" id="main" data-test="stuff" nonStandard="1234"></div>
3. Свойства объекта DOM, такие как element.id
многие атрибуты могут быть доступны с помощью удобных свойств на объекте DOM. Какие атрибуты существуют, зависит от типа узла DOM, а не какие атрибуты определены в HTML. Свойства определяются где-то в цепочке прототипов рассматриваемого объекта DOM. Определенные свойства будут зависеть от типа элемента, к которому вы обращаетесь. Например, className
и id
определены Element
и существуют на всех узлах DOM, которые являются элементами (т. е. не текст или комментарии). Но!--20--> уже. Это определено на HTMLInputElement
и не может существовать на других элементах.
обратите внимание, что свойства JavaScript чувствительны к регистру. Хотя большинство свойств будет использовать нижний регистр, некоторые из них camelCase. Поэтому всегда проверяйте спецификацию, чтобы быть уверенным.
эта "диаграмма" захватывает часть цепочки прототипов для этих объектов DOM. Он даже не близок к завершению, но он захватывает общее структура.
____________Node___________
| | |
Element Text Comment
| |
HTMLElement SVGElement
| |
HTMLInputElement HTMLSpanElement
Пример Использования:
var div = document.getElementsByTagName('div')[0];
//get specific attributes
document.write('Name: class Value: ' + div.className + '<br>');
document.write('Name: id Value: ' + div.id + '<br>');
document.write('Name: ID Value: ' + div.ID + '<br>'); //undefined
document.write('Name: data-test Value: ' + div.dataset.test + '<br>'); //.dataset is a special case
document.write('Name: nonStandard Value: ' + div.nonStandard + '<br>'); //undefined
<div class="class1" id="main" data-test="stuff" nonStandard="1234"></div>
предостережение: это объяснение того, как спецификация HTML определяет и современные браузеры обрабатывают атрибуты. Я не пытался иметь дело с ограничениями древних, сломанных браузеров. Если вам нужно поддерживать старые браузеры, в дополнение к этой информации, вам нужно будет знать, что сломано в этих браузерах.
один случай я нашел где setAttribute
необходимо при изменении атрибутов арии, так как нет соответствующих свойств. Например
x.setAttribute('aria-label', 'Test');
x.getAttribute('aria-label');
нет x.arialabel
или что-то в этом роде, поэтому вы должны использовать setAttribute.
Edit:x ["aria-label"] не работает. Вам действительно нужен setAttribute.
x.getAttribute('aria-label')
null
x["aria-label"] = "Test"
"Test"
x.getAttribute('aria-label')
null
x.setAttribute('aria-label', 'Test2')
undefined
x["aria-label"]
"Test"
x.getAttribute('aria-label')
"Test2"
Это похоже на один случай, когда лучше использовать setAttribute:
Dev.Opera-Эффективный JavaScript
var posElem = document.getElementById('animation');
var newStyle = 'background: ' + newBack + ';' +
'color: ' + newColor + ';' +
'border: ' + newBorder + ';';
if(typeof(posElem.style.cssText) != 'undefined') {
posElem.style.cssText = newStyle;
} else {
posElem.setAttribute('style', newStyle);
}
" когда использовать setAttribute vs .атрибут= в JavaScript?"
общее правило-использовать .attribute
и проверьте, работает ли он в браузере.
..Если он работает в браузере, вы можете идти.
..Если это не так, используйте .setAttribute(attribute, value)
вместо .attribute
на это.
Rinse-повторите для всех атрибутов.
Ну, если вы ленивы, вы можете просто использовать .setAttribute
. Это должно работать нормально на большинстве броузеры. (Хотя браузеры, которые поддерживают .attribute
может оптимизировать его лучше, чем .setAttribute(attribute, value)
.)
методы для установки атрибутов (например, class) на элементе: 1. Эль.className = строка 2. Эль.setAttribute ('class', строка) 3. Эль.атрибуты.setNamedItem(объект) 4. Эль.setAttributeNode (node)
Я сделал простой тест тест (здесь)
и кажется, что setAttributeNode примерно в 3 раза быстрее, чем с помощью setAttribute.
поэтому, если производительность является проблемой-используйте "setAttributeNode"