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;
})();
}