Выделение значений с помощью CSS [duplicate]

Вы должны передать ссылку на запрос, как показано ниже

var options = { ... }
var req = http.request(options, function(res) {
  // Usual stuff: on(data), on(end), chunks, etc...
});

req.setTimeout(60000, function(){
    this.abort();
}).bind(req);
req.write('something');
req.end();

Запрос об ошибке будет вызван

req.on("error", function(e){
       console.log("Request Error : "+JSON.stringify(e));
  });

356
задан BoltClock 30 March 2015 в 05:37
поделиться

14 ответов

Если я правильно прочитал спецификацию , нет.

Вы можете сопоставлять элемент, имя атрибута в элементе и значение именованного атрибута в элементе. Я не вижу ничего для сопоставления содержимого внутри элемента.

251
ответ дан Dean J 16 August 2018 в 11:29
поделиться
  • 1
    Существует один краевой случай: :empty. – Ciro Santilli 新疆改造中心 六四事件 法轮功 6 July 2014 в 11:55
  • 2
    Этот ответ по-прежнему остается верным сегодня (2016 год)? – Tset Noitamotua 22 September 2016 в 12:13
  • 3
    Чтобы ответить на мой собственный вопрос: Да, это по-прежнему справедливо на сегодняшний день! Селекторы содержимого были устаревшими! Больше нет селекторов контента с CSS3. ( w3.org/TR/css3-selectors/#selectors [/ д0]) – Tset Noitamotua 22 September 2016 в 12:42
  • 4
    Можете ли вы объяснить, как material.io/icons использует текст внутри элемента i.e <i class="material-icons">face</i> и <i class="material-icons">settings</i> для различения значка, используемого, если нет возможности проверить текст? Я изо всех сил пытаюсь понять, как они это делают. – ConorReidd 11 July 2017 в 11:08
  • 5
    Я думаю, они используют шрифт с лигатурами. – Bastiaan Deknudt 26 August 2017 в 15:16

Использование jQuery:

$('td:contains("male")')
127
ответ дан Aliaksei Kliuchnikau 16 August 2018 в 11:29
поделиться
  • 1
    Заканчивается необходимость в обратном, а именно: jQuery (element) .not (& quot;: содержит ('string') & quot;) – Jazzy 7 November 2013 в 00:58
  • 2
    Кроме того, что это не CSS, это JavaScript. – Synetech 6 July 2015 в 22:00
  • 3
    Согласен - вот почему мой ответ сказал, что я использую jQuery, а не CSS. Но эта часть моего ответа была отредактирована. знак равно – moettinger 7 July 2015 в 01:22
  • 4
    но слово fe male также содержит слово «мужское» нет? это работает только «cos male»? Ошибка, ожидающая, если они будут переупорядочены? – Michael Durrant 26 March 2016 в 23:56
  • 5
    @Michael Durrant: вы шутите, но сопоставление между различными элементами (что является еще более серьезной проблемой, чем совпадение правильной подстроки внутри одного и того же элемента) на самом деле является одной из самых больших причин: contains () был удален. – BoltClock♦ 17 June 2016 в 05:19

Вы можете установить контент как атрибут данных, а затем использовать селектора атрибутов

/* 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-conten="Susanne">Susanne</td>
    <td data-content="female">female</td>
    <td data-content="14">14</td>
  </tr>
</table>

Вы также может использовать jQuery, чтобы легко установить эти атрибуты содержимого данных

$(function(){
  $("td").each(function(){
    var $this = $(this);
    $this.attr("data-content", $this.text());
  });
});
14
ответ дан Buksy 16 August 2018 в 11:29
поделиться
  • 1
    Это очень удобный трюк для сгенерированной разметки – Whelkaholism 24 February 2017 в 14:42
  • 2
    обратите внимание, что .text() и .textContent довольно тяжелы, старайтесь избегать их в длинных списках или больших текстах, когда это возможно. .html() и .innerHTML работают быстро. – oriadam 18 July 2017 в 14:09

Согласен атрибут данных (ответ вояджера) заключается в том, как его следует обрабатывать, НО, правила CSS, такие как:

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

часто могут быть намного проще настроить , особенно с клиентскими библиотеками вроде angularjs, которые могут быть такими же простыми, как:

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

Просто убедитесь, что контент - это всего лишь одно слово! Или вы даже можете сопоставить разные имена классов CSS с помощью:

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

Для полноты, вот подход атрибутов данных:

<td data-gender="{{person.gender}}">
2
ответ дан DJDaveMark 16 August 2018 в 11:29
поделиться

Похоже, они думали об этом для спецификации CSS3, но не сделали разреза.

:contains() Селектор CSS3 http://www.w3.org/TR/ CSS3-селекторы / # контент-селекторы

107
ответ дан e-motiv 16 August 2018 в 11:29
поделиться
  • 1
    Последнее доступное определение :contains() можно найти здесь здесь . – BoltClock♦ 7 February 2012 в 07:06
  • 2
    Looks like they were thinking about it for the CSS3 spec but it didn't make the cut. И по уважительной причине это нарушит всю предпосылку разделения стиля, содержания, структуры и поведения. – Synetech 6 July 2015 в 22:01
  • 3
    @Synetech. Это может фактически помочь отделить стиль от контента, так как это означает, что контент не должен знать о его клиенте, который будет считаться важным для базового стиля. Прямо сейчас наш html-контент обычно тесно связан с css, включая классы, которые, как мы знаем, заботятся о стилистах. Они уже переходят к тому, чтобы позволить CSS на контенте, о чем свидетельствуют селекторы значений атрибутов в CSS3. – DannyMeister 16 July 2015 в 23:23
  • 4
    @Synetech и как это «поведение», точно? Для меня это вопрос презентации. Он не do ничего - он представляет определенные типы контента определенным образом. – BarbaraKwarc 28 February 2017 в 05:27
  • 5
    @BarbaraKwarc, это не то, что я сказал. Изучите принципы веб-дизайна. В хорошем веб-дизайне стилизация должна содержаться в файлах CSS, содержимом в базах данных, структуре в файлах HTML и поведении в файле JavaScript. В идеале вы не должны смешивать их. В этом случае поведение не смешивается, это стиль и контент (размещение контента в стиле). Это плохо, потому что, во-первых, это усложняет ситуацию благодаря i18n; например, у вас будет отдельная запись CSS для каждого отдельного языка, который вы поддерживаете? – Synetech 21 July 2018 в 10:44
  • 6
    – Synetech 21 July 2018 в 10:48

Большинство ответов здесь предлагают альтернативу тому, как писать код HTML, чтобы добавить больше данных, потому что по крайней мере до CSS3 вы не можете выбрать элемент путем частичного внутреннего текста. Но это может быть сделано, вам просто нужно добавить немного ванильного 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)
    	}
    });
 <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
ответ дан Eduard Florinescu 16 August 2018 в 11:29
поделиться

Боюсь, это невозможно, потому что контент не является атрибутом и недоступен через псевдокласс. Полный список селекторов CSS3 можно найти в спецификации CSS3 .

3
ответ дан Esteban Küber 16 August 2018 в 11:29
поделиться

Ответ voyager об использовании атрибута data-* (например, data-gender="female|male" является наиболее эффективным и совместимым с стандартом по состоянию на 2017 год:

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

Практически большинство целей может достигать , поскольку существуют некоторые, хотя и ограниченные селектора, ориентированные вокруг текста. :: first-letter - псевдо-элемент , который может применяться ограниченным стилирование к первой букве элемента. Существует также псевдоэлемент :: first-line , кроме, очевидно, выбор первой строки элемента (например, параграф) также подразумевает, что очевидно, что CSS можно использовать для расширения этой существующей возможности для стилизации конкретных аспектов текстового узла.

До тех пор, пока такая защита не удастся и не реализована, следующая лучшая вещь, которую я мог бы предложить, когда это применимо, [explode / split, используя пространственный разделитель, выводит каждое отдельное слово внутри элемента span, а затем, если цель слова / стиля предсказуема используется в комбинации с : n-ыми селекторами :

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

Else , если не предсказуемо , снова используйте ответ voyager об использовании атрибута data-*. Пример использования PHP:

$p = explode(' ',$words);
foreach ($p as $key1 => $value1)
{
 echo '<span data-word="'.$value1.'">'.$value1.'</span>;
}
2
ответ дан John 16 August 2018 в 11:29
поделиться

На самом деле существует очень концептуальная основа того, почему это не было реализовано. Это комбинация в основном трех аспектов:

  1. Текстовое содержимое элемента эффективно является дочерним элементом этого элемента
  2. Вы не можете напрямую нацелить текстовое содержимое
  3. CSS не допускает вознесения с помощью селекторов

Эти 3 вместе означают, что к тому моменту, когда у вас есть текстовое содержимое, вы не сможете вернуться к содержащему элементу, и вы не можете текст. Это, вероятно, значимо, поскольку спуск только позволяет синхронное отслеживание контекста и синтаксический анализ SAX. Восходящие или другие селекторы с участием других осей вносят потребность в более сложных обходах или аналогичных решениях, которые значительно усложнили бы применение CSS к DOM.

56
ответ дан Matt Whipple 16 August 2018 в 11:29
поделиться
  • 1
    Это правда. Для этого нужен XPath. Если вы можете выполнить селектор в JS / jQuery или в библиотеке синтаксического анализа (в отличие от CSS-only), тогда можно будет использовать функцию XPath text(). – Mark Thomas 7 June 2013 в 14:25
  • 2
    Для меня это оправдания. css - один из худших языков, с которыми я встречался. Используя? + @ # & Gt; и пространство (для крика вслух!), поскольку ключевые слова для основной логики так восходят к 1980-м годам. По крайней мере, они могли бы использовать существующий ужасный контр-интуитивный язык-селектор, такой как регулярное выражение или xpath, они равномерно плохи, но по крайней мере вам не нужно было бы изучать другой. Лучшее, что они могли сделать, это использовать порт js, как для селекторов, свойств и значений. По крайней мере, таким образом, вы могли бы центрировать элемент в своем контейнере, когда речь идет о боковом элементе, например. – oriadam 18 July 2017 в 14:16

Вам нужно добавить атрибут данных в строки с именем data-gender со значением male или female и использовать селектор атрибутов:

HTML:

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

CSS:

td[data-gender="male"] { ... }
89
ответ дан Rudolph Gottesheim 16 August 2018 в 11:29
поделиться
  • 1
    Атрибуты данных не используются в качестве JS-крючков или селекторов CSS - для этого предназначены классы. Из спецификации: Custom data attributes are intended to store custom data private to the page or application, for which there are no more appropriate attributes or elements. Ссылка на spec: link – Ivan Durst 12 June 2015 в 23:19
  • 2
    @ Ivan Durst, я искренне не согласен, поскольку JS-крючки или CSS-селектора соответствуют определению данных, приватным для страницы или приложения, и в настоящее время для гендерного пола не существует более подходящей html-семантики. Чем больше ответственности мы кладем на атрибут класса, тем дальше мы получаем от семантического html, поэтому я все для начала использования увеличенных метаданных, доступных нам в html5. – DannyMeister 6 July 2015 в 18:46
  • 3
    @IvanDurst: но я говорю, что спецификация соглашается со мной. Если ваше приложение, использующее атрибуты данных (особенно для JS-перехватчиков!), Не учитывается как «личные данные, приватные для страницы или приложения», то что? Раздел 1.5.3 Authors can include data for inline client-side scripts or server-side site-wide scripts to process using the data-*="" attributes – DannyMeister 7 July 2015 в 21:50
  • 4
    Совершенно нормально использовать пользовательские атрибуты данных с помощью Javascript и CSS. См. MDN Использование атрибутов данных – Michael_B 2 October 2015 в 00:00
  • 5
    Что сказал @Michael_B. Вся точка атрибутов данных заключается в том, чтобы выставлять произвольные данные, которые могут быть использованы кодом приложения, в котором четко указаны стили и скрипты на стороне клиента. – BoltClock♦ 17 June 2016 в 05:23

Если вы используете Chimp / Webdriver.io , они поддерживают намного больше селекторов CSS , чем спецификация CSS.

Это, например, щелкнет по первому якорю, содержащему слова «Bad bear»:

browser.click("a*=Bad Bear");
0
ответ дан Ryan Shillington 16 August 2018 в 11:29
поделиться

Для тех, кто хочет сделать Selenium CSS text selections, этот скрипт может быть полезен.

Фокус в том, чтобы выбрать родителя элемента, который вы ищете, а затем выполнить поиск дочерний элемент, который имеет текст:

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];
}

Это вернет первый элемент, если его больше одного, поскольку в моем случае это всегда один элемент.

4
ответ дан the Tin Man 16 August 2018 в 11:29
поделиться

Поскольку 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";
}

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

4
ответ дан user40521 16 August 2018 в 11:29
поделиться
  • 1
    это javascript, как это связано с вопросом? – rubo77 11 August 2016 в 01:27
  • 2
    Поскольку вы не можете выбрать контент в css, вам придется использовать js для этого. Хотя вы правы, когда указываете, что это не css, использование атрибута данных не выбирается по контенту. Мы можем только догадываться, почему читатель хочет выбрать ячейки по содержанию, какой доступ у нее к html, сколько совпадений, насколько большой стол и т. Д. И т. Д. – user40521 7 September 2016 в 16:00
-2
ответ дан campino2k 29 October 2018 в 12:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: