Am Ende ändert sich nur, wie Sie die Anweisungen verwenden und erweitern möchten. Diese unterscheiden sich etwas von den vorherigen, aber eine wichtige Sache ist, dass appendChild
sollte nicht drinnen sein die Anweisungsattributschleife für den Knoten, aber direkt danach außerhalb davon; einige spezielle Attribute müssen ebenfalls beachtet werden, vielleicht class
ist nicht der einzige, der weiß :) ... versuchen Sie, den inneren for block
vollständig zu ersetzen mit folgendem :
var tag = null, a;
if ('tag' in _instr) {
tag = document.createElement(_instr.tag);
if ('attributes' in _instr)
for(a in _instr.attributes) {
a.match(/^class$/) && (a = 'className');
tag.setAttribute(a,_instr.attributes[a]);
}
if ('events' in _instr)
for(a in _instr.events)
tag.addEventListener(a,_instr.events[a], false);
//
// if ('content' in _instr && _instr.content!==null)
// tag.innerHTML = _instr.content;
//
// but take care ... what if is a input[text]
tag[_instr.tag=='input' ? 'value' : 'innerHTML'] = ('content' in _instr && _instr.content !== null) ? _instr.content : o[k];
if ('children' in _instr)
for(a in _instr.children)
_(_instr.children[a], a, tag);
!!_n && !!tag && _n.appendChild(tag);
}
==================
AKTUALISIERT
Jetzt ist die Ausgabe jetzt genau die erwartete. Ich habe sogar einen dummen Fehler im Umgang mit der class
behoben Attribut. Probieren Sie es aus, vielleicht sogar bei anderen Eingaben. Ich habe versucht, Text anstelle von Null auf einige Daten zu setzen, und es sieht gut aus. Bis bald!
function assemble (data, instr) {
var n = document.createDocumentFragment(), i;
function create(d) {
return (function _(_instr, _d, _key, _n) {
var tag = null, i;
if ('tag' in _instr) {
tag = document.createElement(_instr.tag);
tag.innerHTML = 'content' in _instr && !!_instr.content ? _instr.content : typeof _d == 'string' ? _d : '';
if ('attributes' in _instr)
for (i in _instr.attributes)
tag.setAttribute(i, _instr.attributes[i]);
if ('events' in _instr)
for(i in _instr.events)
tag.addEventListener(i,_instr.events[i], false);
//recur finally
if ('children' in _instr) {
for (i in _instr.children){
_(_instr.children[i], _d[i], i, tag);
}
}
!!_n && _n.appendChild(tag);
}
return tag;
})(instr, d, null);
}
return (function (){
for (i in data) {
n.appendChild(create(data[i]));
}
return n;
})();
}