2016-08-22 21 views
0

コードの説明は次のとおりです。ここでオートコンプリートでサーバーの結果が表示されない場合があります

は、私が使用しています(私は3つの他のオートコンプリートパッケージを検討してきたが、それらはすべて同じように動作)オートコンプリートです:

https://goodies.pixabay.com/javascript/auto-complete/demo.html

そして、ここでは、私が上でそれを使用しています方法ですクライアント側(ユーザーが検索ボックスに入力すると、私は私のオートコンプリートを更新できるように、私は socket.io と連動してオートコンプリートを使用していますことに注意してください):

socket.on('searchBarResults', function(data) { 

var my_autoComplete = new autoComplete({ 
    selector: 'input[name="searchbar4"]', 
    minChars: 1, 
    cache: false, 
    source: function(term, suggest){ 
     term = term.toLowerCase(); 
     var choices = [ 
      data[0]._source.movie 
     ]; 
     var matches = []; 
     for (i=0; i<choices.length; i++) 
      if (~choices[i].toLowerCase().indexOf(term)) matches.push(choices[i]); 
     suggest(matches); 
    } 
}); 

    $searchBar4.on('input', function(event){ 
     my_autoComplete.destroy(); 
    }); 
}); 

ので、ここではどのようなすべてのですユーザーがムービーの名前の入力を開始すると、入力されたすべての単語の後にサーバーは一致するかどうかデータベースを検索し、その結果をクライアントに送信します。例えば

:ユーザーがスターを検索した場合、サーバーはバックスタートレック未知の世界送信し、検索ボックスには、スタートレック未知の世界呼ばオートコンプリートオプションが表示されます。

これはうまくいっています。

ユーザーの種類スタートレック場合サーバは、再び、スタートレック未知の世界を返送し、オートコンプリートが更新されます。それはいいです。ここで

は、私が持っている問題である:ユーザーがタイプスター国場合

、サーバーバックスター・トレック未知の世界、しかしはそれを表示しませんオートコンプリートを送信します。

オートコンプリートは、の単語がの場合にのみ結果を表示します(単語はスキップできません)。

オートコンプリートをにするにはどうすればいいですか?は、ユーザーが検索ボックスにどのような順序で単語を入力しても、サーバーからの結果を表示しますか?

答えて

1

問題は、あなたの中にある:

if (~choices[i].toLowerCase().indexOf(term)) matches.push(choices[i]); 

という用語に一致しないすべての項目を削除します。

"Star Trek Undiscovered Country".toLowerCase().indexOf("Star Country")

それは-1を返します、それはその文字列全体を含んでいないからです。あなたは単語に分割し、それらを一つずつ比較する必要があります。

var match = function(term, suggest){ 
 
     term = term.toLowerCase(); 
 

 
     // for debugging. 
 
     var choices = new Array(); 
 
     choices.push('Star Trek Undiscovered Country'); 
 

 
     var matches = []; 
 
     for (i=0; i<choices.length; i++) 
 
     { 
 
      var allMatches = true; 
 
      var words = term.split(' '); // Split into words and check them individually. 
 

 
      //TODO: Possibly handle case when there is only one word. 
 

 
      for(var y = 0; y<words.length; y++) 
 
      { 
 
       // Check if this word is in choices[i]. 
 
       if (choices[i].toLowerCase().indexOf(words[y]) == -1) 
 
       { 
 
        // Not a match. 
 
        allMatches = false; 
 
        // Possibly continue when allMatches == false, since the following words doesn't matter. 
 
       } 
 
      } 
 
      if(allMatches) 
 
      { 
 
       matches.push(choices[i]); 
 
      } 
 
     } 
 
     suggest(matches); 
 
    } 
 

 
var suggest = function(item){ 
 
    console.log(item); 
 
}; 
 
match('Star Country', suggest); // Returns one item. 
 
match('Star Blaster', suggest); // Returns no items.
また

、常に1つの項目の配列になりますchoicesと思わ:あなたはこのような何かを行うことができるはず

?なぜあなたはそれのための配列を使用していますか?

+0

動作していないようです。具体的には、 'indexOf(word)== -1'に関して、'(word) 'の使用について言及しています:*予期しない(カスタム/継承した)メンバに対する可能な反復、おそらくhasOwnPropery ... * – MonkeyOnARock

+0

'indexOf(word)== -1'を' indexOf(word)== 0'に変更すると、最初は動作しているようです。 ** Star Country **と入力すれば、** Star Trek Undiscovered Country **の結果が得られます。私はより多くのテストを行い、後で確認するつもりです。 – MonkeyOnARock

+0

ええ、間違っていました。私は、動作するスニペットでコードを更新しました。 – smoksnes

関連する問題