不改变的原有控件追加内容

追加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 + '"';
}

posted on 2009-08-17 08:21  Lionheart Zhang  阅读(573)  评论(2编辑  收藏  举报

导航