dom-create-element-query-selector
Version:
A utility function to create DOM elements with CSS selector-like syntax
83 lines (71 loc) • 2.96 kB
JavaScript
/**
* Create a DOM element from a CSS query with option to include content
*
* @author Laurent Blanes <laurent.blanes@gmail.com>
* @param {String} querySelector (optional) default to div
* @param {...*} [content] (optional) String|Number|DOMElement
* @return DOMElement
*
* @example
* - createElement(); // <div>
* - createElement('span#my-id.my-class.second-class'); // <span id="my-id" class="my-class second-class">
* - createElement('#my-id.my-class.second-class', 'text to insert', 12345); // <div id="my-id" class="my-class second-class">
* - const div = createElement('#my-div',
* 'Random text',
* createElement('p.paragraph', 'my text'),
* createElement('p.paragraph', 'my second text'),
* createElement('a.link[href=https://github.com/hekigan/create-element]', 'link to a site'),
* ); // <div id="my-id" class="my-class second-class">
* // Random text
* // <p class="paragraph">my text</p>
* // <p class="paragraph">my second text</p>
* // <a class="link" href="https://github.com/hekigan/create-element" class="paragraph">link to a site</a>
* // </div>
*/
export default function createElement() {
var querySelector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'div';
var nodeType = querySelector.match(/^[a-z]+/i);
var id = querySelector.match(/#([a-z]+[a-z0-9-]*)/gi);
var classes = querySelector.match(/\.([a-z]+[a-z0-9-]*)/gi);
var attributes = querySelector.match(/\[([a-z][a-z-]+)(=['|"]?([^\]]*)['|"]?)?\]/gi);
var node = nodeType ? nodeType[0] : 'div';
if (id && id.length > 1) {
throw CreateElementException('only 1 ID is allowed');
}
var elt = document.createElement(node);
if (id) {
elt.id = id[0].replace('#', '');
}
if (classes) {
var attrClasses = classes.join(' ').replace(/\./g, '');
elt.setAttribute('class', attrClasses);
}
if (attributes) {
attributes.forEach(function (item) {
item = item.slice(0, -1).slice(1);
var _item$split = item.split('='),
label = _item$split[0],
value = _item$split[1];
if (value) {
value = value.replace(/^['"](.*)['"]$/, '$1');
}
elt.setAttribute(label, value || '');
});
}
for (var _len = arguments.length, content = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
content[_key - 1] = arguments[_key];
}
content.forEach(function (item) {
if (typeof item === 'string' || typeof item === 'number') {
elt.appendChild(document.createTextNode(item));
} else if (item.nodeType === document.ELEMENT_NODE) {
elt.appendChild(item);
}
});
return elt;
}
function CreateElementException(message) {
this.message = message;
this.name = 'CreateElementException';
}
module.exports = exports['default'];