Metne göre bağlantı seçin (tam eşleşme)


89

JQuery kullanarak, tam olarak bir tür metin içeren bir bağlantı seçmek istiyorum. Örneğin:

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

Bunu denedim:

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

Ancak ilk VE ikinci bağlantıyı seçer. Tam olarak "Bu Bir" i içeren ilk bağlantıyı istiyorum. Bunu nasıl yapabilirim?


Yanıtlar:


139

Bunu yapabilirsiniz:

$('a').filter(function(index) { return $(this).text() === "This One"; });

Referans: http://api.jquery.com/filter/


5
Bu durumda her ikisi de işe yarar, ama ben === kullanma eğilimindeyim çünkü değer ve türe göre eşleşiyor, yani türleri zorlamayacak. stackoverflow.com/questions/359494/…
FishBasketGordo

1
Iskaladın return. Bunu şu şekilde değiştirmeliyimfunction(index) { return (this.text === 'This One') }
Endy Tjahjono

Ek olarak, metin uzunluğunu kontrol edebilirsiniz.
bestinamir


28

FishBasketGordo'nun cevabını genişletmek için. Seçimi çok sayıda öğe üzerinde yapmaya çalışıyorsanız, :contains()önce daraltmak için kullanın ve ardından filtreyi uygulayın.

Bu, genel hızı artıracaktır:

$('a:contains("This One")').filter(function(index)
{
    return $(this).text() === "This One";
});

Hız / verimlilik için oy verildi. Ayrıca, .filter (..) içinde $ .trim () boşluk ihtiyacını ortadan kaldırır.
JoePC

8

Nariman'ın çözümünü şu şekilde değiştirmek zorunda kaldı:

$.expr[':'].textEquals = function(a, i, m) {
    var match = $(a).text().match("^" + m[3] + "$")
    return match && match.length > 0;                                                                                                                                                                                                                                            
}

Aksi takdirde chrome üzerinde çalışmadı (Linux)


6

Uzantıyı kullanıyordum

$.expr[':'].textEquals

Ancak uygulamanın artık jQuery 1.7 ile çalışmadığını buldum (görünüşe göre Sizzla.filter'de bir değişiklik). Çalışması için bir süre uğraştıktan sonra, aynısını başarmak için bir jQuery eklentisi yazdım.

$.fn.textEquals = function (text) {
    var match = false;
    $(this).each(function () {
        if ($(this).text().match("^" + escapeRegex(text) + "$")) {
            match = true;
            return false;
        }
    });
    return match;
};

Kullanım:

$(".ui-autocomplete li").textEquals('Exact Text to Match');

Başka birinin bununla karşılaşması durumunda sadece paylaşmak istedim (,


3

Yani Narnian'ın cevabı oldukça iyi çalışıyor. Bununla birlikte, onu vahşi ortamda kullanarak, bulunmasını beklediğim şeylerin bulunamadığı bazı sorunlarla karşılaştım. Bunun nedeni, bazen öğenin metnini çevreleyen rastgele beyaz boşluk olmasıydı. İnanıyorum ki, "Merhaba Dünya" yı arıyorsanız, yine de "Merhaba Dünya" veya hatta "Merhaba Dünya \ n" ile eşleşmesini isteyeceksiniz. Böylece, işleve çevredeki beyaz boşlukları kaldıran "trim ()" yöntemini ekledim ve daha iyi çalışmaya başladı. Ayrıca, değişken isimlerini zihnime biraz daha açık gelecek şekilde değiştirdim.

Özellikle ...

$.expr[':'].textEquals = function(el, i, m) {
    var searchText = m[3];
    var match = $(el).text().trim().match("^" + searchText + "$")
    return match && match.length > 0;
}

Ve ikincil not ... kırpma yalnızca aranan metinden önceki ve sonraki beyaz boşlukları kaldırır. Kelimelerin ortasındaki boşlukları kaldırmaz. Bunun arzu edilen bir davranış olduğuna inanıyorum, ama istersen bunu değiştirebilirsin.


3
$('a:contains("This One")')[0];

Herkesin filtrelemek için verdiği cevaba göre bir şeyi kaçırdığımı hissediyorum, ancak neden 'içerir' ile döndürülen öğeler dizisi içindeki ilk öğeyi seçmiyorsunuz?

Bu, yalnızca ilk bağlantının tam olarak aradığınız eşleşmeye sahip olduğunu biliyorsanız çalışır. Bağlantıların hangi sırada olacağından emin değilseniz diğer yanıtlar daha iyi sonuç verir.


Çünkü istediğinin her zaman ilk olduğunu bilmiyor
Cameron

Soru özellikle "Sadece ilk bağlantıyı istiyorum" diye soruyor.
Michael Khalili

Soru tam eşleşmeyi sorar, yazar hangi elemanın istediğini açıklamak için ilk öğeyi belirtir.
dlopezgonzalez

2

Bir drop-dwon'dan seçilen değer nasıl elde edilir:

$.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")); - açılır menünün değerini döndürür


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

1
Lütfen cevabınıza açıklama ekleyin.
Michał Perłakowski

o metne sahip herhangi bir bağlantıyı seçmek için ilk satır, ikinci ve üçüncü satırlar, bunları gizlemek veya jquery belgelerinde bağlantıya bakmayı devre dışı bırakmak için bağlantıyla neler yapabilirsiniz api.jquery.com/filter
David Fawzy

@DavidFawzy - pardon, umm ... ne ?? 2. veya 3. satırların OP'nin sorusuyla bir ilgisi olduğunu sanmıyorum - sadece kafa karışıklığı yaratıyor.
jbyrd

2

Üzgünüz, bu yukarıdaki herhangi birinin cevabıyla tam olarak eşleşirse,

   $.fn.equalsText = function (text, isCaseSensitive) {
      return $(this).filter(function () {
         if (isCaseSensitive) {
            return $(this).text() === text
         } else {
            return $(this).text().toLowerCase() === text.toLowerCase()
         }
      })
   }

Linkedin arama sonucu sayfası konsolunda bazı çıktılar.

$("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

Aynı zamanda büyük / küçük harf duyarlılığı desteğine sahiptir ve kullanmıyor :contains()

Düzenleme (22 Mayıs 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()
         }
      })
   }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.