Ответ 1
Вы можете сделать это:
$('a').filter(function(index) { return $(this).text() === "This One"; });
Ссылка: http://api.jquery.com/filter/
Используя jQuery, я хочу выбрать ссылку, содержащую точно какой-то текст. Например:
<p><a>This One</a></p>
<p><a>"This One?"</a></p>
<p><a>Unlikely</a></p>
Я пробовал это:
$('a:contains("This One")')
Но он выбирает первую И вторую ссылку. Мне просто нужна первая ссылка, содержащая именно "This One". Как я могу это сделать?
Вы можете сделать это:
$('a').filter(function(index) { return $(this).text() === "This One"; });
Ссылка: http://api.jquery.com/filter/
Мой коллега расширил jQuery с помощью функции:
$.expr[':'].textEquals = function(a, i, m) {
return $(a).text().match("^" + m[3] + "$");
};
В результате вы можете выбрать что-то точным текстом следующим образом:
$("label:textEquals('Exact Text to Match')");
Это упрощает работу, так как вам не нужно запоминать точный синтаксис каждый раз. Его весь пост здесь: jQuery Custom Selector для выбора элементов по точному тексту: textEquals
Чтобы расширить ответ на FishBasketGordo. Если вы пытаетесь сделать выбор на большом количестве элементов, сначала используйте :contains()
, чтобы сузить область, а затем применить фильтр.
Это улучшит общую скорость:
$('a:contains("This One")').filter(function(index)
{
return $(this).text() === "This One";
});
пришлось модифицировать решение Наримана:
$.expr[':'].textEquals = function(a, i, m) {
var match = $(a).text().match("^" + m[3] + "$")
return match && match.length > 0;
}
В противном случае не работало на chrome (Linux)
Я использовал расширение
$.expr[':'].textEquals
Но я обнаружил, что реализация больше не работает с jQuery 1.7 (видимо, это изменение в Sizzla.filter). После некоторого времени, чтобы заставить его работать, я просто написал плагин jQuery, чтобы выполнить то же самое.
$.fn.textEquals = function (text) {
var match = false;
$(this).each(function () {
if ($(this).text().match("^" + escapeRegex(text) + "$")) {
match = true;
return false;
}
});
return match;
};
Использование:
$(".ui-autocomplete li").textEquals('Exact Text to Match');
Просто хотел поделиться, в случае, если кто-то другой столкнется с этим (,
Как получить выбранное значение из drop-dwon:
$.fn.textEquals = function (text) {
var match = false;
var values="";
$(this).each(function () {
if ($(this).text().match("^" + text + "$")) {
values=$(this).val();
match = true;
return false;
}
});
return values;
};
console.log($("option").textEquals("Option One"));
- он вернет значение раскрывающегося списка
Итак, ответ Нарняна работает очень хорошо. Однако, используя это в дикой природе, я столкнулся с некоторыми проблемами, когда вещи, которые я ожидал получить, не нашли. Это было потому, что иногда есть случайное белое пространство, окружающее текст элемента. Я считаю, что если вы ищете "Hello World", вы все равно хотите, чтобы он соответствовал "Hello World" или даже "Hello World\n". Таким образом, я просто добавил метод "trim()" к функции, которая удаляет окружающие пробелы, и она начала работать лучше. Кроме того, я изменил имена переменных, чтобы немного понять их.
В частности...
$.expr[':'].textEquals = function(el, i, m) {
var searchText = m[3];
var match = $(el).text().trim().match("^" + searchText + "$")
return match && match.length > 0;
}
И вторичное примечание... trim только удаляет пробелы до и после искомого текста. Он не удаляет пробелы в середине слов. Я считаю, что это желательно поведение, но вы можете изменить это, если хотите.
var link = $('a').filter(function(index) { return $(this).text() === "Availability"; });
$(link).hide();
$(link).removeAttr('href');
$('a:contains("This One")')[0];
Я чувствую, что у меня что-то не получается, потому что все остальные отвечают на фильтрацию, но почему бы просто не выбрать первый элемент в массиве элементов, возвращаемых 'contains'?
Это работает, только если вы знаете, что первая ссылка имеет точное соответствие, которое вы ищете. Другие ответы работают лучше, если вы не знаете, в каком порядке будут размещаться ссылки.
Извините, если это точно соответствует любому ответу выше,
$.fn.equalsText = function (text, isCaseSensitive) {
return $(this).filter(function () {
if (isCaseSensitive) {
return $(this).text() === text
} else {
return $(this).text().toLowerCase() === text.toLowerCase()
}
})
}
Вот несколько результатов в консоли страницы результатов поиска Linkedin.
$("li").equalsText("Next >", false)
[<li class="next">…</li>] // Output
$("li").equalsText("next >", false)
[<li class="next">…</li>] // Output
$("li").equalsText("Next >", true)
[<li class="next">…</li>] // Output
$("li").equalsText("next >", true)
[] // Output
Он поддерживает регистр чувствительности и не использует :contains()
Изменить (22 мая 2017 года): -
$.fn.equalsText = function (textOrRegex, isCaseSensitive) {
return $(this).filter(function () {
var val = $(this).text() || this.nodeValue
if (textOrRegex instanceof RegExp) {
return textOrRegex.test(val)
} else if (isCaseSensitive) {
return val === textOrRegex
} else {
return val.toLowerCase() === textOrRegex.toLowerCase()
}
})
}