2016-08-22 70 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.

而且,它似乎choices將永遠伴隨着1項數組?爲什麼你使用一個數組呢?

+0

它似乎沒有工作。具體來說,關於'indexOf(word)== -1',它是關於使用'(word)'的說法:*可能對意外(定製/繼承)成員進行迭代,可能缺少hasOwnPropery ... * – MonkeyOnARock

+0

好吧,我改變了'indexOf(word)== -1'到'indexOf(word)== 0',它最初似乎正在工作。如果我輸入** Star Country **,我現在可以獲得完整的** Star Trek未發現國家**結果。我將進行更多測試並稍後確認。 – MonkeyOnARock

+0

是的,這是錯的。我已經使用工作片段更新了代碼。 – smoksnes

相關問題