使用 .live() 绑定 jQuery UI 自动完成
Posted
技术标签:
【中文标题】使用 .live() 绑定 jQuery UI 自动完成【英文标题】:Bind jQuery UI autocomplete using .live() 【发布时间】:2011-05-31 21:01:21 【问题描述】:我到处搜索,但似乎找不到任何帮助...
我有一些通过 JS 动态创建的文本框,因此我需要将它们的所有类绑定到自动完成功能。因此,我需要使用新的 .live() 选项。
例如,将所有项目与现在和未来创建的 .foo 类绑定:
$('.foo').live('click', function()
alert('clicked');
);
它与 .bind() 的使用(和行为)相同。但是,我想绑定一个自动完成...
这不起作用:
$('.foo').live('autocomplete', function(event, ui)
source: 'url.php' // (surpressed other arguments)
);
如何使用 .live() 绑定自动完成功能?
更新
用 Framer 解决了这个问题:
$(function()
$('.search').live('keyup.autocomplete', function()
$(this).autocomplete(
source : 'url.php'
);
);
);
【问题讨论】:
作为更新,live()
已被弃用,现在 on()
用于执行此操作,例如:$(document).on("keyup.autocomplete", '.autocomplete', function() $(this).autocomplete( ... ); )
...
有没有什么方法可以实现这种行为,而无需为添加的每个元素调用自动完成方法,而是调用一次且仅一次的自动完成方法?
【参考方案1】:
jQuery UI 自动完成功能会自动将“ui-autocomplete-input”类添加到元素中。我建议在没有“ui-autocomplete-input”的情况下将元素实时绑定在焦点上 类以防止对该元素中的每个 keydown 事件重新绑定。
$(".foo:not(.ui-autocomplete-input)").live("focus", function (event)
$(this).autocomplete(options);
);
编辑
自 jQuery 1.7 以来,我的答案现在已经过时了,请参阅 Nathan Strutz 的评论以了解使用新的 .on()
语法。
【讨论】:
这是正确答案。 keyup 上的绑定似乎并没有针对第一次击键进行绑定。很聪明的想法。谢谢。 谢谢。我发现 'focus' 比 'keydown' 更好。 我对其进行了调整以与 datepicker 一起使用,并对其进行了更新以使用更新的 on() 语法。这是我的代码(抱歉缺少格式):$(document).on("focus", ".dateField:not(.ui-datepicker-input)", function(event) $(this).datepicker(dateFormat:"mm/dd/yy"); );
@NathanStrutz 你刚刚救了我!当您在 Drupal 7 中对表单元素进行 AJAX 刷新时,您的代码是唯一仍然有效的东西!谢谢!
$( document ).on( "focus",".foo:not(.ui-autocomplete-input)",function (event) $(this).autocomplete(options); );【参考方案2】:
如果您使用的是jquery.ui.autocomplete.js
,请改用此方法
.bind("keydown.autocomplete") or .live("keydown.autocomplete")
如果没有,请使用jquery.ui.autocomplete.js
看看它是否有效
如果这不适用,我不知道如何帮助你兄弟
【讨论】:
我正在使用 ui.autocomplete,而你的绑定工作:)。我可以触发警报...但这实际上并不能使其成为自动完成...如果我尝试在答案中更新的内容,则会出现语法错误... 这对我来说没有任何意义。自动完成功能仍未添加到新元素中,因此您无法绑定到它生成的任何事件。正确答案是 Dan 下面的答案。 这个答案是乱码,这是应该被接受的正确答案***.com/a/6193792/340142【参考方案3】:只是补充一下,您可以为此使用.livequery
插件:
$('.foo').livequery(function()
// This will fire for each matched element.
// It will also fire for any new elements added to the DOM.
$(this).autocomplete(options);
);
【讨论】:
这是我发现的最好的,最酷的插件!我想这也适用于日期选择器!自从我使用 jquery 以来,我一直在寻找这个……我只能投票一次……我的错…… 非常推荐的插件,这将消除您的头痛【参考方案4】:要在为 jQuery > 1.7 中使用的 on()
事件动态加载时自动完成工作,请使用 Nathan Strutz 在他的评论中提供的语法:
$(document).on('focus', '.my-field:not(.ui-autocomplete-input)', function (e)
$(this).autocomplete(options)
);
.my-field
是自动完成输入元素的选择器。
【讨论】:
【参考方案5】:.live() 不适用于焦点。 keyup.autocmplete 也没有任何意义。 相反,我尝试和工作的事情是这样的
$(document).ready(function()
$('.search').live('keyup' , function()
$(this).autocomplete( source : 'url.php' );
);
)
这很好用。
【讨论】:
【参考方案6】:你不能。 .live() 仅支持实际的 javascript 事件,不支持任何自定义事件。这是 .live() 工作方式的一个基本限制。
【讨论】:
【参考方案7】:你可以试试这个:
$('.foo').live('focus.autocomplete', function()
$(this).autocomplete(...);
);
【讨论】:
【参考方案8】:在阅读和测试其他人的答案后,我已针对当前版本的 JQuery 进行了更新并进行了一些调整。
使用 keydown 作为调用 .autocomplete()
的事件的问题是它无法自动完成输入的第一个字母。使用焦点是更好的选择。
我注意到的另一件事是,所有给定的解决方案都会导致.autocomplete()
被多次调用。如果您要向页面动态添加一个不会再次删除的元素,则该事件应该只触发一次。即使要删除并再次添加该项目,每次删除或添加元素时也应删除并重新添加该事件,以便再次关注该字段不会每次都不必要地调用.autocomplete()
。
我的最终代码如下:
$(document).on('focus.autocomplete', '#myAutocomplete', function(e)
$(this).autocomplete(autocompleteOptions);
$(document).off('focus.autocomplete', '#myAutocomplete');
);
【讨论】:
这是我见过的最好的答案,但仍然不是我想要的。我认为'on'方法的重点是你绑定到你知道不会被替换的最近的父级,所以你只绑定一次。在这里,您一次绑定到一个函数,该函数在每次添加新元素时绑定自动完成。这不是有点忽略了重点吗? IE。每次添加新的输入元素时都会运行自动完成绑定,而不仅仅是一次。 您对on()
的看法是正确的,但自动完成不是一个事件。每次替换元素时,都需要再次在该元素上调用自动完成功能。您可以实现它,以便调用自动完成是替换元素的一部分,或者您可以设置一个事件侦听器,当您关注具有“自动完成”类的任何元素时自动调用自动完成。每次替换元素时都需要调用一种或另一种自动完成。我对其他人的解决方案持开放态度,我希望 jQuery 团队在未来的版本中解决这个缺点。【参考方案9】:
自动完成不是一个事件,而是一个为文本框启用自动完成功能的函数。
因此,如果您可以修改动态创建文本框的 js,以将文本框元素包装为 jquery 对象并在该对象上调用自动完成功能。
【讨论】:
【参考方案10】:我刚刚注意到您使用此答案编辑了您的帖子。这对我来说很明显,所以我在下面为其他人发布。谢谢。
$(function()
$('.search').live('keyup.autocomplete', function()
$(this).autocomplete( source : 'url.php' );
);
);
【讨论】:
这会将 .search 元素转换为按下键后的自动完成元素。自动完成应该在按下任何键之前工作,并且它应该只被初始化一次,而不是在每个 keyup 事件之后。【参考方案11】:这对我有用:
$(function()
$('.item_product').live('focus.autocomplete', function()
$(this).autocomplete("/source.php/",
width: 550,
matchContains: true,
mustMatch: false,
selectFirst: false,
);
);
);
【讨论】:
【参考方案12】:您可以将自动完成功能放在输入实时事件中,如下所示:
$('#input-element').live('input', function()
$("#input-element").autocomplete(options);
);
【讨论】:
以上是关于使用 .live() 绑定 jQuery UI 自动完成的主要内容,如果未能解决你的问题,请参考以下文章