16

背景

从 jQuery 1.9 开始,该.attr(..)方法不再返回属性值,而是我们现在必须使用.prop(..). 不幸的是,这也适用于通过属性选择器指定的属性,即$("input[value=]")

http://jquery.com/upgrade-guide/1.9/#attr-versus-prop-

.attr以及关于和之间差异的良好讨论.prop

.prop() 与 .attr()

我的情况

我目前正在使用选择器,例如$("input[value=]")and$("select[value=]") 来选择没有设置值的输入元素。但是,这不再适用于 jQuery 1.9,而是我现在正在做这样的事情:

var hasValue = function () { return !!($(this).val().length); };
var hasNoValue = function () { return !($(this).val().length); };
$("input").filter(hasValue);
$("select").filter(hasValue);

我的实际选择器要大一些,检查多个元素是否有值,所以现在我必须将我的 1 个选择器字符串拆分为多个选择器,并在其间调用 .filter(..) 方法。

问题

是否有等价于$("[value=]"), $("[value!=]")$("[value='abc']")它使用属性而不是属性?如果没有,有没有比使用.filter(hasValue)and方法更清洁的.filter(hasNoValue)方法?

谢谢

4

3 回答 3

12

使用.filter似乎是唯一的方法,但它并不算太糟糕,你实际上可以通过使用使它更准确一点.val

$(":input").filter(function () { return $(this).val() === ""; });

如果这对你来说真的是应受谴责的,你可以创建一个自定义选择器。

$.expr[':'].emptyInput = function (elem) {
    return $(elem).is(":input") && $(elem).val() === "";
};

http://jsfiddle.net/ExplosionPIlls/zaZPp/

编辑:您也可以使用this.value而不是$(elem).val().

于 2013-03-20T01:00:28.363 回答
1

根据升级指南

但是,当使用像“input[value=abc]”这样的选择器时,它应该始终通过 value 属性进行选择,而不是用户对属性进行的任何更改,例如从他们输入文本输入。从 jQuery 1.9 开始,它的行为正确且一致。早期版本的 jQuery 有时会在应该使用属性时使用该属性。

所以这回答了你的第一个问题 - 没有直接的等价物,关键是使用属性而不是属性。

您的代码看起来不错,但如果您想要更加标准化和可重用,您可以创建一个额外的过滤器。像这样:

(function($) {
    $.expr[':'].hasValue = function(element) {
        var $element = $(element);
        return element.is(':input') && element.val();
    };
}(window.jQuery));

这将允许您选择类似的东西:

// Select input elements with value and select elements without value.
$('input:hasValue,select:not(:hasValue)');

以及您需要的其他各种组合。

于 2013-03-20T01:06:23.693 回答
0

我遇到了这个问题,只是想发布另一个解决方案,我发现它在某些其他建议的解决方案不合适的情况下有效。

只需将此事件处理程序添加到您的代码中

    $('input').on('keyup', function(){  
        var value = $(this).val();
        $(this).attr('value', value);
    });
于 2013-11-21T00:49:45.480 回答