【问题标题】:Jquery Autocomplete not working correctlyJquery 自动完成功能无法正常工作
【发布时间】:2016-11-09 17:13:43
【问题描述】:

我正在使用 jquery 自动完成功能。在我的情况下,我的页面上有多个自动完成文本框和隐藏字段。 例如

<input  class='myclass' type='text'> </input>
<input class='.emp_num_hidden' type='hidden'> </input>
<input  class='myclass' type='text'> </input>
<input class='.emp_num_hidden' type='hidden'> </input>

等等……

所以当我在隐藏字段上触发更改事件时,它会被多次引发 以下是我的代码:

$(".myclass").each(function() {

var $empName= $(this);
var $empNumber = $empName.next('input:hidden');
//things to do
//Setting variable e.g url...

 $empName.autocomplete(url,{

//code...

}).result(function(event,data,formatted)
{
 $empNumber.val(formatted).change();
});
});

在上面的代码中 $empNumber 包含用于存储自动完成值的隐藏字段,即在这种情况下,当 我们从自动完成中选择任何文本,然后选择的员工编号将存储在隐藏字段中。 基于这个隐藏的字段值,我想进行 ajax 调用,它将根据他的员工返回完整的详细信息 员工编号。 所以我写了一个handler来改变隐藏字段的事件,如下所示。

$(.emp_num_hidden).on('change',function (

)};

这里的'emp_num_hidden'是隐藏字段的类。

请建议如何防止隐藏字段更改的多个事件。

【问题讨论】:

    标签: javascript jquery html jquery-ui autocomplete


    【解决方案1】:

    这是使用$(this) 对象完成的。由于change 事件有一个目标,它只会影响一个元素。回调函数正在这个元素上执行,this。例如:

    $(".emp_num_hidden").on('change', function (e){
      alert($(this).val());
    });
    

    当隐藏字段发生更改时,将显示一个警报窗口,其中仅包含来自该隐藏字段的员工编号。您还会注意到对您的代码进行了一些修复。

    就个人而言,我会在您的对象上同时使用idclass 属性。这为您的选择器提供了广泛的范围和狭窄的范围。

    例子:

    HTML

    <input class='myclass' type='text' id='entry-txt-1' />
    <input class='emp_num_hidden' type='hidden' id='hide-txt-1' />
    <input class='myclass' type='text' id='entry-txt-2' />
    <input class='emp_num_hidden' type='hidden' id='hide-txt-2' />
    

    jQuery

    $(function(){
      var $empName, $empNumber;
    
      $(".myclass").each(function(key, el) {
        $empName= $(el);
        $empNumber = $empName.next("input[type='hidden']");
        // things to do
        // Setting variable e.g url...
        $empName.autocomplete(url, {
          //code...
        }).result(function(e, d, f){
          $empNumber.val(f).change();
        });
      });
      $(".emp_num_hidden").on('change', function(e){
        var empId = $(this).attr("id");
        var $employeeNumberField = $("#" + empId);
        // Do the needful...
      });
    });
    

    更进一步,您可能需要考虑使用数据属性。您可能还想查看 select 自动完成事件。比如:

    $(function(){
      $(".myclass").autocomplete({
        source: url,
        select: function(e, ui){
          $(this).val(ui.item.label);
          $(this).data("emp-number", ui.item.value);
          $.post("employeedata.php", { n: ui.item.value }, function(data){
            $("#empData").html(data);
          });
          return false;
        }
      });
    });
    

    这假定url 返回一个具有labelvalue 属性的数组对象。这会将员工编号作为data-emp-number 属性添加到用户从中进行选择的字段中。 label 是他们的员工姓名,value 是他们的员工编号。您还可以使用此回调根据员工编号显示所有其他员工数据。

    一个工作示例:https://jsfiddle.net/Twisty/zmevd0r0/

    【讨论】:

    • 感谢您的帮助.. 但我在这里不明白如何使用 $this 来防止事件多次触发?在我的隐藏字段更改处理程序中,我已经使用了您提到的这个对象,但仍然多次触发更改事件。是否有任何事件绑定问题?
    • 我正在使用 jquery 自动完成 1.0 版本,我没有找到足够的文档来说明如何在其中实现选择事件。你知道这方面的任何来源吗?
    • @Shubh,您没有在帖子中指定您使用的是特定的东西。我的示例使用了 jQeury 3.1.1 和 jQuery UI 1.12.1。如果可能的话,我会使用更新版本的 jQuery UI。我没有办法测试你的版本。请使用您正在使用的 jQuery 和 jQuery UI 版本编辑和更新您的帖子,以便我可以更新我的答案。
    • 我不认为自动完成是 jQuery UI 1.0 的一部分。我看到的最古老的文档是针对 v1.8 的:api.jqueryui.com/1.8/autocomplete 请澄清您所说的“自动完成 1.0”是什么意思
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-12
    • 1970-01-01
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多