我正在用jQuery构建一些动态选择列表。当它们被更改时,我希望事件触发一个函数来获取数据。
var selector = $('<select id="myid" />');
selector.append($('<option value>Option Placeholder</value>'));
// attach onChange event to select list
selector.bind('change', doUpdate(this));
我的问题是每次构建选择列表时都会触发change
事件。我不确定触发器是如何发生的 - 我希望它只会触发change
事件,当它发生变化时!
答案 0 :(得分:3)
执行此操作时:
selector.bind('change', doUpdate(this));
您期望发生的是绑定事件处理程序以执行doUpdate
函数,并将this
作为参数传递。
这不是正在发生的事情。相反,它正在做的是立即调用doUpdate(this)
,然后尝试将该函数调用返回的值设置为change
事件的事件处理程序。
您可以这样做:
selector.bind('change', doUpdate);
jQuery将为您处理this
的值(它将是触发事件的元素),因此您不需要将其作为参数传递给函数。
答案 1 :(得分:1)
您必须了解函数调用和函数引用之间的区别。每个回调都应该作为函数引用(或匿名函数)提供,而不是函数调用。
区别在于函数名后面的括号()
。
selector.bind('change', doUpdate);
编辑:请务必更新doUpdate
功能。它将使用this
关键字自动访问触发更改的元素,因此您无需将其作为参数传递。
答案 2 :(得分:1)
您的事件安排方法有误。对于事件附件,您应该传递功能。在这里你正在执行函数并传递返回值。
var selector = $('<select id="myid" />');
selector.append($('<option value>Option Placeholder</value>'));
// attach onChange event to select list
selector.bind('change', function(){ doUpdate(this) });