2012-08-07 94 views
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"> 

什麼現在是我的問題是,我需要檢查是否帶班兒童的-ID的元素有屬性selected-group =「1」,如果所有的孩子的id有屬性,然後添加新的屬性(選中,真)元素與該特定的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是布爾值,但我可能不太熟悉這個方法。

回答

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將爲假。

在更一般的說明中,我建議使用data-屬性來表示非標準HTML屬性。這樣你的標記仍然有效。

+0

嗯!爲什麼我沒有想到它,謝謝@jackwanders。但這確實需要不必要的循環,再次感謝你,但我想我還會等待其他解決方案。 – 2012-08-07 16:01:27

0

return true in 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; 
}); 
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); 
    } 
}); 
相關問題