追加HTML内容,我在做多文件上传的时候,用到了动态添加上传控件,但是发现一个问题,就是添加新的控件的时候,之前添加的控件的值会变空,我分析了一下原因,是因为我追加控件的时候是用的innerHTML+="内容"的,这样等于把div的控件直接重写了,所以控件会变空。
我找了下资料,知道了insertAdjacentHTML这个方法,用这个方法追加内容,不会改变原有控件的值,但是这个方法FF不使用。于是我继续找,在 http://www.cnitblog.com/yemoo/archive/2007/10/11/34711.html看到了兼容IE和FF的方法,经过试验,确实可以,但是方法太复杂了。这时,从朋友那里得到了一段JS:
function addFile() {
var div1 = document.getElementById('divFiles');
input1 = document.createElement("INPUT");
input1.setAttribute("type", "file");
input1.setAttribute("name", "File");
div1.appendChild(input1);
div1.appendChild(document.createElement("br"));
}
这是用DOM实现的,IE/FF都支持,要比之前的从EXTJS中提取的要精简的多。
PS:前一个方法也写出来
function insertHtml(where, el, html) {
where = where.toLowerCase();
if (el.insertAdjacentHTML) {
switch (where) {
case "beforebegin":
el.insertAdjacentHTML('BeforeBegin', html);
return el.previousSibling;
case "afterbegin":
el.insertAdjacentHTML('AfterBegin', html);
return el.firstChild;
case "beforeend":
el.insertAdjacentHTML('BeforeEnd', html);
return el.lastChild;
case "afterend":
el.insertAdjacentHTML('AfterEnd', html);
return el.nextSibling;
}
throw 'Illegal insertion point -> "' + where + '"';
}
var range = el.ownerDocument.createRange();
var frag;
switch (where) {
case "beforebegin":
range.setStartBefore(el);
frag = range.createContextualFragment(html);
el.parentNode.insertBefore(frag, el);
return el.previousSibling;
case "afterbegin":
if (el.firstChild) {
range.setStartBefore(el.firstChild);
frag = range.createContextualFragment(html);
el.insertBefore(frag, el.firstChild);
return el.firstChild;
} else {
el.innerHTML = html;
return el.firstChild;
}
case "beforeend":
if (el.lastChild) {
range.setStartAfter(el.lastChild);
frag = range.createContextualFragment(html);
el.appendChild(frag);
return el.lastChild;
} else {
el.innerHTML = html;
return el.lastChild;
}
case "afterend":
range.setStartAfter(el);
frag = range.createContextualFragment(html);
el.parentNode.insertBefore(frag, el.nextSibling);
return el.nextSibling;
}
throw 'Illegal insertion point -> "' + where + '"';
}