2013-10-25 48 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