[英]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();
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
has
和contains
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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.