0

如何.is()在 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" />

:empty 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

注意:这是一个用于知识目的的问题 - 并且.is()必须在此解决方案中使用。

@edit http://jsfiddle.net/2CzWu/2/

它必须在两个表达式上都返回 false

4

1 回答 1

5

原因:empty不起作用是因为它正在寻找没有子节点的节点,这不是您要寻找的。

$.is("[value='']")仅适用于最初在 HTML 中设置的值,而不是通过脚本或 UI 更新它。那是因为当 DOM 对象是 时,属性选择器会查看Node.getAttribute('value') === '' 并且 XML 属性不会更新,但 DOM 属性HTMLInputElement.value会。

所以我们真正需要的是一个自定义的伪选择器,它查看 DOM 属性的值,并且实现起来非常简单。它适用于$.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
于 2013-03-20T00:01:07.840 回答