Автозаполнение для циклического поиска по условиям поиска с результатами обратного вызова ajax - PullRequest
0 голосов
/ 10 июля 2019

Я настраиваю форму автозаполнения, в которой мне нужно, чтобы каждое ключевое слово / термин соответствовал.

Я использую обратный вызов ajax, чтобы получить список результатов, и я пробовал много обходных путей для преобразования результатов json в массив с поддержкой автозаполнения, но я не смог заставить его работать.


        $(this).autocomplete({
            source: function (request, response) {
            $.ajax({
                 url: 'autocomplete.php',
                 data: request.term,
                 dataType: "json",
                 success: function (data) { 
                    var dataArray = [];

                    for(var i in data)
                        dataArray.push(data[i]);

                    var matchArray = dataArray.slice();
                    var srchTerms   = $.trim (request.term).split (/\s+/);
                    $.each (srchTerms, function (J, term) {
                        var regX    = new RegExp (term, "i");
                        matchArray   = $.map (matchArray, function (item) {
                            return regX.test (item)  ?  item  : null; 
                        } );
                    } );

                    response(matchArray);

                 },
                 error: function () {
                     response([]);
                 }
             });
            },
            autoFocus: true
         });

Я думаю, что сам код работает, потому что если я нажимаю на обычный массив javascript, он работает просто отлично, но пока я получаю результаты из ajax и преобразовываю его в массив javascript, он больше не работает.

То, что я пытаюсь получить, - то, что, если данные результаты равны «примеру заголовка книги», он должен появиться, даже если мои ключевые слова - «пример заголовка» или «пример книги заголовка» и т. Д. *

1 Ответ

0 голосов
/ 11 июля 2019

Исходя из вашего описания, если пользователь вводит несколько слов, вы хотите, чтобы он показывал результаты для каждого из поисков для каждого из этих слов.Например, если пользователь вводит «горячий воздух», результаты будут включать все результаты для «горячего воздуха» и все результаты для «горячего воздуха».

Рассмотрим следующий пример.

$(function() {
  var availableTags = [
    "win the day",
    "win the heart of",
    "win the heart of someone"
  ];

  $("#tags").autocomplete({
    source: function(req, resp) {
      // Trim Query and split by " " (Space)
      var srchTerms = req.term.trim().split(" ");
      // Prepare result Arrays
      var results = [],
        uniqueResults = [];
      // Iterate each search term and combine the results into one array
      $.each(srchTerms, function(i, t) {
        results = results.concat($.ui.autocomplete.filter(availableTags, t));
      });
      // Remove duplicates by iterating each result item
      $.each(results, function(i, r) {
        if ($.inArray(r, uniqueResults) === -1) uniqueResults.push(r);
      });
      // Send back to Autocomplete
      resp(uniqueResults);
    }
  });
});
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<link rel="stylesheet" href="/resources/demos/style.css">
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<div class="demo">
  <div class="ui-widget">
    <label for="tags">Multi-word search: </label>
    <input id="tags">
  </div>
</div>

Если пользователь введет «win» или «win», он все равно попадет в исходные данные.Если пользователь вводит «win heart», он фильтрует исходные данные для обоих терминов по отдельности, объединяя все результаты в один массив.Там, скорее всего, будут дубликаты.На этих этапах мы можем отфильтровать эти дубликаты и отправить полученный массив обратно.

В вашем коде вы захотите отправлять каждый поисковый запрос в PHP, который должен возвращать массив или массив объектов.Таким же образом вы соберете все результаты в один массив и затем отфильтруете.

В качестве альтернативы вы можете выполнить всю работу на стороне PHP, отправить весь кусок в PHP и заставить его выполнять поиск ифильтрация (возможно, быстрее) и возврат всех результатов.

Обновление

Если все, что вы хотите сделать, это получить массив через ajax, просмотрите следующее:

function (request, response) {
  $.getJSON("autocomplete.php", {term: request.term}, function(data){
    var matchArray = [];
    $.each(data, function(key, val){
      matchArray.push(val);
    });
    var srchTerms = $.trim(request.term).split(/\s+/);

    $.each (srchTerms, function (J, term) {
      var regX = new RegExp (term, "i");
      matchArray = $.map (matchArray, function (item) {
        return (regX.test(item) ?  item : null);
      });
    });
    response (matchArray);
  });
}

Предполагается, что PHP вернет данные JSON, представляющие собой массив результатов.Поскольку вы не предоставили ни пример результатов, ни фрагмент своего PHP, трудно помочь в дальнейшем.

Надеюсь, это поможет.

...