4

私は自分のウェブサイトのライブ検索結果機能を実行しています。入力の値と一致させたい重要な用語を含むJSONオブジェクトがあります。

これについて私が考えることができる最善の解決策は、ループ内の各用語を反復処理し、jQueryセレクターで部分的に一致するものを探すことでした。このようなifステートメントを作成するにはどうすればよいですか?例えば:

$.getJSON('jsonfile.json', function(data) {
    key = Object.keys(data);
    for(i=0;i<key.length;i++)
    {
        if($(input[value]:contains == key[i].term)
        {
            //do something
        }
    }
} 

編集:不明確であるための私の謝罪。1つの入力の値を部分的に一致させるために:containsセレクターを使用しています。

4

2 に答える 2

3

:containsセレクターを文字列として作成する必要があります。

if($('input[value]:contains("' + key[i].term + '")').length) {
    //do something
}

セレクターは、入力に用語が含まれているすべての要素を返します。追加.lengthすると、ifステートメントを評価するための簡単な「真の」値が提供されます(0個のアイテムが返される== "false"、>0個のアイテムが返される=="true")。

編集:入力要素でinput[value]:contains()どのテキストが表示されるかわからないため、が有効なjQueryセレクターであるかどうかはわかりません。各入力の:contains()を自分でチェックすることで、少し手伝う必要があるかもしれません。見つかった入力を、検索対象の用語が値に含まれている入力にフィルターすることができます。

if ($('input[value]').filter(function() {
        return $(this).val().indexOf(key[i].term) != -1;
    }).length) {
    //do something
}
于 2012-09-15T22:28:05.373 に答える
2

アイテムが非常に少ない場合(たとえば、数十個)にできることの1つは、それらのいずれかに一致する正規表現を作成することです。

var match = keys.join("|")
var regexp = RegExp.new(match, 'i') // Case insensitive
if($(input).val().match(regexp)) {
    // do stuff
}

はい、これは用語に一致する入力を検索しないこと知っています。入力要素を事前に知っている必要がありますが、あなたの質問から、単一の入力要素をチェックしたいと思います。

すべての用語をループして1つずつチェックするよりも速いかどうかはわかりませんが、そうだと思います。間違いなく読みやすくなっています。

grepこれは、jQueryまたはeachメソッドと組み合わせて使用​​できます。

var match = keys.join("|")
var regexp = RegExp.new(match, 'i')

// With grep
var matches = $('input').grep(function(elem, idx) {
    return $(input).val().match(regexp) != null;
})

// Or with each
$('input')..each(function(idx, elem) {
    if ($(input).val().match(regexp) != null) {
        // Do stuff
    }
});

grep、後で使用するために検索語のいずれかに一致するすべての入力フィールドを選択し、eachすべての要素を繰り返してすぐに操作します。

于 2012-09-15T22:38:16.973 に答える