luci-base: add element creation helper to cbi.js
Add a new helper function `E()` to cbi.js which can be used to conveniently build HTML markup. Signed-off-by: Jo-Philipp Wich <jo@mein.io>
This commit is contained in:
parent
97a640c836
commit
79c82237e3
1 changed files with 72 additions and 0 deletions
|
@ -1566,3 +1566,75 @@ String.nobr = function()
|
||||||
a.push(arguments[i]);
|
a.push(arguments[i]);
|
||||||
return ''.nobr.apply(arguments[0], a);
|
return ''.nobr.apply(arguments[0], a);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
var dummyElem, domParser;
|
||||||
|
|
||||||
|
function isElem(e)
|
||||||
|
{
|
||||||
|
return (typeof(e) === 'object' && e !== null && 'nodeType' in e);
|
||||||
|
}
|
||||||
|
|
||||||
|
function toElem(s)
|
||||||
|
{
|
||||||
|
var elem;
|
||||||
|
|
||||||
|
try {
|
||||||
|
domParser = domParser || new DOMParser();
|
||||||
|
elem = domParser.parseFromString(s, 'text/html').body.firstChild;
|
||||||
|
}
|
||||||
|
catch(e) {}
|
||||||
|
|
||||||
|
if (!elem) {
|
||||||
|
try {
|
||||||
|
dummyElem = dummyElem || document.createElement('div');
|
||||||
|
dummyElem.innerHTML = s;
|
||||||
|
elem = dummyElem.firstChild;
|
||||||
|
}
|
||||||
|
catch (e) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
return elem || null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function E()
|
||||||
|
{
|
||||||
|
var html = arguments[0],
|
||||||
|
attr = (arguments[1] instanceof Object && !Array.isArray(arguments[1])) ? arguments[1] : null,
|
||||||
|
data = attr ? arguments[2] : arguments[1],
|
||||||
|
elem;
|
||||||
|
|
||||||
|
if (isElem(html))
|
||||||
|
elem = html;
|
||||||
|
else if (html.charCodeAt(0) === 60)
|
||||||
|
elem = toElem(html);
|
||||||
|
else
|
||||||
|
elem = document.createElement(html);
|
||||||
|
|
||||||
|
if (!elem)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
if (attr)
|
||||||
|
for (var key in attr)
|
||||||
|
if (attr.hasOwnProperty(key))
|
||||||
|
elem.setAttribute(key, attr[key]);
|
||||||
|
|
||||||
|
if (typeof(data) === 'function')
|
||||||
|
data = data(elem);
|
||||||
|
|
||||||
|
if (isElem(data)) {
|
||||||
|
elem.appendChild(data);
|
||||||
|
}
|
||||||
|
else if (Array.isArray(data)) {
|
||||||
|
for (var i = 0; i < data.length; i++)
|
||||||
|
if (isElem(data[i]))
|
||||||
|
elem.appendChild(data[i]);
|
||||||
|
else
|
||||||
|
elem.appendChild(document.createTextNode('' + data[i]));
|
||||||
|
}
|
||||||
|
else if (data !== null && data !== undefined) {
|
||||||
|
elem.innerHTML = '' + data;
|
||||||
|
}
|
||||||
|
|
||||||
|
return elem;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue