Выберите ссылку по тексту (точное совпадение)



используя jQuery, я хочу выбрать ссылку, которая содержит точно какой-то текст. Например:



<p><a>This One</a></p>
<p><a>"This One?"</a></p>
<p><a>Unlikely</a></p>


Я попытался это:



$('a:contains("This One")')


но он выбирает первое и второе звено. Я просто хочу первую ссылку, которая содержит именно "этот". Как я могу это сделать?

651   10  

10 ответов:

вы можете сделать это:

$('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 для выбора элементов по точному тексту: 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.фильтр.) После борьбы в течение некоторого времени, чтобы заставить его работать, я просто написал плагин 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;
}

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

var link = $('a').filter(function(index) { return $(this).text() === "Availability"; });
 $(link).hide();
        $(link).removeAttr('href');

Извините, если это точно соответствует чьему-либо ответу выше,

   $.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()

Edit (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()
         }
      })
   }
$('a:contains("This One")')[0];

Я чувствую, что мне не хватает чего-то, основанного на ответе всех остальных, чтобы фильтровать, но почему бы просто не выбрать первый элемент в массиве элементов, который возвращается 'contains'?

это работает, только если вы знаете, что первая ссылка имеет точное совпадение, которое вы ищете. Другие ответы работают лучше, если вы не уверены, в каком порядке будут ссылки.

Comments

    Ничего не найдено.