简体   繁体   English

如何基于子标签的innerHTML选择父标签?

[英]How to select a parent tag based on innerHTML of a child tag?

I want to select the "ytd-compact-link-renderer" tag and if you notice, deep inside, it has a "yt-formatted-string" tag with id="label" and the innerHTML is "Creator studio". 我想选择"ytd-compact-link-renderer"标签,如果您发现里面很深,它有一个带有"yt-formatted-string" id="label""yt-formatted-string"标签,innerHTML是"Creator studio". This child tag is nested deep inside so it's like a grand child. 该子标签嵌套在内部深处,因此就像一个大孩子。

The "ytd-compact-link-renderer" tag has its class name common with other tags which I don't want to select. "ytd-compact-link-renderer"标签的类名与其他我不想选择的标签相同。 The only way to select it seems to be based on the innerHTML of it's grand child. 选择它的唯一方法似乎是基于其孙子的innerHTML。 Most likely, it is not possible to select it with CSS, so how can I select it with JavaScript or jQuery? 最有可能的是,无法使用CSS选择它,那么如何使用JavaScript或jQuery选择它呢?

在此处输入图片说明

<ytd-compact-link-renderer class="style-scope yt-multi-page-menu-section-renderer" compact-link-style="">

    <a id="endpoint" class="yt-simple-endpoint style-scope ytd-compact-link-renderer" tabindex="-1" href="/dashboard">
      <paper-item class="style-scope ytd-compact-link-renderer" role="option" tabindex="0" aria-disabled="false">


        <div class="content-icon style-scope ytd-compact-link-renderer">
          <yt-img-shadow height="40" width="40" class="style-scope ytd-compact-link-renderer" disable-upgrade="" hidden="">
          </yt-img-shadow>
          <yt-icon class="style-scope ytd-compact-link-renderer"><svg viewBox="0 0 24 24" preserveAspectRatio="xMidYMid meet" focusable="false" class="style-scope yt-icon" style="pointer-events: none; display: block; width: 100%; height: 100%;"><g class="style-scope yt-icon">
        <path d="M19.43 12.98c.04-.32.07-.64.07-.98s-.03-.66-.07-.98l2.11-1.65c.19-.15.24-.42.12-.64l-2-3.46c-.12-.22-.39-.3-.61-.22l-2.49 1c-.52-.4-1.08-.73-1.69-.98l-.38-2.65C14.46 2.18 14.25 2 14 2h-4c-.25 0-.46.18-.49.42l-.38 2.65c-.61.25-1.17.59-1.69.98l-2.49-1c-.23-.09-.49 0-.61.22l-2 3.46c-.13.22-.07.49.12.64l2.11 1.65c-.04.32-.07.65-.07.98s.03.66.07.98l-2.11 1.65c-.19.15-.24.42-.12.64l2 3.46c.12.22.39.3.61.22l2.49-1c.52.4 1.08.73 1.69.98l.38 2.65c.03.24.24.42.49.42h4c.25 0 .46-.18.49-.42l.38-2.65c.61-.25 1.17-.59 1.69-.98l2.49 1c.23.09.49 0 .61-.22l2-3.46c.12-.22.07-.49-.12-.64l-2.11-1.65zM10 15V9l5 3-5 3z" class="style-scope yt-icon"></path>
      </g></svg>


  </yt-icon>
        </div>
        <yt-formatted-string id="label" class="style-scope ytd-compact-link-renderer">Creator Studio</yt-formatted-string>
        <yt-formatted-string id="subtitle" class="style-scope ytd-compact-link-renderer"></yt-formatted-string>
        <yt-icon id="right-icon" class="style-scope ytd-compact-link-renderer" disable-upgrade="" hidden="">
        </yt-icon>
        <yt-formatted-string id="secondary-text" class="style-scope ytd-compact-link-renderer"></yt-formatted-string>

  </paper-item>
    </a>
  </ytd-compact-link-renderer>

You can define your own function, and select depending on the content. 您可以定义自己的功能,然后根据内容进行选择。 This code will match element which "contains" some text, it's not a whole content match, just partial and NOT case sensitive 该代码将匹配“包含”某些文本的元素,它不是整个内容匹配,只是部分且不区分大小写

jQuery.expr[':'].contains = function (a, i, m) {
    return jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase()) >= 0;
};

var text = "Creator Studio"
var my_element = $('ytd-compact-link-renderer').find('yt-formatted-string:contains("'+text+'")');
my_element.doStuff();

Check this fiddle 检查这个小提琴

If you want a whole match, please use this 如果您想全场比赛,请使用此

//name your function as you like
jQuery.expr[':'].containsOnly = function (a, i, m) {
    return jQuery(a).text().toUpperCase() == m[3].toUpperCase();
};

