javascript - 如何删除生成的数组中显示在下拉列表中的空白行

标签 javascript html loops filter null

我有一个使用 javascript 和 html 生成的下拉列表。我有一些代码将在下面发布,这些代码循环遍历此列表,并且可能会删除找到的任何空白行,但不起作用。 “$maxfield1rows”的值为 7,我的意思是,如果该值为空白 (==''),则将其删除。我使用了removeChild,但这似乎不起作用,我也尝试过拼接,我认为过滤器可以工作,但不确定。我尝试了disabled=true,但这只会使它们禁用且不可选择。有人可以帮忙吗?

for(index=1; index<$maxfield1rows; index++) {
  if(document.pickDivision.field1.options[index].value=='') {    
document.pickDivision.field1.removeChild(document.pickDivision.field1.options[index]);
  }
}

在下面更新,我使用 $maxfield1rows 因为这是循环经过的最大行数,也通过更改我的意思是当用户在中选择不同的选项时会触发 onchange 事件下拉菜单,因此根据所选选项,field1 的输出会发生变化,有时显示 5 个值,有时仅显示 1 个:

for(index=$maxfield1rows-1; index>=0; index--) {
    alert(document.pickDivision.field1.options[index]);
    if(document.pickDivision.field1.options[index].value==''){
        document.pickDivision.field1.removeChild(document.pickDivision.field1.options[index]);             
        document.pickDivision.field1.options[index].disabled=true;
    }
    else{
        document.pickDivision.field1.options[index].disabled=false;
    }
}

最佳答案

为了扩展我的评论,我认为问题在于您正在向前循环选项数组。令我惊讶的是,当您尝试执行此操作时,没有抛出任何错误。您应该向后循环整个集合以避免跳过某个项目。

JS Fiddle demonstrating the error 。在示例中,第 1 项和第 2 项为空白,第 3 项不是空白。

每次添加/删除项目时,这些内置集合都会更改。使用 fiddle 中的示例,我的数组从 [1,2,3] 更改为 [2,3]error no item at index 2.

向后循环,我的集合进行了以下更改:[1,2,3][1,3][3] .

下面是带有注释的代码,解释了 for 循环的每个部分的用途以及原因。如果您愿意,也可以使用 while 循环。

//options.length - 1 because arrays are 0 based
//i >= 0 because you don't want to use a negative index on an array
//i-- to loop backwards
for(var i = document.pickDivision.field1.options.length - 1; i >= 0; i--) {
    //Is this an empty item
    if(document.pickDivision.field1.options[i].value == '') {
        //Remove the empty item
        document.pickDivision.field1.removeChild(document.pickDivision.field1.options[i]);
    }
}

更新

使用您发布的新更新的代码,您正在尝试访问已删除的选项元素。从该行的外观来看,您不再需要它,因为您已经删除了该元素。如果您仍然想在删除元素之前禁用该元素,请将该行移到另一行上方(请参阅代码中的注释)。

for(index=$maxfield1rows-1; index>=0; index--) {
    alert(document.pickDivision.field1.options[index]);
    if(document.pickDivision.field1.options[index].value==''){
        document.pickDivision.field1.removeChild(document.pickDivision.field1.options[index]);             
        //This line is causing the issue; move it above the previous line or remove it
        document.pickDivision.field1.options[index].disabled=true;
    }
    else{
        document.pickDivision.field1.options[index].disabled=false;
    }
}

更新2

根据评论中的问题,当您将选项数量更改为 6 时,您的代码会损坏。这是因为您正在使用硬编码的 PHP 值 $maxfield1rows。由于您已经知道表单的名称和表单中字段的名称,因此我建议您在 for 循环中使用选项集合的长度而不是此变量。这将确保无论有多少个选项元素(1、10、1000),您都将始终循环整个集合。

for(var i = document.pickDivision.field1.options.length - 1; i >= 0; i--) {

关于javascript - 如何删除生成的数组中显示在下拉列表中的空白行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20665547/

相关文章:

javascript - 模态外部 URL 重定向不当

java - 如何使用 foreach 循环以最简单的方式打印二维数组?

c - 使用 isalpha() 导致文本转储

javascript - 如何使动态和静态内容居中?

html - 页面左侧的导航栏,如何让内容调整大小以匹配屏幕大小?

html - 缩略图类超出了它的内容

vba - 如何在vba上在一种条件下自动删除完整行?

javascript - visual-studio-code 中的自动右括号不适用于 js 和 jsx 文件

javascript - d3.js:异常错误

javascript - Angular 2+ 计时器功能在其中一个组件中不起作用