[英]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.