[英]Hide div that contains specific text
我想根据里面的文字隐藏一个 div。 在下面的示例中,我想隐藏带有“Handtekening”的那些和带有“Thuis”的那些。 我更喜欢用 CSS 来做到这一点。 这可能吗?
divs
的类名必须相同...
<div class="test">
Pakket
</div>
<div class="test">
Handtekening
</div>
<div class="test">
Thuis
</div>
如果使用 CSS 无法实现,那么如何使用 JavaScript 来实现?
这是一个简单的 vanilla Javascript 解决方案:
let divs = document.getElementsByClassName('test');
for (let x = 0; x < divs.length; x++) {
let div = divs[x];
let content = div.innerHTML.trim();
if (content == 'Handtekening' || content == 'Thuis') {
div.style.display = 'none';
}
}
请记住在 HTML 页面的末尾(就在</body>
标记之前)包含脚本。
如果您可以控制 HTML 输出并且文本文档变大两倍没有问题,您可以复制每个 div 的内容。 否则 JavaScript 是要走的路。 这是CSS解决方案:
<div class="test" content="Pakket">
Pakket
</div>
<div class="test" content="Handtekening">
Handtekening
</div>
<div class="test" content="Thuis">
Thuis
</div>
然后将选择器用于包含字符串的属性:
div[content~=Thuis] { display:none; }
当“Thuis”作为单独的词包含在文本中时,上面的将匹配。 如果你想匹配任何出现的字符串,你应该使用:
div[content*=and] { display:none; }
不,纯 CSS 是不可能的。 你需要使用 JavaScript 来做到这一点。
这是您可以使用的代码:
var divs = document.querySelectorAll(".test");
Array.from(divs).forEach(function(div) {
if (div.textContent.indexOf("Handtekening") >= 0 || div.textContent.indexOf("Thuis") >= 0) {
div.style.display = "none";
}
});
var divs = document.querySelectorAll(".test"); Array.from(divs).forEach(function(div) { if (div.textContent.indexOf("Handtekening") >= 0 || div.textContent.indexOf("Thuis") >= 0) { div.style.display = "none"; } });
<div class="test"> Pakket </div> <div class="test"> Handtekening </div> <div class="test"> Thuis </div>
你可以用第二个class
来做隐藏元素的简单事情。
因此,假设我们将添加class="hidden"
。
请参阅下面的示例:
.test { color: blue; } .hidden { display: none; /* or visibility: hidden; */ }
<div class="test"> Pakket </div> <div class="test hidden"> Handtekening </div> <div class="test hidden"> Thuis </div>
通过添加第二个class
我们可以选择要显示和不显示的<div>
元素。
这是另一种解决方案:
Array.from( document.querySelectorAll('div.test') ) .filter( node => /\\b(Handtekening|Thuis)\\b/i.test(node.textContent) ) .forEach( node => node.style.display = 'none' );
<div class="test"> Pakket </div> <div class="test"> HANDTEKENING </div> <div class="test"> Test thuis blah blah </div>
与chsdk 解决方案的主要区别在于,我使用的是单个正则表达式测试,而不是多个.indexOf()
调用。 IMO 这更干净、更灵活,也可能更高效。
正则表达式中的\\b
锚点匹配单词边界,因此例如"Thuis test"
匹配但"Thuistest"
不匹配。 我怀疑这就是 OP 想要的,但如果不是, \\b
锚可以很容易地被删除和/或替换为其他东西。 例如,正则表达式:
/^\s*(Handtekening|Thuis)\b/i
仅当“Handtekening”或“Thuis”出现在内容的开头(可能在一些空格之后)时才会匹配。 用\\s*$
替换第二个\\b
还要求匹配的单词后没有任何内容(可能除了空格)。
正则表达式文本末尾的i
标志使匹配不区分大小写。 如果不需要,可以简单地删除i
。 不过,我想将它包括在内以进行说明。
附言。 一些较旧的浏览器(例如,特别是 Internet Explorer)可能不支持上面代码中使用的 ES6 箭头函数和Array.from()
方法。 如果需要与此类旧浏览器兼容,这里有一个没有任何此类新奇事物的替代实现:
var nodes = document.querySelectorAll('div.test'); for (var i = 0; i < nodes.length; i++) { if ( /\\b(Handtekening|Thuis)\\b/i.test(nodes[i].textContent) ) { nodes[i].style.display = 'none'; } }
<div class="test"> Pakket </div> <div class="test"> HANDTEKENING </div> <div class="test"> Test thuis blah blah </div>
AFAICT,这应该兼容 IE 到版本 9,当然也兼容所有现代浏览器。
要根据文本选择元素,您可以使用 js 并检查文本是否等于要隐藏的元素。 如果是,您可以将 display 属性设置为none
以隐藏该元素。
[...document.querySelectorAll('.test')].forEach(function(e) { if (['Handtekening', 'Thuis'].includes(e.textContent.trim())) { e.style.display = 'none' } })
<div class="test"> Pakket </div> <div class="test"> Handtekening </div> <div class="test"> Thuis </div>
你可以这样做,就像这样
let filteredOut = ['Handtekening', 'Thuis'];
Array.from(document.querySelectorAll(".test")).forEach((elm) => {
if(filteredOut.includes(elm.textContent.trim())) elm.style.display = "none";
});
旁注:您可以使用类添加到捕获的元素,而不是插入内联样式。
你可以用 JavaScript 做到:
var elements = document.getElementsByClassName('test'); for(var i = 0; i<elements.length; i++){ if(elements[i].innerText==='Handtekening' || elements[i].innerText==='Thuis'){ elements[i].style.display = 'none'; } }
<div class="test"> Pakket </div> <div class="test"> Handtekening </div> <div class="test"> Thuis </div>
这是纯 JavaScript 解决方案:
// Define your variables
var objectsToCheck = document.getElementsByClassName("test");
var hideText = "Pakket";
// Loop through your div objects
[].forEach.call(objectsToCheck, function (o) {
// Check if text appears in div under class "test"
if(o.innerText.toLowerCase() == hideText.toLowerCase()){
o.style.display = "none";
}
});
您可以在此处测试您的 XPath。
如果您已经使用了这个库,那么您还有 jQuery 可以使这变得容易: contains(text) 。
text:要查找的文本字符串。 它区分大小写。
匹配的文本可以直接出现在所选元素中、该元素的任何后代中,或者它们的组合中。 与属性值选择器一样,:contains() 括号内的文本可以写成一个空词或用引号括起来。 要选择的文本必须具有匹配的大小写。
$( ".test:contains('Thuis'),.test:contains('Handtekening')" ).css( "display", "none" );
您可以使用querySelector
获取元素并使用element.classList.toggle
添加/删除将隐藏值的类。
document.querySelector('#btn').addEventListener('click', function(){ var text = document.querySelector('#txt').value.trim(); var list = document.querySelectorAll('.test'); for(var i = 0; i< list.length; i++) { list[i].classList.toggle('hide', list[i].textContent.trim() === text); } })
.hide { display: none; }
<div class="test"> Pakket </div> <div class="test"> Handtekening </div> <div class="test"> Thuis </div> <input type='text' id='txt' /> <button id='btn'>Hide Div</button>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.