¿Cómo puedo configurar varios atributos a la vez con JavaScript? Desafortunadamente, no puedo usar un marco como jQuery en este proyecto. Esto es lo que tengo ahora:
var elem = document.createElement("img");
elem.setAttribute("src", "http://example.com/something.jpeg");
elem.setAttribute("height", "100%");
elem.setAttribute("width", "100%");
javascript
JP Silvashy
fuente
fuente
Object.assign()
pena mirar la respuesta de @Quantastical para aquellos que no quieren crear una función auxiliar; funciona para "todas las propiedades enumerables y propias ".Respuestas:
Podrías hacer una función de ayuda:
function setAttributes(el, attrs) { for(var key in attrs) { el.setAttribute(key, attrs[key]); } }
Llámalo así:
setAttributes(elem, {"src": "http://example.com/something.jpeg", "height": "100%", ...});
fuente
elem.setAttribute()
varias veces.Es posible que pueda utilizar
Object.assign(...)
para aplicar sus propiedades al elemento creado. Consulte los comentarios para obtener detalles adicionales.Tenga en cuenta que los atributos
height
ywidth
se definen en píxeles , no en porcentajes. Tendrás que usar CSS para hacerlo fluido.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 }
fuente
Si desea una sintaxis framework-esq ( Nota: solo soporte IE 8+), puede extender el
Element
prototipo y agregar su propiasetAttributes
función: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]); } } };
Esto le permite usar una sintaxis como esta:
var d = document.createElement('div'); d.setAttributes({ 'id':'my_div', 'class':'my_class', 'styles':{ 'backgroundColor':'blue', 'color':'red' }, 'html':'lol' });
Pruébelo: http://jsfiddle.net/ywrXX/1/
Si no le gusta extender un objeto host ( algunos se oponen ) o necesita ser compatible con IE7, simplemente utilícelo como una función
Tenga en cuenta que
setAttribute
no funcionarástyle
en IE ni en los controladores de eventos (de todos modos, no debería hacerlo). El código anterior manejastyle
, pero no eventos.Documentación
setAttribute
en MDN - https://developer.mozilla.org/en-US/docs/DOM/element.setAttributefuente
'Element' is undefined
document.createElement
ydocument.getElementById
ajustar esto ... o simplemente envolver la funcionalidad en una función. Respuesta editada para incluir esa notaPuede crear una función que tome un número variable de argumentos:
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%");
O pasa los pares de atributo / valor en un objeto:
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%" });
También puede crear su propio método / contenedor de objetos encadenables:
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%");
Ejemplo de trabajo: http://jsfiddle.net/jfriend00/qncEz/
fuente
Puede codificar una función auxiliar de ES5.1:
function setAttributes(el, attrs) { Object.keys(attrs).forEach(key => el.setAttribute(key, attrs[key])); }
Llámalo así:
setAttributes(elem, { src: 'http://example.com/something.jpeg', height: '100%' });
fuente
const setAttributes = (el, attrs) => Object.entries(attrs) .forEach(args => el.setAttribute(...args))
fuente
O cree una función que cree un elemento que incluya atributos de parámetros
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%'
no funcionaría usando atributos. Para una altura / ancho del 100% necesitas los elementosstyle.height/style.width
fuente
clone
sería preferible utilizar el método. No es necesario crear todo el nodo desde cero. De todos modos, es de máxima prioridad minimizar el acceso al DOM, el caso de uso más común.Prueba esto
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: AQUÍ
fuente
use esta función para crear y establecer atributos al mismo tiempo
function createNode(node, attributes){ const el = document.createElement(node); for(let key in attributes){ el.setAttribute(key, attributes[key]); } return el; }
úsalo así
const input = createNode('input', { name: 'test', type: 'text', placeholder: 'Test' }); document.body.appendChild(input);
fuente
Supongo que es la mejor manera de establecer atributos a la vez para cualquier elemento de esta clase.
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);
fuente
simplemente puede agregar un método (setAttributes, con "s" al final) al prototipo de "Elemento" como:
Element.prototype.setAttributes = function(obj){ for(var prop in obj) { this.setAttribute(prop, obj[prop]) } }
puedes definirlo en una línea:
Element.prototype.setAttributes = function(obj){ for(var prop in obj) this.setAttribute(prop, obj[prop]) }
y puede llamarlo normalmente como llama a los otros métodos. Los atributos se dan como un objeto:
elem.setAttributes({"src": "http://example.com/something.jpeg", "height": "100%", "width": "100%"})
puede agregar una instrucción if para generar un error si el argumento dado no es un objeto.
fuente