2013-03-20 186 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); 
    });