2013-10-25 36 views
0

我想檢測選擇選項是否在'國際'optgroup下。現在我的方法是檢測選定項目中最接近的optgroup,並獲取其標籤屬性的內容。我可以測試這個字符串'國際'這個詞。其他方法更受歡迎。jQuery get parent optgroup

正如你所知道的,從這個標記了不幸的是,OPTGROUP不換子選項:

<select id="venue"> 
    <optgroup label="New England"></optgroup> 
     <option value="1">&nbsp;NH</option> 
     <option value="2">&nbsp;ME</option> 
     <option value="3">&nbsp;VT</option> 
     <option value="4">&nbsp;MA</option> 
     <option value="4">&nbsp;CT</option> 
     <option value="4">&nbsp;RI</option> 
    <optgroup label="International"></optgroup> 
     <option value="100">Canada</option> 
     <option value="100">Texas</option> 
     <option value="100">Mexico</option> 
</select> 

jQuery的我一直在與明顯不會工作,但你可以看到我我試圖去:

dropdownval = jQuery('select#venue option:selected') 
    .parentsUntil(jQuery('optgroup'), '[label*="international"]') 
     .attr('label');` 

編輯

它已經向我指出的是optgroups以下嵌套也可以

<select id="venue"> 
    <optgroup label="New England"></optgroup> 
     <option value="1">&nbsp;NH</option> 
     <option value="2">&nbsp;ME</option> 
     <option value="3">&nbsp;VT</option> 
     <option value="4">&nbsp;MA</option> 
     <option value="4">&nbsp;CT</option> 
     <option value="4">&nbsp;RI</option> 
    <optgroup label="International"></optgroup> 
     <option value="100">&nbsp;Canada</option> 
     <option value="100">&nbsp;Texas</option> 
     <option value="100">&nbsp;Mexico</option> 
    <optgroup label="&nbsp;Europe"></optgroup> 
     <option value="100">&nbsp;&nbsp;Bruges</option> 
</select> 
+0

'.prevUntil'是你需要的,而不是'.parentsUntil什麼',因爲optgroup不是父母。 – Barmar

+0

不錯,但'dropdownval'仍然返回爲'undefined' – orionrush

+0

我沒有意識到'prevUntil'在匹配的元素之前停止_before_,不包括它。看到我的答案。 – Barmar

回答

1

如果你的列表可靠有序的(如提交),那麼你可以跳過捕捉的關係,即first()等,並按照.prevAll('optgroup')一路上揚。但是,如果你option S的順序可能會改變,嘗試.nextAll('optgroup'),或關注@ Barmar的邏輯所需要的方向遍歷:

$("#venue").change(function() { 
    $("#venue option:selected").each(function() { 
     if ($(this).prevAll('optgroup').attr('label') == 'International') { 
      alert('detected'); 
     } 
    }); 
}); 

http://jsbin.com/ibIJezO/1/

+0

是的,jsfiddle已經關閉了,我去了jsbin – Barmar

+0

你的回答對我的測試用例有效,但是我發現進一步嵌套到subcatagories實際上很可能。我會採取你的答案是正確的,因爲它解決了我的OP,但如果你有任何想法這些不同的條件,我會很感激他們。 – orionrush

+0

.prevAll()和.nextAll()可以向上和向下移動,然後您需要使用類似.children()的內容來深入到所選的級別。你可以在這裏用jQuery學習'Tree Traversal':http://api.jquery.com/category/traversing/tree-traversal/ - 這些概念與上面的答案一起應用應該指向你正確的方向。 –

1
if ($('#venue option:selected').prevAll('optgroup').first().is('[label*="International"]')) 
    ... 
} 

.prevAll('optgroup')得到上述所有optgroup秒。 .first將它限制爲第一個,這是最接近的前一個optgroup。然後.is()告訴你它的標籤是否符合你的標準。

JSBIN

+0

感謝您的幫助,我沒有意識到'.is()'將查詢修改爲鈴聲 - 這將非常有用 - 再次感謝。 – orionrush