【问题标题】:Use JavaScript Objects with jquery ui autocomplete使用带有 jquery ui 自动完成功能的 JavaScript 对象
【发布时间】:2020-10-06 03:00:15
【问题描述】:

我在表单上使用jquery ui autocomplete 来自动完成文本文件中的城市和邮政编码。

文本文件的格式如下:

FR;24108;Bergerac
FR;24109;Bergerac
FR;24110;Léguillac-de-l'Auche
FR;24110;Saint-Léon-sur-l'Isle
FR;24110;Manzac-sur-Vern

自动完成功能适用于相应的字段,但我希望用户选择邮政编码以自动填写字段城市中的城市。

这就是它不起作用的地方。我试图用标签/值创建一个对象:

autoCompleteData.push({cp: values[1]+'', city: values[2] + ''})

如果我执行console.log(),我可以看到我的对象,但我很难使用它来响应 jquery ui 自动完成所需的响应。我已经看到了一些基于 json 响应的示例,但我不知道如何使其适应我的需要。我也尝试将我的对象转换为 json 但不起作用。

你能解释一下怎么做吗?

这是我的工作代码

 $.ajax({
                url: "path-to-file/ZipCodes.txt?id=1",
                dataType: "text",
                success: function (data) {
                    var autoCompleteData = data.split('\n');
                    var lines = data.split(/\r\n|\n/);

                    //Set up the data arrays
                    var autoCompleteData = Array();
                    for (var j = 0; j < lines.length; j++) {
                        var values = lines[j].split(';'); // Split up the comma seperated values
                        //postcodes.push(values[1], values[2]);
                        autoCompleteData.push(values[1] + '');
                        //autoCompleteData.push({cp: values[1], city: values[2] + ''});
//console.log(autoCompleteData[0][1]);
                $("#edit-code-postal").autocomplete({
                    source: function (request, response) {
                        var results =     $.ui.autocomplete.filter(autoCompleteData, request.term);
                        response(results.slice(0, 10)); // Display the first 10 results
                    },
                    // We fill the city field
                    select: function (event, ui) {
                        // here I need help to use my object
                    }

                });
            }
        });

还有一个没有 Ajax 的工作 sn-p,因为我无法在 SO 上加载我的文件。我只是使用一个数组:

$(document).ready(function() {
  var data = [
    "FR;24001;Périgueux",
    "FR;24002;Périgueux",
    "FR;24100;Saint-Laurent-des-Vignes",
    "FR;24100;Lembras",
    "FR;24100;Bergerac"
  ];
  //var autoCompleteData = data.split('\n');
  var lines = data;

  //Set up the data arrays
  var data1 = [];
  var data2 = [];
  var data3 = [];
  var autoCompleteData = Array();

  //var headings = lines[0].split(';'); // Splice up the first row to get the headings

  for (var j = 0; j < lines.length; j++) {
    var values = lines[j].split(';'); // Split up the comma seperated values

    //postcodes.push(values[1], values[2]);
    autoCompleteData.push(values[1] + '');
    //autoCompleteData.push({cp: values[1], city: values[2] + ''});

  }

  //console.log(autoCompleteData[0][1]);
  $("#edit-code-postal").autocomplete({
    source: function(request, response) {
      var results = $.ui.autocomplete.filter(autoCompleteData, request.term);
      response(results.slice(0, 10)); // Display the first 10 results
    },
    // On remplit aussi la ville
    select: function(event, ui) {
      $('#edit-ville').val(ui.item.city);
    }

  });
});
<!doctype html>
<html lang="en">

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>jQuery UI Autocomplete</title>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
  <script src="https://code.jquery.com/ui/1.12.0/jquery-ui.min.js"></script>
</head>

<body>

  <div class="ui-widget">
    <label for="tags">Postal code (try "24...": </label>
    <input id="edit-code-postal">
    <label for="tags">City: </label>
    <input id="edit-ville">
  </div>


</body>

</html>
                    }
                    //console.log(autoCompleteData[0][1]);
                    $("#edit-code-postal").autocomplete({
                        source: function (request, response) {
                            var results = $.ui.autocomplete.filter(autoCompleteData, request.term);
                            response(results.slice(0, 10)); // Display the first 10 results
                        },
                        // On remplit aussi la ville
                        select: function (event, ui) {
                            $('#edit-ville').val(ui.item.city);
                        }

                    });
                }
            });

【问题讨论】:

    标签: javascript jquery jquery-ui autocomplete


    【解决方案1】:

    您可以在autoCompleteData 中推送两个值,其中一个是label,我们将使用它来搜索输入字段值和其他任何变量,即:在下面的代码中,我使用了data: values[2],然后我们得到这个值并应用使用$('#edit-ville').val(ui.item.data); 到您的文本框

    演示代码

    $(document).ready(function() {
      var data = [
        "FR;24001;Périgueux",
        "FR;24002;Périgueux",
        "FR;24100;Saint-Laurent-des-Vignes",
        "FR;24100;Lembras",
        "FR;24100;Bergerac"
      ];
      //var autoCompleteData = data.split('\n');
      var lines = data;
    
      //Set up the data arrays
      var autoCompleteData = Array();
    
      for (var j = 0; j < lines.length; j++) {
        var values = lines[j].split(';'); // Split up the comma seperated values
        autoCompleteData.push({
          label: values[1],
          data: values[2] 
        });
    
      }
    
      //console.log(autoCompleteData[0][1]);
      $("#edit-code-postal").autocomplete({
        source: function(request, response) {
          var results = $.ui.autocomplete.filter(autoCompleteData, request.term);
          response(results.slice(0, 10)); // Display the first 10 results
        },
        // On remplit aussi la ville
        select: function(event, ui) {
          $('#edit-ville').val(ui.item.data);//setting value in textfield
        }
    
      });
    });
    <!doctype html>
    <html lang="en">
    
    <head>
      <meta charset="utf-8">
      <meta name="viewport" content="width=device-width, initial-scale=1">
      <title>jQuery UI Autocomplete</title>
      <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
      <script src="https://code.jquery.com/ui/1.12.0/jquery-ui.min.js"></script>
    </head>
    
    <body>
    
      <div class="ui-widget">
        <label for="tags">Postal code (try "24...": </label>
        <input id="edit-code-postal">
        <label for="tags">City: </label>
        <input id="edit-ville">
      </div>
    
    
    </body>
    
    </html>

    【讨论】:

    • 太棒了。我主要是一名 PHP 开发人员,我不完全了解 ui.item.data$('#edit-ville').val(ui.item.data); 中的工作原理你能解释一下吗?我认为这对我来说是个问题。
    • 自动完成将在您搜索时使用labelvalue 显示结果,因此如果您不提供此内容,它将不会在您的搜索文本框中显示任何内容。在您当前的代码中,您使用cp: values[1] 无法被自动完成识别。这就是它不起作用的原因。另请阅读this
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 2019-09-21
    • 1970-01-01
    • 2011-11-03
    • 1970-01-01
    相关资源
    最近更新 更多