Czy istnieje selektor CSS dla elementów zawierających określony tekst?

Szukam selektora CSS dla poniższej tabeli:

Peter    | male    | 34
Susanne  | female  | 12

Czy Jest jakiś selektor pasujący do wszystkich TDs zawierających "male"?

Author: BoltClock, 2009-10-05

19 answers

Jeśli poprawnie odczytam specyfikację , nie

Można dopasować do elementu, nazwy atrybutu w elemencie i wartości nazwanego atrybutu w elemencie. Nie widzę jednak nic do dopasowania treści w elemencie.

 449
Author: Dean J,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-05 14:33:36

Wygląda na to, że myśleli o tym dla specyfikacji CSS3 , ale nie udało się go wyciąć .

:contains() selektor CSS3 http://www.w3.org/TR/css3-selectors/#content-selectors

 175
Author: Jeff Beaman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-04 18:27:50

Using jQuery:

$('td:contains("male")')
 165
Author: moettinger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-31 15:37:47

Musisz dodać atrybut data do wierszy o nazwie data-gender z wartością male lub female i użyć selektora atrybutów:

HTML:

<td data-gender="male">...</td>

CSS:

td[data-gender="male"] { ... }
 134
Author: Esteban Küber,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-02 15:54:29

Istnieje bardzo konceptualna podstawa, dlaczego nie zostało to zaimplementowane. Jest to kombinacja zasadniczo 3 aspektów:

  1. zawartość tekstowa elementu jest w rzeczywistości potomkiem tego elementu
  2. nie można bezpośrednio kierować zawartości tekstu
  3. CSS nie pozwala na ascendencję z selektorami

Te 3 razem oznaczają, że do czasu, gdy masz treść tekstu, nie możesz wrócić do elementu zawierającego, i nie możesz stylować teraźniejszości tekst. Jest to prawdopodobnie znaczące, ponieważ malejące pozwala tylko na pojedyncze śledzenie kontekstu i parsowania stylu saksofonu. Rosnąco lub inne selektory obejmujące inne osie wprowadzają potrzebę bardziej złożonych rozwiązań przesuwnych lub podobnych, które znacznie skomplikowałyby zastosowanie CSS do DOM.

 68
Author: Matt Whipple,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-30 20:44:29

Możesz ustawić zawartość jako atrybut danych, a następnie użyć selektorów atrybutów , Jak pokazano tutaj:

