Установка нескольких атрибутов для элемента сразу с помощью JavaScript
Как установить сразу несколько атрибутов JavaScript? К сожалению, я не могу использовать фреймворк вроде jQuery в этом проекте. Вот что у меня есть сейчас:
var elem = document.createElement("img");
elem.setAttribute("src", "http://example.com/something.jpeg");
elem.setAttribute("height", "100%");
elem.setAttribute("width", "100%");
Ответы
Ответ 1
Вы можете создать вспомогательную функцию:
function setAttributes(el, attrs) {
for(var key in attrs) {
el.setAttribute(key, attrs[key]);
}
}
Назовите его следующим образом:
setAttributes(elem, {"src": "http://example.com/something.jpeg", "height": "100%", ...});
Ответ 2
Вы можете создать функцию, которая принимает переменное число аргументов:
function setAttributes(elem /* attribute, value pairs go here */) {
for (var i = 1; i < arguments.length; i+=2) {
elem.setAttribute(arguments[i], arguments[i+1]);
}
}
setAttributes(elem,
"src", "http://example.com/something.jpeg",
"height", "100%",
"width", "100%");
Или вы передаете пары атрибут/значение в объект:
function setAttributes(elem, obj) {
for (var prop in obj) {
if (obj.hasOwnProperty(prop)) {
elem[prop] = obj[prop];
}
}
}
setAttributes(elem, {
src: "http://example.com/something.jpeg",
height: "100%",
width: "100%"
});
Вы также можете создать свой собственный объект/метод для создания цепочек:
function $$(elem) {
return(new $$.init(elem));
}
$$.init = function(elem) {
if (typeof elem === "string") {
elem = document.getElementById(elem);
}
this.elem = elem;
}
$$.init.prototype = {
set: function(prop, value) {
this.elem[prop] = value;
return(this);
}
};
$$(elem).set("src", "http://example.com/something.jpeg").set("height", "100%").set("width", "100%");
Рабочий пример: http://jsfiddle.net/jfriend00/qncEz/
Ответ 3
Если вы хотите использовать синтаксис framework-esq (Примечание: только IE 8+), вы можете расширить прототип Element
и добавить свою собственную функцию setAttributes
:
Element.prototype.setAttributes = function (attrs) {
for (var idx in attrs) {
if ((idx === 'styles' || idx === 'style') && typeof attrs[idx] === 'object') {
for (var prop in attrs[idx]){this.style[prop] = attrs[idx][prop];}
} else if (idx === 'html') {
this.innerHTML = attrs[idx];
} else {
this.setAttribute(idx, attrs[idx]);
}
}
};
Это позволяет вам использовать синтаксис так:
var d = document.createElement('div');
d.setAttributes({
'id':'my_div',
'class':'my_class',
'styles':{
'backgroundColor':'blue',
'color':'red'
},
'html':'lol'
});
Попробуйте это: http://jsfiddle.net/ywrXX/1/
Если вам не нравится расширять хост-объект (некоторые против) или вам нужна поддержка IE7-, просто используйте его как функцию
Обратите внимание, что setAttribute
не будет работать для style
в IE или обработчиках событий (в любом случае вы не должны). Код выше обрабатывает style
, но не события.
Документация
Ответ 4
Вы можете скопировать вспомогательную функцию ES5.1:
function setAttributes(el, attrs) {
Object.keys(attrs).forEach(key => el.setAttribute(key, attrs[key]));
}
Назовите его следующим образом:
setAttributes(elem, { src: 'http://example.com/something.jpeg', height: '100%' });
Ответ 5
Не могли бы вы просто использовать Object.assign(...)
чтобы применить ваши свойства к созданному элементу?
Имейте в виду, что атрибуты height
и width
определяются в пикселях, а не в процентах. Вам придется использовать CSS, чтобы сделать его плавным.
var elem = document.createElement('img')
Object.assign(elem, {
className: 'my-image-class',
src: 'https://dummyimage.com/320x240/ccc/fff.jpg',
height: 120, // pixels
width: 160, // pixels
onclick: function () {
alert('Clicked!')
}
})
document.body.appendChild(elem)
// One-liner:
// document.body.appendChild(Object.assign(document.createElement(...), {...}))
.my-image-class {
height: 100%;
width: 100%;
border: solid 5px transparent;
box-sizing: border-box
}
.my-image-class:hover {
cursor: pointer;
border-color: red
}
body { margin:0 }
Ответ 6
Или создайте функцию, которая создает элемент, включающий атрибуты из параметров
function elemCreate(elType){
var element = document.createElement(elType);
if (arguments.length>1){
var props = [].slice.call(arguments,1), key = props.shift();
while (key){
element.setAttribute(key,props.shift());
key = props.shift();
}
}
return element;
}
// usage
var img = elemCreate('img',
'width','100',
'height','100',
'src','http://example.com/something.jpeg');
FYI: height/width='100%'
не будет работать с использованием атрибутов. Для высоты/ширины 100% вам нужны элементы style.height/style.width
Ответ 7
Попробуйте это
function setAttribs(elm, ob) {
//var r = [];
//var i = 0;
for (var z in ob) {
if (ob.hasOwnProperty(z)) {
try {
elm[z] = ob[z];
}
catch (er) {
elm.setAttribute(z, ob[z]);
}
}
}
return elm;
}
DEMO: ЗДЕСЬ
Ответ 8
const setAttributes = (el, attrs) =>
Object.entries(attrs)
.forEach(args =>
el.setAttribute(...args))
Ответ 9
используйте эту функцию для одновременного создания и установки атрибутов
function createNode(node, attributes){
const el = document.createElement(node);
for(let key in attributes){
el.setAttribute(key, attributes[key]);
}
return el;
}
используйте это так
const input = createNode('input', {
name: 'test',
type: 'text',
placeholder: 'Test'
});
document.body.appendChild(input);
Ответ 10
Я думаю, это лучший способ установить атрибуты сразу для любого элемента в этом классе.
function SetAtt(elements, attributes) {
for (var element = 0; element < elements.length; element++) {
for (var attribute = 0; attribute < attributes.length; attribute += 2) {
elements[element].setAttribute(attributes[attribute], attributes[attribute + 1]);
}
}
}
var Class = document.getElementsByClassName("ClassName"); // class array list
var Data = ['att1', 'val1', 'att2', 'val2', 'att3', 'val3']; //attributes array list
SetAtt(Class, Data);