UNPKG

3.26 kBJavaScriptView Raw
1(function (global, factory) {
2 typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
3 typeof define === 'function' && define.amd ? define(factory) :
4 (global.domCreateElementQuerySelector = factory());
5}(this, (function () { 'use strict';
6
7/**
8 * Create a DOM element from a CSS query with option to include content
9 *
10 * @author Laurent Blanes <laurent.blanes@gmail.com>
11 * @param {String} querySelector (optional) default to div
12 * @param {...*} [content] (optional) String|Number|DOMElement
13 * @return DOMElement
14 *
15 * @example
16 * - createElement(); // <div>
17 * - createElement('span#my-id.my-class.second-class'); // <span id="my-id" class="my-class second-class">
18 * - createElement('#my-id.my-class.second-class', 'text to insert', 12345); // <div id="my-id" class="my-class second-class">
19 * - const div = createElement('#my-div',
20 * 'Random text',
21 * createElement('p.paragraph', 'my text'),
22 * createElement('p.paragraph', 'my second text'),
23 * createElement('a.link[href=https://github.com/hekigan/create-element]', 'link to a site'),
24 * ); // <div id="my-id" class="my-class second-class">
25 * // Random text
26 * // <p class="paragraph">my text</p>
27 * // <p class="paragraph">my second text</p>
28 * // <a class="link" href="https://github.com/hekigan/create-element" class="paragraph">link to a site</a>
29 * // </div>
30 */
31function createElement() {
32 var querySelector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'div';
33
34 var nodeType = querySelector.match(/^[a-z]+/i);
35 var id = querySelector.match(/#([a-z]+[a-z0-9-]*)/gi);
36 var classes = querySelector.match(/\.([a-z]+[a-z0-9-]*)/gi);
37 var attributes = querySelector.match(/\[([a-z][a-z-]+)(=['|"]?([^\]]*)['|"]?)?\]/gi);
38 var node = nodeType ? nodeType[0] : 'div';
39
40 if (id && id.length > 1) {
41 throw CreateElementException('only 1 ID is allowed');
42 }
43
44 var elt = document.createElement(node);
45
46 if (id) {
47 elt.id = id[0].replace('#', '');
48 }
49
50 if (classes) {
51 var attrClasses = classes.join(' ').replace(/\./g, '');
52 elt.setAttribute('class', attrClasses);
53 }
54
55 if (attributes) {
56 attributes.forEach(function (item) {
57 item = item.slice(0, -1).slice(1);
58
59 var _item$split = item.split('='),
60 label = _item$split[0],
61 value = _item$split[1];
62
63 if (value) {
64 value = value.replace(/^['"](.*)['"]$/, '$1');
65 }
66 elt.setAttribute(label, value || '');
67 });
68 }
69
70 for (var _len = arguments.length, content = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
71 content[_key - 1] = arguments[_key];
72 }
73
74 content.forEach(function (item) {
75 if (typeof item === 'string' || typeof item === 'number') {
76 elt.appendChild(document.createTextNode(item));
77 } else if (item.nodeType === document.ELEMENT_NODE) {
78 elt.appendChild(item);
79 }
80 });
81
82 return elt;
83}
84
85function CreateElementException(message) {
86 this.message = message;
87 this.name = 'CreateElementException';
88}
89module.exports = exports['default'];
90
91return createElement;
92
93})));