jQuery:not()选择器未选择其正等价项的倒数

jQuery:not()选择器未选择其正等价项的倒数,jquery,jquery-selectors,Jquery,Jquery Selectors,我想知道我是否错过了什么,我想到的工作比我喜欢的更脆弱。i、 我希望不必选择与我所追求的内容不相关的元素,在本例中是一个子div或特定的不相关层次结构 <form> <fieldset> <div> <input type="radio" value="True" name="outer" id="outer-yes"/> <label for="outer-yes">Yes</la

我想知道我是否错过了什么,我想到的工作比我喜欢的更脆弱。i、 我希望不必选择与我所追求的内容不相关的元素,在本例中是一个子div或特定的不相关层次结构

<form>
    <fieldset>
        <div>
            <input type="radio" value="True" name="outer" id="outer-yes"/> <label for="outer-yes">Yes</label>
            <input type="radio" value="False" name="outer" id="outer-no"/> <label for="outer-no">No</label>
        </div>

        <fieldset disabled>
            <div>
                <input type="radio" value="True" name="inner" id="inner-yes"/> <label for="inner-yes">Yes</label>
                <input type="radio" value="False" name="inner" id="inner-no"/> <label for="inner-no">No</label>
            </div>
        </fieldset>
    </fieldset>

    <input type="submit"/>
</form>
<div id="results"></div>


$(function(){
    var tests = [
        { filter: 'input:radio[value=False]', expected: 2 },
        { filter: 'input:radio[value=False]:disabled', expected: 1 }, // because I suspected this would not work as expected, i.e. wouldn't detect the parent fieldset disabled attribute
        { filter: 'fieldset:not([disabled]) input:radio[value=False]', expected: 1 }, // I hoped this would work, but apparently we're looking at the top most fieldset, and not the closest fieldset
        { filter: 'fieldset[disabled] input:radio[value=False]', expected: 1 }, // It kind of surprises me that this passes
        { filter: 'fieldset[disabled]>div>input:radio[value=False]', expected: 1 }, // If I do a strict child selection, I get the results I expect, however, this frailer than I'd like.
        { filter: 'fieldset[disabled] div input:radio[value=False]', expected: 1 }
    ];

    var results = [];
    $.each(tests, function(){
        this.actual = $(this.filter).length;
        results.push(this.filter + ': expected: ' + this.expected + ', actual: ' + this.actual + ', pass: ' + (this.expected === this.actual) + '<br/>');
    });

    $('#results').html(results.join(''));
});

对
不
对
不
$(函数(){
var测试=[
{filter:'input:radio[value=False]',应为:2},
{filter:'input:radio[value=False]:disabled',应为:1},//因为我怀疑这不会按预期工作,即不会检测到父字段集disabled属性
{filter:'fieldset:not([disabled])input:radio[value=False]',应为:1},//我希望这能起作用,但显然我们看到的是最顶端的字段集,而不是最近的字段集
{filter:'fieldset[disabled]input:radio[value=False]',应为:1},//这让我有点惊讶
{filter:'fieldset[disabled]>div>input:radio[value=False]',应为:1},//如果我进行严格的子选择,我会得到预期的结果,但是,这比我想要的更脆弱。
{filter:'fieldset[disabled]div input:radio[value=False]',应为:1}
];
var结果=[];
$.each(测试、函数(){
this.actual=$(this.filter).length;
results.push(this.filter+':应为“+this.expected+”,实际为“+this.actual+”,通过为“+(this.expected==this.actual)+”
); }); $('#results').html(results.join(''); });
这里有一把伴奏小提琴:

试试看

$('fieldset input:radio[value=False]:not(fieldset[disabled] input)')

演示:

问题是?它是
字段集:不是(:禁用)
?你试过了吗?你所有的测试都是按照应该的方式进行的,你只是在错误地解释它们。你到底想选择什么?你选择的起点是什么?试试fieldset输入:radio[value=False]:not(fieldset[disabled]input)@Dave你必须根据它的位置来阅读它。例如,此选择器:
fieldset:not([disabled])input:radio[value=False]
它选择未禁用的字段集,然后在其中查找一个值为
False的单选按钮输入。有两个单选按钮与此匹配,因为第二个字段集(禁用的字段集)位于第一个字段集(未禁用的字段集)的内部,这意味着所有4个输入都位于第一个字段集的内部。