If you are using Jquery, I would suggest $("#label").parent().parent().parent().doStuff() which looks a bit messy. 如果您使用的是Jquery,我建议您使用$("#label").parent().parent().parent().doStuff() ,它看起来有些混乱。 The first parent selects <paper-item> , the second selects <a> and the third selects <ytd-compact-link-renderer> . 第一个选择<paper-item> ,第二个选择<a> ,第三个选择<ytd-compact-link-renderer> This is a bit cleaner $("#label").parent('ytd-compact-link-renderer').doStuff() . 这有点干净$("#label").parent('ytd-compact-link-renderer').doStuff() Refer to this link for more ways. 有关更多方法,请参考此链接

You can try something like 您可以尝试类似

var tag = $("#label:contains('Creator Studio')").closest('ytd-compact-link-renderer')

This will return you the ytd-compact-link-renderer Tag. 这将返回ytd-compact-link-renderer标记。 Now you can do whatever you want to do with tag variable 现在,您可以使用标签变量做任何您想做的事

I want to select the "ytd-compact-link-renderer" tag and if you notice, deep inside, it has a "yt-formatted-string" tag with id="label" and the innerHTML is "Creator studio". 我想选择“ ytd-compact-link-renderer”标签,如果您发现里面很深,它有一个带有“ id =“ label”的“ yt格式字符串”标签,innerHTML是“ Creator studio”。

Looks like you want to select ytd-compact-link-renderer tag which has a child element ( not direct descendant ) yt-formatted-string with id label and the innerHTML is "Creator studio". 看起来您想选择ytd-compact-link-renderer标签,该标签具有一个带有id label yt-formatted-string的子元素( 不是直接后代 ),并且innerHTML"Creator studio".

You can use jquery has and contains 您可以使用jquery hascontains

var element  = $("ytd-compact-link-renderer:has(yt-formatted-string:contains('Creator Studio'))");

Demo 演示版

 var element = $("ytd-compact-link-renderer:has(yt-formatted-string:contains('Creator Studio'))"); console.log( element.length ); //validate if correct node is fetched 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <ytd-compact-link-renderer class="style-scope yt-multi-page-menu-section-renderer" compact-link-style=""> <a id="endpoint" class="yt-simple-endpoint style-scope ytd-compact-link-renderer" tabindex="-1" href="/dashboard"> <paper-item class="style-scope ytd-compact-link-renderer" role="option" tabindex="0" aria-disabled="false"> <div class="content-icon style-scope ytd-compact-link-renderer"> <yt-img-shadow height="40" width="40" class="style-scope ytd-compact-link-renderer" disable-upgrade="" hidden=""> </yt-img-shadow> <yt-icon class="style-scope ytd-compact-link-renderer"><svg viewBox="0 0 24 24" preserveAspectRatio="xMidYMid meet" focusable="false" class="style-scope yt-icon" style="pointer-events: none; display: block; width: 100%; height: 100%;"><g class="style-scope yt-icon"> <path d="M19.43 12.98c.04-.32.07-.64.07-.98s-.03-.66-.07-.98l2.11-1.65c.19-.15.24-.42.12-.64l-2-3.46c-.12-.22-.39-.3-.61-.22l-2.49 1c-.52-.4-1.08-.73-1.69-.98l-.38-2.65C14.46 2.18 14.25 2 14 2h-4c-.25 0-.46.18-.49.42l-.38 2.65c-.61.25-1.17.59-1.69.98l-2.49-1c-.23-.09-.49 0-.61.22l-2 3.46c-.13.22-.07.49.12.64l2.11 1.65c-.04.32-.07.65-.07.98s.03.66.07.98l-2.11 1.65c-.19.15-.24.42-.12.64l2 3.46c.12.22.39.3.61.22l2.49-1c.52.4 1.08.73 1.69.98l.38 2.65c.03.24.24.42.49.42h4c.25 0 .46-.18.49-.42l.38-2.65c.61-.25 1.17-.59 1.69-.98l2.49 1c.23.09.49 0 .61-.22l2-3.46c.12-.22.07-.49-.12-.64l-2.11-1.65zM10 15V9l5 3-5 3z" class="style-scope yt-icon"></path> </g></svg> </yt-icon> </div> <yt-formatted-string id="label" class="style-scope ytd-compact-link-renderer">Creator Studio</yt-formatted-string> <yt-formatted-string id="subtitle" class="style-scope ytd-compact-link-renderer"></yt-formatted-string> <yt-icon id="right-icon" class="style-scope ytd-compact-link-renderer" disable-upgrade="" hidden=""> </yt-icon> <yt-formatted-string id="secondary-text" class="style-scope ytd-compact-link-renderer"></yt-formatted-string> </paper-item> </a> </ytd-compact-link-renderer> 

If you want to select the parent of something, try to use closest() function of jQuery: 如果要选择某项的父项,请尝试使用jQuery closest()函数:

var label = $('yt-formatted-string#label:contains("Creator Studio")');
label.closest('ytd-compact-link-renderer').addClass('selected');

Check this jsFiddle 检查这个jsFiddle

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM