16

バックグラウンド

jQuery 1.9 以降、この.attr(..)メソッドはプロパティ値を返さなくなり、代わりに を使用する必要があります.prop(..)。残念ながら、これは属性セレクターを介して指定された属性にも適用されます。$("input[value=]")

http://jquery.com/upgrade-guide/1.9/#attr-versus-prop-を参照してください 。

.attrとの違いに関する適切な SO ディスカッション.prop:

.prop() と .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!=]")に相当するものはありますか? そうでない場合、 andメソッド$("[value='abc']")を使用するよりもクリーンな方法はありますか?.filter(hasValue).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 に答える