css选择器包含内容,是否有包含特定文本的元素的CSS选择器?

回答(15)

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

您可以匹配元素,元素中属性的名称以及元素中命名属性的值 . 但是,我没有看到任何元素内的匹配内容 .

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

使用jQuery:

$('td:contains("male")')

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

看起来他们正在考虑CSS3规范 but it didn't make the cut .

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

您必须向名为 data-gender 的行添加数据属性,并使用 male 或 female 值并使用属性选择器:

HTML:

...

CSS:

td[data-gender="male"] { ... }

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

实际上有一个非常概念性的基础,为什么没有实现这一点 . 它基本上是3个方面的组合:

元素的文本内容实际上是该元素的子元素

您无法直接定位文本内容

CSS不允许使用选择器提升

这三个一起意味着,当您拥有文本内容时,您无法提升回包含元素,并且您无法设置当前文本的样式 . 这可能很重要,因为降序只允许单一跟踪上下文和SAX样式解析 . 涉及其他轴的升序或其他选择器引入了对更复杂的遍历或类似解决方案的需求,这将使CSS的应用极大地复杂化 .

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

您可以将内容设置为数据属性,然后使用attribute selectors,如下所示:

/* Select every cell containing word "male" */

td[data-content="male"] {

color: red;

}

/* Select every cell starting on "p" case insensitive */

td[data-content^="p" i] {

color: blue;

}

/* Select every cell containing "4" */

td[data-content*="4"] {

color: green;

}

Petermale34
Susannefemale14

您还可以使用jQuery轻松设置数据内容属性:

$(function(){

$("td").each(function(){

var $this = $(this);

$this.attr("data-content", $this.text());

});

});

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

我担心这是不可能的,因为内容不是属性,也不能通过伪类访问 . 可以在the CSS3 specification中找到CSS3选择器的完整列表 .

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

对于那些希望进行Selenium CSS文本选择的人来说,这个脚本可能有些用处 .

诀窍是选择您要查找的元素的父级,然后搜索具有该文本的子级:

public static IWebElement FindByText(this IWebDriver driver, string text)

{

var list = driver.FindElement(By.CssSelector("#RiskAddressList"));

var element = ((IJavaScriptExecutor)driver).ExecuteScript(string.Format(" var x = $(arguments[0]).find(\":contains('{0}')\"); return x;", text), list);

return ((System.Collections.ObjectModel.ReadOnlyCollection)element)[0];

}

如果有多个元素,这将返回第一个元素,因为在我的情况下,它总是一个元素 .

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

由于CSS缺少此功能,您必须使用javascript按内容设置单元格样式 . 例如,包含xpath

var elms = document.evaluate( "//td[contains(., 'male')]" ,node, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null )

然后像这样使用结果:

for ( var i=0 ; i < elms.snapshotLength; i++ ){

elms.snapshotItem(i).style.background = "pink";

}

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

@ voyager关于使用 data-* 属性的答案(例如 data-gender="female|male" 是截至2017年最有效且符合标准的方法:

[data-gender='male'] {background-color: #000; color: #ccc;}

几乎可以实现大多数目标,因为有一些虽然有限的选择器围绕文本 . ::first-letter是pseudo-element,可以将有限样式应用于元素的第一个字母 . 除了明显选择元素的第一行(例如段落)之外,还有一个::first-line伪元素,这也意味着很明显CSS可用于扩展此现有功能以设置textNode的特定方面的样式 .

直到这样的倡导成功并实现了我可以建议的下一个最好的事情是使用空格分隔符来输出 explode / split 单词,输出 span 元素内的每个单词,然后如果单词/样式目标是可预测的,则结合使用:nth selectors:

$p = explode(' ',$words);

foreach ($p as $key1 => $value1)

{

echo ''.$value1.';

}

否则,如果不能预测,再次使用voyager关于使用 data-* 属性的答案 . 使用PHP的示例:

$p = explode(' ',$words);

foreach ($p as $key1 => $value1)

{

echo ''.$value1.';

}

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

我同意the data attribute(旅行者的回答)应该如何处理,但CSS规则如下:

td.male { color: blue; }

td.female { color: pink; }

通常可以更容易设置,特别是对于像angularjs这样的客户端库,可以简单到:

只要确保内容只有一个字!或者您甚至可以使用以下内容映射到不同的CSS类名:

为了完整性,这是数据属性方法:

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

th::after { content: attr(data-value) }

td::after { content: attr(data-value) }

td[data-value]:not(:empty) {

color: fuchsia;

}

ZeroWidthSpace用于更改颜色,可以使用vanilla JavaScript添加:

const hombres = document.querySelectorAll('td[data-value="male"]');

hombres.forEach(hombre => hombre.innerHTML = '​');

虽然

的结束标记may be omitted这样做可能会导致它被视为非空 .

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

这里的大多数答案试图提供如何编写HTML代码以包含更多数据的替代方法,因为至少在CSS3中,您无法通过部分内部文本选择元素 . 但它可以完成后,你只需要添加一些vanilla JavaScript,注意因为女性也包含男性它将被选中:

cells = document.querySelectorAll('td');

console.log(cells);

[].forEach.call(cells, function (el) {

if(el.innerText.indexOf("male") !== -1){

//el.click(); click or any other option

console.log(el)

}

});

Petermale34
Susannefemale14
Petermale34
Susannefemale14

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

例如,这将点击包含单词“Bad bear”的第一个锚点:

browser.click("a*=Bad Bear");

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

像这样做小的过滤器小部件:

var searchField = document.querySelector('HOWEVER_YOU_MAY_FIND_IT')

var faqEntries = document.querySelectorAll('WRAPPING_ELEMENT .entry')

searchField.addEventListener('keyup', function (evt) {

var testValue = evt.target.value.toLocaleLowerCase();

var regExp = RegExp(testValue);

faqEntries.forEach(function (entry) {

var text = entry.textContent.toLocaleLowerCase();

entry.classList.remove('show', 'hide');

if (regExp.test(text)) {

entry.classList.add('show')

} else {

entry.classList.add('hide')

}

})

})

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值