2016-10-04 10 views
1

Я хотел бы найти селектор jquery для ярлыка с определенным контентом.jquery selector для содержимого ярлыков

Так со следующим HTML

<label for="foo1">Name</label> 
<input type="text" name="foo1" id="foo1" value="Fadime"/> 

<label for="foo2">SecondName</label> 
<input type="text" name="foo2" id="foo2" value="Alice"/> 

Я хочу, чтобы иметь возможность получить содержание «Fadime» путем доступа к нему через содержание этикетки предшествующему. Я не хочу использовать имя ввода или идентификатор, так как они автогенерируются и могут меняться. Содержание метки, хотя и останется прежним. Для второго имени, которое я знаю, что могу использовать:

var second_name = $("label:contains('SecondName')").next().val(); 

Однако, я не могу получить содержимое первого имени с:

var name = $("label:contains('Name')").next().val(); 

так, что будет соответствовать обе метки (так как оба содержат " Имя").

Есть ли какие-равно-метод или StartsWith, так что я мог бы использовать

var name = $("label:equals('Name')").next().val(); 

Спасибо заранее!

+1

Работы, как ожидается, здесь: https://jsfiddle.net/x8etc6yq/ Что ваша проблема ??? –

+1

Теперь, если вы хотите точное совпадение, вам нужно отфильтровать его: https://jsfiddle.net/x8etc6yq/1/ –

+0

Если вам нужно точное совпадение, просто используйте '$ (this) .text(). Trim() = = "Name" 'в условии. –

ответ

0

:contains Используется для элементов. Не для текста. Вы должны использовать .filter():

$(function() { 
 
    $("label").filter(function() { 
 
    return $(this).text().indexOf("SecondName") > -1; 
 
    }).next("input").val("Ha ha ha!"); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<label for="foo1">Name</label> 
 
<input type="text" name="foo1" id="foo1" value="Fadime"/> 
 

 
<label for="foo2">SecondName</label> 
 
<input type="text" name="foo2" id="foo2" value="Alice"/>

Получение второе имя выводимой на консоль:

$(function() { 
 
    console.log(
 
    $("label").filter(function() { 
 
     return $(this).text().indexOf("SecondName") > -1; 
 
    }).next("input").val() 
 
); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<label for="foo1">Name</label> 
 
<input type="text" name="foo1" id="foo1" value="Fadime" /> 
 

 
<label for="foo2">SecondName</label> 
 
<input type="text" name="foo2" id="foo2" value="Alice" />

+0

Отлично! Это сработало отлично. Фильтр сделал трюк –

+0

@ SamuelSkånberg Если вам нужно точное совпадение, просто используйте '$ (this) .text(). Trim() ==" Name "' в этом состоянии. –

0

$(function() { 
 
    $("label").filter(function() { 
 
    return $(this).text()=="Name" 
 
    }).next("input").val("Ha ha ha!"); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<label for="foo1">Name</label> 
 
<input type="text" name="foo1" id="foo1" value="Fadime"/> 
 

 
<label for="foo2">SecondName</label> 
 
<input type="text" name="foo2" id="foo2" value="Alice"/>

+1

'first()' прикованный к 'next()' избыточен, поскольку 'next()' возвращает только первый следующий sibling –

+0

Это неверно: https://jsfiddle.net/sg8Lq2Lm/ См. [Next() DOC] (https: //api.jquery.com/next/) –

+0

@ A.Wolff Да, я ошибаюсь, он работает с out первым(), когда я меняю $ (this) .text(). indexOf ("Name")> -1 it to $ (this) .text() == "Имя" – manu

1

Нужно ли вам использовать текст, содержащий фильтр, потому что вы можете получить соответствующий текст метки без него, используя нижеприведенный код. Пожалуйста, проверьте его

$(document).ready(function() { 
 
    $('label').click(function() { 
 
    \t $id = $(this).attr('for'); 
 
    console.log($('#'+$id).val()); 
 
    }); 
 
});