2011-07-13 32 views
74

使用jQuery,我想選擇一個包含完全某種文本的鏈接。例如:通過文本選擇鏈接(完全匹配)

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

我已經試過這樣:

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

但挑選第一和第二個鏈接。我只想要第一個包含「This One」的鏈接。我怎樣才能做到這一點?

+0

[基於EXACT文本內容選擇元件]的可能的複製(http://stackoverflow.com/questions/2338439/select-element-based-on-exact-text-contents) –

回答

122

你可以這樣做:

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

參考:http://api.jquery.com/filter/

+0

爲什麼===而不是==? –

+5

要麼在這種情況下工作,但我傾向於使用===,因爲它匹配值和類型,即它不會強制類型。 http://stackoverflow.com/questions/359494/javascript-vs-does-it-matter-which-equal-operator-i-use – FishBasketGordo

+1

你錯過了'return'。我必須將其更改爲'function(index){return(this.text ==='This One')}' –

35

我的一位同事擴展jQuery的一個函數來做到這一點:

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

的結果是,你可以選擇這種方式的確切文字:

$("label:textEquals('Exact Text to Match')"); 

這使得它很容易,因爲你不必每次都記住確切的語法。他的整個帖子是在這裏:jQuery Custom Selector for selecting elements by exact text :textEquals

+0

非常好。我希望這是標準jQuery實現的一部分。 – Yuck

+0

只是爲了防止像我這樣的函數(a,i,m)中的'a,i,m'有問題。請參閱http://jquery-howto.blogspot.in/2009/06/ jquery-custom-selectors-with-parameters.html –

3

我用的是分機

$.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'); 

只是想分享,萬一別人運行到這個(,

6

不得不修改納裏曼的解決方案是:

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

否則沒有在Chrome上運行(Linux)

1

如何從一個下拉式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")); - 它會返回下拉

22

的價值要擴大FishBasketGordo的答案。如果您嘗試在大量元素上進行選擇,請先使用:contains()縮小範圍,然後應用過濾器。

這將提高整體速度:

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

所以納尼亞的回答非常有效。然而,在野外使用它,我遇到了一些問題,我預計會發現的事情沒有找到。這是因爲有時在元素的文本週圍會出現隨機的空白區域。我相信,如果你正在尋找「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; 
} 

和二級音符......前後搜索文本後修剪不僅能消除空白。它不會刪除單詞中間的空格。我相信這是可取的行爲,但如果你願意,你可以改變。

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

請給你解釋添加解答。 –

+0

請解釋它... – devpro

+0

第一行選擇與該文本,第二和第三行的任何鏈接你可以做什麼用鏈接來隱藏它們或禁用鏈接看過濾器在jquery文檔http://api.jquery .com/filter/ –

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

我覺得我失去了基於別人的答案,過濾的東西,但爲什麼不直接選擇元素的數組,通過真實「包含」內返回的第一個項目?

只有當您知道第一個鏈接具有您正在查找的完全匹配時,此方法纔有效。其他答案更好地工作,如果你不知道哪個訂購鏈接將被英寸

+0

因爲他並不總是知道他想要的是第一個 – Cameron

+0

問題*特別*問「我只是想要第一個鏈接」。 –

+0

問題要求完全匹配,作者指出瞭解釋哪個元素需要的第一個元素。 – dlopezgonzalez

0

對不起,如果上述任何人的回答,完全匹配

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

編輯(2017年5月22日): -

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