【问题标题】:How to properly implement a form that is using the jQuery UI autocomplete widget?如何正确实现使用 jQuery UI 自动完成小部件的表单?
【发布时间】:2012-11-05 15:16:41
【问题描述】:

我正在使用 Ruby on Rails 3.2.2 和 jquery-rails 2.1.3(包括 jQuery UI)。我正在尝试实现一个 HTML 表单,以便使用 Autocomplete jQuery UI 小部件搜索、选择和提交城市数据。

此时我正在使用以下“自动完成”字段来实现我的表单:

<div class="ui-widget">
  <label for="cities">City: </label>
  <input id="cities" />
</div>

<script>
  $jQ(function() {
    var cache = {};
    $jQ( "#cities" ).autocomplete({
      autoFocus: true,
      minLength: 3,
      source:    function( request, response ) {
        $jQ.ajax({
            url:      '<SEARCH_PATH>',
            data:     { search: request.term },
            dataType: 'json',
            success:  function(data) {
              var cities = new Array();

              $jQ.each(data, function(arrayID, city) {
                cities.push({ label: city.name, value: city.id })
              });

              response( cities ); 
            },
            error:    function () {
              response([]);
            }
        });
      }
    });
  });
</script>

上述代码按预期工作,用于检索 JSON 数据并显示检索到的城市列表。如您所见,城市数据的“有用部分”是城市的id,因为我使用id 值来在内部处理提交的数据。但是,鉴于显示了“可选”城市列表,当我使用键盘向上和向下箭头来选择其中一个城市时,输入字段将填充城市id(而不是城市name) .

我想:

  • 在选择城市的输入字段中显示城市name 而不是id
  • 想办法提交城市id而不是城市name(即使城市name是前端内容中唯一显示的东西)。

我应该如何/应该如何正确地做到这一点?

【问题讨论】:

  • 不是很清楚,但听起来好像你想要自动完成的默认功能。
  • @Kevin B - 我不这么认为,因为 例如,与“自动完成”小部件的 select 事件相关的默认功能“是替换文本字段的值与所选项目的值”。在这种情况下,正如我在问题中所写,我想在选择城市的输入字段中显示城市 namelabel)而不是 idvalue)。跨度>
  • 这似乎对我有用,在这个小提琴中,输入 f 并选择 foo,bar 出现在输入中。 jsfiddle.net/f8yPX
  • @Kevin B - 您的链接代码不是我正在寻找的。但是,考虑到您的情况,我希望 仍然显示 foo 标签(在选择 foo 时)但 提交 bar 值,当我提交相关形式。
  • 在选择时,使用您想要的值填充隐藏输入并提交隐藏输入而不是自动完成。

标签: javascript jquery ruby-on-rails ruby jquery-ui


【解决方案1】:

使用 select 事件填充隐藏字段,然后提交隐藏字段。

<div class="ui-widget">
  <label for="cities">City: </label>
  <input id="cities" />
  <input name="cities" type="hidden" id="cities-hidden" />
</div>

js

$jQ(function() {
  var cache = {};
  $jQ( "#cities" ).autocomplete({
    autoFocus: true,
    ...
    select: function(e, ui) {
      $("#cities-hidden").val(ui.item.value); // populate hidden input
      $("#cities").val(ui.item.label); // populate autocomplete input
      return false; // prevent default action of populating autocomplete input with value
    }
  });
});

演示:http://jsfiddle.net/f8yPX/3/

【讨论】:

  • 今天的语法高亮怎么了?
  • 您的代码似乎可以正常工作,但是“今天的语法高亮是怎么回事”是什么意思?
  • 由于某种原因,它错误地突出显示了代码,即使代码在语法上是有效的。与问题无关。
  • 在选择值时存在一个微妙(可见)的问题:当您在自动完成字段中使用向上/向下键盘箭头时,它会显示所选项目的 value,直到我不选择明确的项目。它应该始终显示为label(而不是value)。也就是说,最终用户永远不会看到value
  • 抱歉,但我仍然不明白您所说的“它由于某种原因错误地突出显示代码,即使代码在语法上是有效的”。
猜你喜欢
  • 2012-03-28
  • 1970-01-01
  • 2011-04-11
  • 2011-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-08
相关资源
最近更新 更多