Cuối cùng, điều duy nhất thay đổi là cách bạn muốn các hướng dẫn được sử dụng và mở rộng. Đây là một chút khác biệt so với trước đây nhưng một điều quan trọng là appendChild không nên bên trong vòng lặp thuộc tính hướng dẫn cho nút nhưng ngay sau bên ngoài nó; cũng phải chú ý đến một số thuộc tính đặc biệt, có thể là class không phải là người duy nhất, ai biết được :) ... cố gắng thay thế hoàn toàn for block với những điều sau:
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);
}
==================
ĐÃ CẬP NHẬT
Bây giờ sản lượng bây giờ chính xác là một trong những dự kiến. Tôi thậm chí đã sửa một lỗi ngu ngốc khi xử lý lớp class thuộc tính. Hãy thử nó, thậm chí có thể trên các đầu vào khác, tôi đã cố gắng đặt văn bản thay vì null trên một số dữ liệu và nó có vẻ ổn. Hẹn gặp lại!
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;
})();
}