Comment puis-je définir plusieurs attributs à la fois avec JavaScript? Malheureusement, je ne suis pas en mesure d'utiliser un framework comme jQuery sur ce projet. Voici ce que j'ai maintenant:
var elem = document.createElement("img");
elem.setAttribute("src", "http://example.com/something.jpeg");
elem.setAttribute("height", "100%");
elem.setAttribute("width", "100%");
javascript
JP Silvashy
la source
la source
Object.assign()
vaut le coup d'œil pour ceux qui ne veulent pas créer de fonction d'assistance - fonctionne pour "toutes les propriétés énumérables et propres ".Réponses:
Vous pouvez créer une fonction d'assistance:
function setAttributes(el, attrs) { for(var key in attrs) { el.setAttribute(key, attrs[key]); } }
Appelez ça comme ça:
setAttributes(elem, {"src": "http://example.com/something.jpeg", "height": "100%", ...});
la source
elem.setAttribute()
plusieurs fois.Vous pourrez peut-être utiliser
Object.assign(...)
pour appliquer vos propriétés à l'élément créé. Voir les commentaires pour plus de détails.Gardez à l'esprit que les attributs
height
etwidth
sont définis en pixels et non en pourcentages. Vous devrez utiliser CSS pour le rendre fluide.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 }
la source
Si vous vouliez une syntaxe framework-esq ( Remarque: prise en charge d' IE 8+ uniquement), vous pouvez étendre le
Element
prototype et ajouter votre propresetAttributes
fonction: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]); } } };
Cela vous permet d'utiliser une syntaxe comme celle-ci:
var d = document.createElement('div'); d.setAttributes({ 'id':'my_div', 'class':'my_class', 'styles':{ 'backgroundColor':'blue', 'color':'red' }, 'html':'lol' });
Essayez-le: http://jsfiddle.net/ywrXX/1/
Si vous n'aimez pas étendre un objet hôte ( certains sont opposés ) ou si vous devez prendre en charge IE7-, utilisez-le simplement comme une fonction
Notez que
setAttribute
cela ne fonctionnera passtyle
dans IE ou dans les gestionnaires d'événements (vous ne devriez pas de toute façon). Le code ci-dessus gèrestyle
, mais pas les événements.Documentation
setAttribute
sur MDN - https://developer.mozilla.org/en-US/docs/DOM/element.setAttributela source
'Element' is undefined
document.createElement
etdocument.getElementById
caler ceci ... ou simplement envelopper la fonctionnalité dans une fonction. Réponse modifiée pour inclure cette noteVous pouvez créer une fonction qui prend un nombre variable d'arguments:
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%");
Ou, vous transmettez les paires attribut / valeur sur un objet:
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%" });
Vous pouvez également créer votre propre wrapper / méthode d'objet chaînable:
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%");
Exemple de travail: http://jsfiddle.net/jfriend00/qncEz/
la source
Vous pouvez coder une fonction d'assistance ES5.1:
function setAttributes(el, attrs) { Object.keys(attrs).forEach(key => el.setAttribute(key, attrs[key])); }
Appelez ça comme ça:
setAttributes(elem, { src: 'http://example.com/something.jpeg', height: '100%' });
la source
const setAttributes = (el, attrs) => Object.entries(attrs) .forEach(args => el.setAttribute(...args))
la source
Ou créez une fonction qui crée un élément comprenant des attributs à partir de paramètres
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%'
ne fonctionnerait pas en utilisant des attributs. Pour une hauteur / largeur de 100%, vous avez besoin des élémentsstyle.height/style.width
la source
clone
méthode serait préférable. Pas besoin de créer le nœud entier à partir de zéro. Quoi qu'il en soit, la priorité absolue est de minimiser l'accès au DOM, le cas d'utilisation le plus courant.Essaye ça
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: ICI
la source
utilisez cette fonction pour créer et définir des attributs en même temps
function createNode(node, attributes){ const el = document.createElement(node); for(let key in attributes){ el.setAttribute(key, attributes[key]); } return el; }
utilisez-le comme ça
const input = createNode('input', { name: 'test', type: 'text', placeholder: 'Test' }); document.body.appendChild(input);
la source
Je suppose que c'est le meilleur moyen de définir des attributs à la fois pour n'importe quel élément de cette classe.
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);
la source
vous pouvez simplement ajouter une méthode (setAttributes, avec "s" à la fin) au prototype "Element" comme:
Element.prototype.setAttributes = function(obj){ for(var prop in obj) { this.setAttribute(prop, obj[prop]) } }
vous pouvez le définir en une seule ligne:
Element.prototype.setAttributes = function(obj){ for(var prop in obj) this.setAttribute(prop, obj[prop]) }
et vous pouvez l'appeler normalement comme vous appelez les autres méthodes. Les attributs sont donnés sous forme d'objet:
elem.setAttributes({"src": "http://example.com/something.jpeg", "height": "100%", "width": "100%"})
vous pouvez ajouter une instruction if pour lancer une erreur si l'argument donné n'est pas un objet.
la source