/* 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;
}
<table>
  <tr>
    <td data-content="Peter">Peter</td>
    <td data-content="male">male</td>
    <td data-content="34">34</td>
  </tr>
  <tr>
    <td data-content="Susanne">Susanne</td>
    <td data-content="female">female</td>
    <td data-content="14">14</td>
  </tr>
</table>

Możesz również użyć jQuery, aby łatwo ustawić atrybuty data-content:

$(function(){
  $("td").each(function(){
    var $this = $(this);
    $this.attr("data-content", $this.text());
  });
});
 34
Author: Buksy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-11 06:20:43

Ponieważ CSS nie ma tej funkcji, będziesz musiał użyć JavaScript do stylizacji komórek według zawartości. Na przykład z XPath ' s contains:

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

Następnie użyj wyniku tak:

for ( var i=0 ; i < elms.snapshotLength; i++ ){
   elms.snapshotItem(i).style.background = "pink";
}

Https://jsfiddle.net/gaby_de_wilde/o7bka7Ls/9/

 17
Author: user40521,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-12-15 18:32:30

Obawiam się, że nie jest to możliwe, ponieważ treść nie jest atrybutem ani nie jest dostępna przez pseudo klasę. Pełna lista selektorów CSS3 znajduje się w specyfikacji CSS3.

 7
Author: Edwin V.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-05 14:40:59

Dla tych, którzy chcą dokonać selekcji tekstu CSS Selenium, ten skrypt może być przydatny.

Sztuczka polega na wybraniu rodzica elementu, którego szukasz, a następnie wyszukaniu dziecka, które ma tekst:

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<IWebElement>)element)[0];
}

Zwróci pierwszy element, jeśli jest więcej niż jeden, ponieważ zawsze jest to jeden element, w moim przypadku.

 6
Author: Matas Vaitkevicius,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-11 23:37:03

Zgadzam się atrybut danych (odpowiedź Voyagera) jest taki, jak powinien być obsługiwany, ale reguły CSS takie jak:

td.male { color: blue; }
td.female { color: pink; }

Często może być znacznie łatwiejsze do skonfigurowania, zwłaszcza z bibliotekami po stronie klienta, takimi jak angularjs, które mogą być tak proste, jak:

<td class="{{person.gender}}">

Upewnij się, że treść jest tylko jednym słowem! Możesz też mapować do różnych nazw klas CSS za pomocą:

<td ng-class="{'masculine': person.isMale(), 'feminine': person.isFemale()}">

Dla kompletności, oto podejście atrybutów danych:

<td data-gender="{{person.gender}}">
 3
Author: DJDaveMark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-01 10:24:42

Jeśli nie tworzysz DOM samodzielnie (np. w userscripcie), możesz wykonać następujące czynności z czystym JS:

for ( td of document.querySelectorAll('td') ) {
  console.debug("text:", td, td.innerText)
  td.setAttribute('text', td.innerText)
}
for ( td of document.querySelectorAll('td[text="male"]') )
  console.debug("male:", td, td.innerText)
<table>
  <tr>
    <td>Peter</td>
    <td>male</td>
    <td>34</td>
  </tr>
  <tr>
    <td>Susanne</td>
    <td>female</td>
    <td>12</td>
  </tr>
</table>

Wyjście konsoli

text: <td> Peter
text: <td> male
text: <td> 34
text: <td> Susanne
text: <td> female
text: <td> 12
male: <td text="male"> male
 3
Author: Gerold Broser,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-12-16 15:16:39

@ odpowiedź Voyagera na temat używania atrybutu data-* (np. data-gender="female|male" jest najskuteczniejszym i zgodnym ze standardami podejściem od 2017 roku:

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

Prawie większość celów może zostać osiągnięta, ponieważ istnieją pewne, choć ograniczone selektory zorientowane wokół tekstu. ::first-letter jest pseudo-elementem , który może stosować Ograniczony styl do pierwszej litery elementu. Istnieje również ::first-line pseudo-element poza oczywiście zaznaczeniem pierwsza linia elementu (takiego jak akapit) oznacza również, że jest oczywiste, że CSS może być użyty do rozszerzenia tej istniejącej możliwości do stylowania określonych aspektów kodu tekstowego.

Dopóki takie poparcie nie powiedzie się i zostanie wdrożone, następną najlepszą rzeczą, jaką mogę zasugerować, gdy ma to zastosowanie, jest explode/split słowa za pomocą deliminatora spacji, wypisuje każde pojedyncze słowo wewnątrz elementu span, a następnie, jeśli wyraz/cel stylizacji jest przewidywalny, użyj w połączeniu z : nth selektory :

$p = explode(' ',$words);
foreach ($p as $key1 => $value1)
{
 echo '<span>'.$value1.'</span>;
}

Else jeśli nie jest przewidywalne , aby ponownie użyć odpowiedzi Voyagera o użyciu atrybutu data-*. Przykład użycia PHP:

$p = explode(' ',$words);
foreach ($p as $key1 => $value1)
{
 echo '<span data-word="'.$value1.'">'.$value1.'</span>;
}
 2
Author: John,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-09 10:09:35

Jeśli używasz szympans / Webdriver.io, obsługują znacznie więcej selektorów CSS niż specyfikacja CSS.

To, na przykład, kliknie na pierwszą kotwicę, która zawiera słowa "zły niedźwiedź":

browser.click("a*=Bad Bear");
 2
Author: Ryan Shillington,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-02 17:26:59

Większość odpowiedzi stara się zaoferować alternatywę dla tego, jak napisać kod HTML, aby zawierał więcej danych, ponieważ przynajmniej do CSS3 nie można wybrać elementu za pomocą częściowego tekstu wewnętrznego. Ale można to zrobić, wystarczy dodać trochę waniliowego JavaScript, zauważ, że kobieta zawiera również samca zostanie wybrana:

      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)
    	}
    });
 <table>
      <tr>
        <td>Peter</td>
        <td>male</td>
        <td>34</td>
      </tr>
      <tr>
        <td>Susanne</td>
        <td>female</td>
        <td>14</td>
      </tr>
    </table>
<table>
  <tr>
    <td data-content="Peter">Peter</td>
    <td data-content="male">male</td>
    <td data-content="34">34</td>
  </tr>
  <tr>
    <td data-conten="Susanne">Susanne</td>
    <td data-content="female">female</td>
    <td data-content="14">14</td>
  </tr>
</table>
 1
Author: Eduard Florinescu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-27 20:11:22

Uważam, że opcja atrybutu jest najlepsza, jeśli nie chcesz używać javascript lub jquery.

Np. aby stylizować wszystkie komórki tabeli ze słowem gotowe, w HTML zrób to:

 <td status*="ready">Ready</td>

Następnie w css:

td[status*="ready"] {
        color: red;
    }
 1
Author: Anthony,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-04-09 13:36:16

Możesz również użyć content z attr() i style komórek tabeli, które są :not :empty:

th::after { content: attr(data-value) }
td::after { content: attr(data-value) }
td[data-value]:not(:empty) {
  color: fuchsia;
}
<table>
  <tr>
    <th data-value="Peter"></th>
    <td data-value="male">&#x0200B;</td>
    <td data-value="34"></td>
  </tr>
  <tr>
    <th data-value="Susanne"></th>
    <td data-value="female"></td>
    <td data-value="12"></td>
  </tr>
  <tr>
    <th data-value="Lucas"></th>
    <td data-value="male">&#x0200B;</td>
    <td data-value="41"></td>
  </tr>
</table>

A ZeroWidthSpace jest używany do zmiany koloru i może być dodany za pomocą JavaScript vanilla:

const hombres = document.querySelectorAll('td[data-value="male"]');
hombres.forEach(hombre => hombre.innerHTML = '&#x0200B;');

Chociaż znacznik <td>s end może być pominięty może to spowodować, że będzie traktowany jako niepusty.

 0
Author: Josh Habdas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-01-09 12:05:18

[1]} od stycznia 2021 roku, jest coś, co zrobi właśnie to. : has ()... tylko jeden haczyk: nie jest to jeszcze obsługiwane w żadnej przeglądarce

Przykład: poniższy selektor dopasowuje tylko elementy, które bezpośrednio zawierają potomek:

a:has(> img)
 0
Author: den232,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-01-15 13:10:39

Robienie małych widżetów filtrujących w ten sposób:

    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')
            }
        })
    })
 -2
Author: campino2k,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-15 21:36:54

Składnia tego pytania wygląda jak składnia Robot Framework. W tym przypadku, chociaż nie ma selektora css, którego można użyć do contains, istnieje słowo kluczowe SeleniumLibrary, które można użyć zamiast tego. Poczekaj, Aż Element Zawiera .

Przykład:

Wait Until Element Contains  | ${element} | ${contains}
Wait Until Element Contains  |  td | male
 -2
Author: Eftychia Thomaidou,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-08-09 14:26:06