2013-03-19 2 views
0

Как я мог бы создать селектор для использования с .is() функции в JQuery, который представляет следующие выражения:JQuery селектор для пустого значения

$('[name="Person[firstName]"]').val() === ''; // true 
$('[name="Person[lastName]"]').val() === ''; // false 

С этой HTML контексте

<input name="Person[firstName]" value="" > 
    <foo bar="true" /> 
</input> 

<input name="Person[lastName]" value="ABCDEFGH" /> 

: пусто Selector Выберите все элементы, у которых нет детей (включая текстовые узлы).

$('[name="Person[firstName]"]').is(':empty'); // false 
$('[name="Person[lastName]"]').is(':empty'); // true 

Другие попробовать

$('[name="Person[firstName]"]').is('[value=""]'); // true 
$('[name="Person[lastName]"]').is('[value=""]'); // true 

Примечание: Это вопрос для целей знания - и .() должны быть использованы в этом растворе.

@edithttp://jsfiddle.net/2CzWu/2/

Она должна возвращать ложь в обоих выражениях

+1

Это не главное. Это всего лишь пример, чтобы избегать подобных пользователей: http://api.jquery.com/empty-selector/ –

+1

@Allyson, * и '.is()' должны использоваться в этом решении. * Почему? Использование 'is()' кажется контрпродуктивным для результатов, которые вы хотите достичь. –

+2

Ваше утверждение, что '$ ('[name =" Person [lastName] "]'). Is ('[value =" "]')' возвращает 'true', похоже, не так. Код в этом блоке, похоже, работает так, как ожидалось для меня. http://jsfiddle.net/2CzWu/1/ –

ответ

5

Причины :empty не работает потому, что она ищет узлы без дочерних узлов, которые не то, что вы ищете.

$.is("[value='']") будет работать только со значениями, которые были установлены вначале HTML, а не при обновлении его через сценарий или пользовательский интерфейс. Это связано с тем, что селектор атрибутов смотрит на Node.getAttribute('value') === ''and the XML attribute is not updated when the DOM object is, но свойство DOM HTMLInputElement.value делает.

So what we really need is a custom pseudo selector that looks at the value DOM property и it's pretty simple to implement. Он работает с $.is и с :not()

$.expr[':'].emptyVal = function(obj){ 
    return obj.value === ''; 
}; 

var $firstName = $('[name="Person[firstName]"]'); 

$firstName.val('AAAA'); 

$('input:emptyVal').size(); // 2 
$('input:not(emptyVal)').size(); // 0 
$firstName.is('input:emptyVal'); // false 
$firstName.is('input:not(:emptyVal)'); // true 
+0

Да, я пропустил опечатку по моему проекту :( –

+0

Возможно, это действительно неправильно. Когда я отредактировал firstName и выполнил этот код, результат не прав –

+0

http://jsfiddle.net/2CzWu/2/ –

Смежные вопросы