从datalist中删除项目

时间:2013-08-01 18:50:14

标签: javascript html html-datalist

我有一个工作的Ajax调用和函数来填充数据主义者。数据列表用于从有限列表中选择页面上的UL元素的添加。一旦我从datalist添加一个到实际列表,我想从datalist中删除该选项。我正在使用的强力方法是清除数据主义者并重新填充它。

function populate_datalist_from_array(list_id, list_str)
{
    clearChildren( list_id );
    var arr = eval ( list_str );
    for (var i = 0; i < arr.length; i++) {
        var opt = document.createElement('option');
        opt.innerHTML = arr[i];
        opt.value = arr[i];
        document.getElementById(list_id).appendChild(opt);
    }
}

function clearChildren( parent_id ) {
    var childArray = document.getElementById( parent_id ).children;
    if ( childArray.length > 0 ) {
        document.getElementById( parent_id ).removeChild( childArray[ 0 ] );
        clearChildren( parent_id );
    }
}

我已验证list_str对象是否正确。即,它仅包含当前列表中尚未存在的选项。但在使用该新列表调用populate_datalist_from_array后,下拉列表中的数据列表不会更改。这是因为浏览器基本上编译了那里的所有值(就像它是普通的,基于浏览器的自动完成)并且不会“忘记”我想删除的值吗?

2 个答案:

答案 0 :(得分:0)

如果list_str确实没问题,那么您的代码就可以了。您可以在jsFiddle处查看该广告。

您所描述的行为的最常见原因是您的代码会刷新页面。如果您从链接小提琴中的“更改选项”按钮中删除type="button",则会出现错误(由于小提琴本身)。在您的页面中,您可能会有类似的调用populate_datalist_from_array()。请注意,在活动文本输入上也按 Enter 进行提交/刷新。

答案 1 :(得分:0)

Teemu的JsFiddle运作良好。但是,通常最好避免递归,并在不需要时进行多个DOM查询。

这是一个只需要单个DOM查询的编辑,并且是迭代的。 (注意索引前的减量,因为这是一个基于零的列表)

    clearChildren = function (parent_id) {
        var parent = document.getElementById(parent_id);
        var childArray = parent.children;
        var cL = childArray.length;
        while(cL > 0) {
            cL--;
            parent.removeChild(childArray[cL]);
        }
    };

(在MacBookPro的JSFiddle中,我节省了10毫秒 - 总共15毫秒 - 在500个元素的列表中,但在移动设备上使用更大的DOM可能会更加引人注目)。