2013-10-25 5 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');` 

EDIT

Свое указал мне, что следующий вложенность 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 с может измениться, попробовать .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

Ваш ответ сработал на моем тестовом примере, однако я решил, что наследование вложенных подкатегорий на самом деле вероятно. Я бы ответил на ваш ответ так же правильно, как и решил мой ОП, но если у вас возникнут какие-то мысли, то эти разные условия я буду им благодарен. – orionrush

+0

.prevAll() и .nextAll() могут перемещаться вверх и вниз, а затем вам нужно использовать что-то вроде .children(), чтобы развернуть эти выбранные уровни. Вы можете узнать о «Tree Traversal» с помощью jQuery здесь: 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()', чтобы изменить запрос в bollian - это будет весьма полезно - еще раз спасибо. – orionrush