如何在Drupal 7中的下拉HTML选择列表中删除禁用的选项

时间:2014-10-22 13:22:28

标签: javascript jquery drupal drupal-7

我想遍历一个元素,从列表中删除所有已禁用的元素,以便仅向用户显示与其相关的项目。所有这些都发生在Drupal 7中,选择列表从分类法术语列表中填充。我注意到两个问题,但首先这是我在自定义主题中的javascript文件:

(function($) 
{
    Drupal.behaviors.mytheme = 
    {
        attach: function(context, settings) 
        {
            var x = document.getElementById("edit-field-diplomatic-mission-und");

            for (var j = 0; j < 10; j++) //Force loop
            {
                for (var i = 0; i < x.length; i++)
                {
                    if (x.options[i].disabled == true)
                    {
                        x.remove(i);
                    }
                }
            }
        }
    };
})(jQuery);
  1. 循环不会遍历整个列表,而是在第21或第25个选项附近随机中断。这就是为什么我在代码中有一个强制循环

  2. Drupal中的残疾元素根本没有被删除

  3. 就像一个注释,在它自己的独立格式上,相同的代码可以正常删除整个列表中的元素,没有循环:

        <script>
            $(document).ready(function ()
            {
                var x = document.getElementById("edit-field-diplomatic-mission-und");
    
                for (var j = 0; j < 10; j++)
                {
                    for (var i = 0; i < x.length; i++)
                    {
                        if (x.options[i].disabled == true)
                        {
                            x.remove(i);
                        }
                    }
                }
            });
        </script>
    

    我做错了什么?

1 个答案:

答案 0 :(得分:0)

问题是您要删除影响options收集长度的选项(即实时NodeList)。你可以向后循环。这是删除所有禁用选项的正确代码:

var x = document.getElementById("edit-field-diplomatic-mission-und");

for (var i = x.options.length - 1; i >= 0; i--) {
    if (x.options[i].disabled) {
        x.remove(i);
    }
}

var i = x.options.length;
while (i--) {
    if (x.options[i].disabled) {
        x.remove(i);
    }
}

一般来说x.length没有任何意义,因为x是单个DOMElement,它不是一个集合。

最后,因为你使用的是jQuery,所以你应该选择它:

$('#edit-field-diplomatic-mission-und option:disabled').remove();
相关问题