2013-03-20 220 views
16

背景的jQuery 1.9.1属性选择

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

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

和上.attr.prop之间的差别好,所以讨论:

.prop() vs .attr()

我的情况

我目前使用类似$("input[value=]")$("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).filter(hasNoValue)方法更清洁的方法?

感谢

+0

看起来很干净,我 - 而且可能比以前的更好的解决方案(如以前的解决办法只能从值集工作时,DOM被初始化,并且你当前的解决方案考虑是否有用户输入) – ahren 2013-03-20 00:48:44

+0

不应该是'[value]'而不是'[value =]'?或者两者都工作? – 2013-03-20 00:48:46

+0

对我来说工作得很好 - > [** FIDDLE **](http://jsfiddle.net/ssPku/),它应该是'[value =“”]',只要'[value]'会选择任何具有值属性的元素。 – adeneo 2013-03-20 00:54:14

回答

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()脱身。

+0

是的,自定义表达正是我所追求的。这只是一个偏好,但我认为对于下一个编码器来说,单个表达式比如'$(“input:emptyInput”)'更容易理解。谢谢。 – Walter 2013-03-20 12:39:17

1

按照upgrade guide

然而,当像选择“输入[值= ABC]”时,它应该总是由值属性选择并没有任何变化通过给属性取得用户,例如从他们输入文字输入。从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)'); 

而且你需要其他的各种组合。

+0

我在升级指南中阅读了该段落,但它让我感到沮丧,因为它没有为这种确切情况提供替代方案。我希望得到一些像'$(“input {value = abc}”)''等同的属性语法。但是定义我自己的表达同样好。 +1为我以后的相同答案。 – Walter 2013-03-20 12:44:26

0

我碰到过这个,只是想发布另一个解决方案,我发现它适用于某些其他建议的解决方案不合适的情况。

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

$('input').on('keyup', function(){ 
     var value = $(this).val(); 
     $(this).attr('value', value); 
    });