【问题标题】:jQuery selector with multiple elements including an AND operator具有多个元素的 jQuery 选择器,包括 AND 运算符
【发布时间】:2017-11-08 17:13:06
【问题描述】:

如何为这个 jQuery 选择器添加不同元素的 AND 运算符?

$("h1:contains('Elements') && p:contains('Black')").nextAll().find(".button[name='commit']").each(function(i, that){
            $('[name=size] option').filter(function() { 
                return ($(this).text() == 'Small');
            }).prop('selected', true);
            setTimeout(function(){
                $(that).click();
            }, 200*i);

        });

此功能由按钮触发。我希望这个函数检查 div 中的 h1 是否包含文本元素,以及 h1 旁边的 p 是否包含黑色。我知道如何做一个只有一个逗号的 OR 运算符,但我正在尝试实现一个 AND 运算符。

我也可以把它改成 if 语句,但我不知道怎么做。

"如果第一个选择器和第二个选择器返回true,找到按钮[name='commit'],执行过滤功能然后点击。"

    <div class="item1">
    <h1>Abstract</h1>
    <p>White</p>
    <div id="form">
        <form>
            <input>
            <fieldset>
                <select name="size">

                </select>
            </fieldset>
            <fieldset>
                <input class="button" name="commit">
            </fieldset>
        </form>
    </div>
</div>

<div class="item2">
    <h1>Elements</h1>
    <p>Black</p>
    <div id="form">
        <form>
            <input>
            <fieldset>
                <select name="size">

                </select>
            </fieldset>
            <fieldset>
                <input class="button" name="commit">
            </fieldset>
        </form>
    </div>
</div>

【问题讨论】:

    标签: javascript jquery html jquery-selectors


    【解决方案1】:

    来自您的评论(可能会被清理):

    我希望此函数检查div 中的h1 是否包含文本元素,以及h1 旁边的p 是否包含黑色。

    将它与您的第一个 JavaScript 块结合起来,您正在寻找的是:

    $("h1:contains('Elements') + p:contains('Black')").nextAll("div").find(".button[name='commit']")...
    

    细分:

    • $("h1:contains('Elements') + p:contains('Black')") 使用 adjacent sibling combinator (+) 仅匹配包含 Elements 的 h1,前提是它紧随其后的是包含 Black 的 p。
    • .nextAll("div") 查找所有以下同级 div 元素
    • .find(".button[name='commit']") 查找这些 div 中具有 button 和 name commit 类的任何元素。

    实时示例(半秒后将相关按钮变为蓝色;我为它们添加了type="button" 和value="commit" 用于sn-p):

    setTimeout(function() {
      $("h1:contains('Elements') + p:contains('Black')").nextAll("div").find(".button[name='commit']").css({
        color: "blue",
        fontWeight: "bold"
      });
    }, 500);
    <div class="item1">
      <h1>Abstract</h1>
      <p>White</p>
      <div id="form">
        <form>
          <input>
          <fieldset>
            <select name="size">
    
                    </select>
          </fieldset>
          <fieldset>
            <input class="button" type="button" name="commit" value="commit">
          </fieldset>
        </form>
      </div>
    </div>
    
    <div class="item2">
      <h1>Elements</h1>
      <p>Black</p>
      <div id="form">
        <form>
          <input>
          <fieldset>
            <select name="size">
    
                    </select>
          </fieldset>
          <fieldset>
            <input class="button" type="button" name="commit" value="commit">
          </fieldset>
        </form>
      </div>
    </div>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

    旁注:您引用的 HTML 有两个元素,其中包含 id="form"。 id 值必须在文档中是唯一的。

    【讨论】:

    • 是的,抱歉,我忘记在结构中添加 class="button"。
    • @xSketchy0:现在我知道了整个结构,我已经能够显着简化答案。 :-)
    • 好的,谢谢!这就是我一直在寻找的。不知道您需要整个结构才能解决问题。相邻的兄弟组合器会与 AND 运算符相比吗?它在某种程度上与 AND 运算符的工作方式相同吗?
    • 另外,如果 p 后面没有紧跟 p,你会如何措辞选择器?
    • @xSketchy0:所有复合 CSS 选择器都是 AND。例如,h1:contains(...) 是 AND:任何匹配的元素都必须是 h1 并且包含 ...; p.bar 是 AND:元素必须是 p 并且 具有类 bar。等等。组合器是相同的。关于另一个:如果您点击上面的链接并稍微向下滚动,您会发现还有一个“通用兄弟组合器”(通常称为“跟随兄弟组合器”),~:A ~ B 匹配 A if它后面有一个B 兄弟姐妹(不一定相邻)。
    猜你喜欢
    • 2011-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    • 2013-07-17
    • 2012-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多