Как мне найти DIV с определенным текстом? Например:
<div>
SomeText, text continues.
</div>
Пытаюсь использовать что-то вроде этого:
var text = document.querySelector('div[SomeText*]').innerTEXT;
alert(text);
Но, конечно, не получится. Как мне это сделать?
javascript
innertext
selectors-api
пароль
источник
источник
Ответы:
Вопрос OP касается простого JavaScript, а не jQuery . Хотя ответов много, и мне нравится @Pawan Nogariya ответ , ознакомьтесь с этой альтернативой.
Вы можете использовать XPATH в JavaScript. Подробнее о статье MDN здесь .
В
document.evaluate()
Метод вычисляет XPATH запроса / выражение. Таким образом, вы можете передать туда выражения XPATH, перейти в HTML-документ и найти нужный элемент.В XPATH вы можете выбрать элемент по текстовому узлу, как показано ниже, который получает элемент,
div
имеющий следующий текстовый узел.Чтобы получить элемент, содержащий текст, используйте следующее:
contains()
Метод XPATH занимает узел в качестве первого параметра и текста для поиска в качестве второго параметра.Отметьте этот кусок здесь , это пример использования XPATH в JavaScript
Вот фрагмент кода:
Как видите, я могу взять элемент HTML и изменить его по своему усмотрению.
источник
alert(thisHeading.textContent.replace(/.*You have login (.*) times.*/,'$1')) ;
.evaluate()
использует. Пожалуйста, исправьте меня, если я ошибаюсь), поэтому, во-первых, вы не можете искать что-то, что соответствует регулярному выражению. Во-вторых,.textContent
свойство возвращает текстовый узел элемента. Если вы хотите получить значение из этого текста, вы должны обработать его явным образом, возможно, создав какую-то функцию, которая соответствует регулярному выражению и возвращает соответствующее значение в группе. Для этого создайте новый вопрос в отдельном потоке.Вы можете использовать это довольно простое решение:
Array.from
Преобразует NodeList в массив (есть несколько способов сделать это как оператор распространения или кусочком)Результатом теперь является массив, позволяющий использовать
Array.find
метод, затем вы можете вставить любой предикат. Вы также можете проверить textContent с помощью регулярного выражения или чего угодно.Обратите внимание, что
Array.from
иArray.find
являются функциями ES2015. Будьте совместимы со старыми браузерами, такими как IE10, без транспилятора:источник
find
наfilter
.Поскольку вы спросили об этом в javascript, у вас может быть что-то вроде этого
А потом назовите это так
источник
[object HTMLDivElement],[object HTMLDivElement]
foundDivs[0].innerText
, очень простоЭто решение делает следующее:
Использует оператор распространения ES6 для преобразования списка всех узлов
div
в массив.Предоставляет вывод, если
div
содержит строку запроса, а не только если она в точности совпадает со строкой запроса (что происходит с некоторыми другими ответами). например, он должен обеспечивать вывод не только для SomeText, но также и для SomeText, текст продолжается.Выводит все
div
содержимое, а не только строку запроса. например, для SomeText, text continue должна выводить всю строку, а не только SomeText.Позволяет нескольким
div
s содержать строку, а не только одномуdiv
.источник
innerHTML
ваши самые лучшие<div>
. Вы должныdiv
сначала отфильтровать те, которые содержат дочерние элементы. Также подозреваемыйdocument.getElementsByTagName('div')
может быть быстрее, но я бы проверил, чтобы быть уверенным.Лучше всего увидеть, есть ли у вас родительский элемент запрашиваемого div. Если это так, получите родительский элемент и выполните
element.querySelectorAll("div")
. Как только вы получитеnodeList
фильтр, примените к нему фильтрinnerText
. Предположим , что родительский элемент DIV , который мы запрашиваете имеетid
вcontainer
. Обычно вы можете получить доступ к контейнеру напрямую из идентификатора, но давайте сделаем это правильно.Ну это все.
источник
Если вы не хотите использовать jquery или что-то в этом роде, вы можете попробовать следующее:
Когда у вас есть узлы в массиве, содержащие текст, вы можете что-то с ними делать. Как предупредить каждого или распечатать на консоли. Одно предостережение заключается в том, что это не обязательно может захватывать div как таковые, это будет захватывать родительский элемент текстового узла, который имеет текст, который вы ищете.
источник
Поскольку нет ограничений на длину текста в атрибуте данных, используйте атрибуты данных! И затем вы можете использовать обычные селекторы css для выбора ваших элементов, как того хочет OP.
В идеале вы выполняете часть настройки атрибутов данных при загрузке документа и немного сужаете селектор querySelectorAll для повышения производительности.
источник
У Google это лучший результат для тех, кому нужно найти узел с определенным текстом. Посредством обновления список узлов теперь можно итерировать в современных браузерах без необходимости преобразовывать его в массив.
Решение можно использовать для каждого так.
Это помогло мне выполнить поиск / замену текста внутри списка узлов, когда обычный селектор не мог выбрать только один узел, поэтому мне пришлось фильтровать каждый узел один за другим, чтобы проверить его на иглу.
источник
Используйте XPath и document.evaluate () и убедитесь, что вы используете text (), а не. для аргумента contains (), иначе у вас будет сопоставлен весь HTML или самый внешний элемент div.
или игнорировать начальные и конечные пробелы
или сопоставить все типы тегов (div, h1, p и т. д.)
Затем повторите
источник
thisheading.setAttribute('class', "esubject")
Вот подход XPath, но с минимумом жаргона XPath.
Обычный выбор на основе значений атрибутов элемента (для сравнения):
Выбор XPath на основе текста внутри элемента.
А вот и нечувствительность к регистру, поскольку текст более изменчив:
источник
У меня была аналогичная проблема.
Функция, возвращающая все элементы, включающие текст из аргумента.
Это работает для меня:
}
источник
Здесь уже есть много отличных решений. Однако, чтобы предоставить более оптимизированное решение и еще одно, соответствующее идее поведения и синтаксиса querySelector, я выбрал решение, расширяющее Object парой функций-прототипов. Обе эти функции используют регулярные выражения для сопоставления текста, однако строка может быть предоставлена как свободный параметр поиска.
Просто реализуйте следующие функции:
После реализации этих функций вы можете выполнять следующие вызовы:
document.queryInnerTextAll('div.link', 'go');
Это найдет все дивы , содержащие ссылку класс со словом идти в InnerText (например. Налево или идти вниз или идти прямо или это Go О.Д. )
document.queryInnerText('div.link', 'go');
Это будет работать точно так же, как в приведенном выше примере, за исключением того, что вернет только первый соответствующий элемент.
document.queryInnerTextAll('a', /^Next$/);
Найдите все ссылки с точным текстом Далее (с учетом регистра). Это исключит ссылки, содержащие слово Next вместе с другим текстом.
document.queryInnerText('a', /next/i);
Найдите первую ссылку, содержащую слово « следующий» , независимо от регистра (например, « Следующая страница» или « Перейти к следующему» ).
e = document.querySelector('#page');
e.queryInnerText('button', /Continue/);
Это выполняет поиск в элементе контейнера кнопки, содержащей текст « Продолжить» (с учетом регистра). (например, " Продолжить" или " Перейти к следующему", но не продолжить )
источник