我想遍历一个元素,从列表中删除所有已禁用的元素,以便仅向用户显示与其相关的项目。所有这些都发生在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);
循环不会遍历整个列表,而是在第21或第25个选项附近随机中断。这就是为什么我在代码中有一个强制循环
Drupal中的残疾元素根本没有被删除
就像一个注释,在它自己的独立格式上,相同的代码可以正常删除整个列表中的元素,没有循环:
<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>
我做错了什么?
答案 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();