0

这就是我的 html 的外观,

<tr id="group-1-11">
<tr class="child-of-group-1-11 " selected-group="1" >
<tr id="group-1-12" class="child-of-group-1-11" parent-id="group-1-11"  selected-group="1">
<tr class="child-of-group-1-12" parent-id="group-1-12"  selected-group="1">
<tr class="child-of-group-1-12" parent-id="group-1-12"  selected-group="1">
<tr class="child-of-group-1-11" selected-group="1" >
<tr id="group-1-85" class="child-of-group-1-11" parent-id="group-1-11" >
<tr class="child-of-group-1-85" selected-group="1" style="display: none;">
<tr id="group-1-355" class="child-of-group-1-85" parent-id="group-1-85" selected-group="1">
<tr id="group-1-2" class="child-of-group-1-11  parent " parent-id="group-1-11">

现在我的问题是我需要检查具有 class child-of-id 的元素是否具有属性 selected-group="1" 并且如果所有 child-of-id 都具有该属性然后添加新属性(检查, true) 到具有该特定 id 的元素。

// I have an array of ids
// var uniqueParentArray = ['group-1-11', 'group-1-12', 'group-1-85',...];
$.each(uniqueParentArray, function(index, parentId) {
            var allSelected = $('.child-of-'+parentId).each(function(){
                var selectedGroup = $(this).attr('selected-group');
                if(selectedGroup != '1')
                    return false;
                return true;
            });
            if(allSelected) {
                $('#'+parentId).attr("checked", true);
            }
      });

这意味着到最后我的结果应该是这样的:

 <tr id="group-1-12" class="child-of-group-1-11" parent-id="group-1-11"  selected-group="1" checked="true">
 <tr id="group-1-85" class="child-of-group-1-11" parent-id="group-1-11" checked="true">

但元素id = "group-1-11" 不应该有那个属性checked = "true"

我希望上下文很清楚。我可能在脚本中有一个错误,因此结果输出不符合预期。请帮我修复错误,我希望allSelected是布尔值,但我可能不太熟悉该方法。

4

3 回答 3

0

.each()无法按您希望的方式运行。您需要在调用 之前创建一个变量.each(),然后在遇到您要查找的条件时修改该变量。

$.each(uniqueParentArray, function(index, parentId) {
    var allSelected = true;
    $('.child-of-'+parentId).each(function(){
        var selectedGroup = $(this).attr('selected-group');
        if(selectedGroup != '1') {
            allSelected = false;
        }
    });
    if(allSelected) {
        $('#'+parentId).attr("checked", true);
    }
});

此代码将遍历所有.child-of-(parentID)元素。如果其中任何一个都没有selected-group="1",则allSelected循环完成时将为 false。

在更一般的说明中,我建议data-对非标准 HTML 属性使用属性。这样您的标记仍然有效。

于 2012-08-07T15:56:15.963 回答
0

return true在 jQuery.each中与 for 循环中的相同continue;return false相当于break;。这些都不会用作迭代的返回值,并传递给allSelected. 您可能正在查看类似.filter而不是的东西.each,它是一种减少,其中返回 false 意味着该元素被排除在列表之外。

这样的事情可能会奏效:

$('#' + uniqueParentArray.join(', #')).attr('checked', function() {
   return $('.child-of-' + $(this).attr('id')).filter(function() {
      return $(this).attr('selected-group') != '1';
   }).length == 0;
});
于 2012-08-07T15:58:44.537 回答
0

您可以尝试以下方法:

$.each(uniqueParentArray, function(index, parentId) {
    // retrieve not selected elements for the given parent
    var notSelectedElements = $('.child-of-'+parentId+'[selected-group!="1"]');
    // if all elements are selected
    if(notSelectedElements.length === 0) {
         $('#'+parentId).attr("checked", true);
    }
});
于 2012-08-07T16:23:06.970 回答