Вы можете использовать :contains()
вместо :has()
:
$("#results a").live("click", function(event){
var seed = $(this).text();
if ($("#seeds:contains(" + seed + ")").length){
alert("already have it");
}
else {
// other code
}
});
Этот параметр проверяет, содержит ли элемент #seeds
текст, который содержит нажатая ссылка.
Если вы хотите найти какие-либо элементы, которые являются потомками элемента #seeds
:
$("#results a").live("click", function(event){
var seed = $(this).text();
if ($("#seeds").find(":contains(" + seed + ")").length){
alert("already have it");
}
else {
// other code
}
});
Вот демоверсия: http://jsfiddle.net/5wE3p/
Обратите внимание, что я проверяю length
возвращенного набора элементов, если элементов нет, возвращается ноль, а оператор if
преобразуется в ложь, если есть какие-либо элементы, он разрешает truthily
.
Также обратите внимание, что :contains()
чувствителен к регистру: http://api.jquery.com/contains-selector/
Side-Note
Если вы используете jQuery 1.4.2 или выше, вы можете использовать .delegate()
вместо .live()
. Основное преимущество .delegate()
заключается в том, что вы можете выбрать свой корневой элемент. Так, если, например, #results
всегда присутствует в DOM, вы можете использовать его в качестве корневого элемента вместо элемента document
(что и делает .live()
):
//it's this easy to change to `.delegate()`
$("#results").delegate("a", "click", function(event){
var seed = $(this).text();
if ($("#seeds").find(":contains(" + seed + ")").length){
alert("already have it");
}
else {
// other code
}
});
Если #results
добавляется в DOM динамически, тогда вы можете найти его родителя и использовать его в качестве корневого элемента (... пока он сохраняется в DOM).
Обновление
Если вы хотите совпадать только с точным текстом ссылки, то вы можете перебирать элементы-потомки элемента #results
и проверять текст каждого элемента:
$("#results a").live("click", function(event){
var seed = $(this).text(),
found = false;
$.each($('#seeds').find('*'), function () {
if ($(this).text() == seed) {
found = true;
}
});
if (found){
alert("already have it");
}
else {
alert('that\'s new');
}
return false;
});
Вот демоверсия: http://jsfiddle.net/5wE3p/1/
Вы также можете использовать RegExp для соответствия значению:
$("#results a").live("click", function(event){
var regexp = new RegExp("^(" + $(this).text() + ")$", "i"),
found = false;
$.each($('#seeds').find('*'), function () {
if ($(this).text().search(regexp) > -1) {
found = true;
}
});
if (found){
alert("already have it");
}
else {
alert('that\'s new');
}
return false;
});
Вот демоверсия: http://jsfiddle.net/5wE3p/2/
Важной частью здесь является создание RegExp: var regexp = new RegExp("^(" + $(this).text() + ")$", "i")
. Обратите внимание на флаг i
, который устанавливает RegExp для поиска без учета регистра. Кроме того, ^
соответствует началу строки, а $
соответствует концу, поэтому посмотрите, будет ли текущий проверяемый текст точно такой же строкой, что и поисковый термин (за исключением того, что он не учитывает регистр). *