代码之家  ›  专栏  ›  技术社区  ›  bart

无法获取在jqueryui自动完成中工作的$(this)

  •  30
  • bart  · 技术社区  · 15 年前

    我正在尝试使用jqueryui创建一个通用的自动完成脚本。自动完成功能应适用于以下每种情况:

    <input type='text' class='autocomplete' id='foo'/>
    <input type='text' class='autocomplete' id='bar'/>
    ...
    

    现在我正尝试使用$(this)访问源函数中的“foo”或“bar”,但是当发出警报时,我总是得到“undefined”。

    $('input.autocomplete').autocomplete({
        source: function(req, add){
            var id = $(this).attr('id');
            alert(id);
        }
    });
    

    我做错什么了?

    4 回复  |  直到 12 年前
        1
  •  57
  •   Lee    15 年前

    为所选的每个项目分别设置自动完成功能,使用一个闭包来保存对相关元素的引用。如下所示:

    $('input.autocomplete').each(function(i, el) {
        el = $(el);
        el.autocomplete({
            source: function(req, add) {
                var id = el.attr('id');
                alert(id);
            }
        });
    });
    

    备选方案(编辑)

    我不明白为什么会有这样的抵制使用 each() :它可以工作,代码非常清晰和可读,并且不会带来效率问题;但是如果您决定避免 () ,这里有一个选择……

    *请注意:下面的方法(稍微)依赖于jquery自动完成的内部,所以我建议使用第一个选项…但选择权是你的。

    $('input.autocomplete').autocomplete({
            source: function(req, add) {
                var id = this.element.attr('id');
                alert(id);
            }
        });
    });
    

    至少在他们改变 source() 从内部调用函数 autocomplete 插件。

    所以,你有两个选择…对每个人都有好处。

        2
  •  2
  •   SeanWM    12 年前

    要访问该输入元素,您应该能够执行以下操作:

    $(this.element).val();
    

    当然,这就是价值所在。您可以访问其他属性,如:

    $(this.element).attr('value'); // just another way to get the value
    $(this.element).attr('id');
    

    另外,假设您希望访问 select event ,您可以这样做:

    $(event.target).attr('value');
    $(event.target).attr('id');
    
        3
  •  0
  •   Marwelln    15 年前

    $(this) 将来自您新创建的函数,因此不起作用。移动你的 id 以上声明 source 它应该是有效的。

        4
  •  0
  •   Glycerine    15 年前

    马韦林是对的。”此“”将引用嵌套在其中的新创建函数。这很容易通过创建var来修复。 id 在函数外部并在函数内部使用它。