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">

私の問題は、クラス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(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 に答える
0

return truejQueryでは for ループ.eachと同じです。と同等です。これらはいずれも反復の戻り値として使用されず、 に渡されます。ではなく、reduce のようなものを見ているかもしれません。false を返すと、要素がリストから除外されることを意味します。continue;return falsebreak;allSelected.filter.each

このような何かがトリックを行うかもしれません:

$('#' + 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()思うように機能しません。を呼び出す前に変数を作成し、.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)このコードは、すべての要素をループします。それらのいずれかに がない場合、ループが完了すると false になりますselected-group="1"allSelected

より一般的な注意として、data-非標準の HTML 属性に属性を使用することをお勧めします。このようにして、マークアップは有効なままです。

于 2012-08-07T15:56:15.963 に答える