2012-01-04 3 views
2

http://jsfiddle.net/nicktheandroid/QhL2M/ を報告し、真の報告はない:各liは、その中のタグの単語ユーザーの種類が含まれていますinputボックス内のこれらのタグワードの1つは、そのタグワードを含まないliのすべてを非表示にします。liのタグワードがいずれかのワードに一致すると、複数のワードがinputに入力されます。 inputの中に表示されていますので、基本的に複数の単語を許可するフィルタリングされたリストです。一致する単語はすべてliですinput。部分的な単語ではなく、単語全体にのみ一致し、別の単語全体が一致した場合(複数の単語の場合)、一致のリストを更新する必要があります。これが目標です。コードのこの部分が正しく報告されている間ではなく、スクリプトの</p> <p>目的(入力ボックス "にタイプ「BYE」)は、すべての偽

if (matches == true) { 
    alert('matched true') //incorrectly reports 
} else { 
    alert('matched false') //incorrectly reports 
} 

if (regex.test($(this).text()) === true) { 
    matches = true; 
    // alert('tis true') //correctly reports 
} else { 
     matches = false; 
     // alert('tis false') //correctly reports 
} 

なぜそれが正しく報告されていません

私の問題は、誤ったコードのこの作品で試合があることを報告していますということです? (正確には:私が報告したいもの)

私は何をしようとしているかを知るためにJavascriptで十分な人がいて、助けてくれる方法を知っていれば、それは素晴らしいでしょう。私はこれを通って自分のやり方を変えようとしています。なぜなら、いくつかの変更が残っているからです。

+0

グローバル変数に一致しますか?上書きすることができます。あなたは、正規表現の後にデバッガーの文を入れてみて、一致の値を調べたことがありますか? – sissonb

答えて

2

私はこの問題は、あなたとリスト項目のすべてをループしているということだと思います各繰り返しの中で、単語リストをループします。

$.each(inputWords, function(i, a_filter) { 

その後、インナーループで再度ですべてのli要素を処理:それでは、内側部分には、あなたがちょうどあなたが扱っているかについて混乱して取得している

var containing = $('#list li').filter(function() { 

。私はあなたがする必要があると思うのは、各要素をループし、入力単語リストに一致するものがあるかどうかをテストし、適切な要素を隠すか表示することです。このような何か:

var inputWords = inputValue.toLowerCase().split(/[\s,]+/); 

$("#list li").each(function() { 
    var matches = false, 
     $currentElement = $(this); 

    $.each(inputWords, function(i, a_filter) { 
     if ($.trim(a_filter)==="") return; // skip blank items 

     var regex = new RegExp('\\b(' + a_filter + ')(s|es|\'s)?\\b', 'i'); 
     if (regex.test($currentElement.text())) { 
      matches = true; 
      return false; // return false breaks out of the $.each 
          // (no need to continue once a match is found) 
     } 
    }); 

    if (matches) 
     $currentElement.slideDown(400); 
    else 
     $currentElement.slideUp(); 
}); 

の作業のデモ:http://jsfiddle.net/QhL2M/19/

EDIT:また、あなたが入力語リストを分割された方法が私のために動作しませんでした:

var inputWords = $('.filterinput').text().toLowerCase().split(/[\s,]+/); 
// I've changed that to 
var inputWords = inputValue.toLowerCase().split(/[\s,]+/); 

あなたはしたくありません入力に.text()を使用し、いずれの場合もinputValueは、その入力のテキストを保持するために既に初期化されています。上記の私のコードとデモが更新されました。

+0

あなたは素晴らしいですよ。あなたは実際に私を理解し、何をすべきか正確に知っていました。美しいです。私が気づいたことの1つは、最初の単語の後にスペースやカンマを打ってから、リスト全体が再び表示されるということです。私は試合で李のことだけを表示し続けることはできません。だから、新しいliがマッチするか、単語の単語/文字が削除されたとき(その単語がもはやマッチしなくなる)、ユーザーはリストanimate/show/hideだけを見ます。 –

+0

私はちょっと(更新されたフィドルへのリンクを含む)私の答えを少し更新しました。問題は、スペースまたはコンマが最後の項目であるときに入力を分割したとき(または行内に複数の空白またはコンマを入力したとき)にinputWords配列の空の文字列で終わったため、空文字列の周りに形成された正規表現がリストアイテム。だから、現在の項目が空白のときに、 '$ .trim(a_filter)===" ")return;'という行を追加して '$。each'の次の繰り返しにスキップします。 – nnnnnn

+0

ああ、私がそれをしている間、正規表現の宣言を大文字と小文字を区別しないように変更しました。更新されたフィドルを試してみてください。 – nnnnnn

0

これはあなたが(jsFiddle example)を達成しようとするものであれば、私に教えてください:

$("#list li").each(function() { 

(function($) { 
    function fiKeyup() { 
     var inputValue = $(this).val(); 
     if (inputValue.length > 2) { 
      var inputWords = inputValue.split(/[\s,]+/ig); 
      var containing = $('#list li').filter(function() { 
       var ret = false; 
       var text = $(this).text().toLowerCase(); 
       $.each(inputWords, function(i, a_filter) { 
        var regex = new RegExp('\\b(' + a_filter + ')(s|es|\'s)?\\b'); 
        if(regex.test(text)) { 
         return !(ret = true); 
        } 
       }); 
       return ret; 
      }); 

      $('#list li').not(containing).slideUp(); 
     } else { 
      $('#list li').slideDown(); 
     } 
     return false; 
    }; 
    var timeout; 

    $('.filterInput').keyup(function() { 
     var that = this; 
     clearTimeout(timeout); 
     timeout = setTimeout(function() { 
      fiKeyup.call(that); 
     }, 500); 
    }); 

}(jQuery)); 
関連する問題