我在jquery中构建了一个级联下拉列表,并通过一些示例进行了修改。我添加了一项功能,让用户“备份”并重新选择之前的下拉列表。这将重新加载下一个下拉列表,并清除和禁用后续下拉列表。
http://jsfiddle.net/goodeye/gA6GZ/
问题是在第一次通过之后,select元素的更改事件被绑定,所以我认为重新加载新值会导致后面的更改事件触发。
我将.change()绑定分离出来,而不是链接它。我之前在加载选择选项之前将其链接起来。这有助于第一次,但不是随后的时间。
对于这个问题,我特意寻找这个序列的好方法:
这个问题: Best way to remove an event handler in jQuery? 将unbind()作为主要答案,然后使用live()的后续答案。 live()方法使用的是一个稍微让我感到困惑的类,并没有获得那么多的选票。
重现:
选择步骤1,参见步骤2火灾
选择步骤2,参见步骤3火灾
再次选择步骤1,参见步骤2火灾
然后麻烦开始了:
选择步骤2,参见步骤3开火两次
选择步骤3,参见步骤4点火三次
再次选择步骤1,参见步骤2点火两次
等
它甚至变得更糟;我会看到第3步火了五次。
一些细节:
在实际代码中,这些从json ajax调用加载。我从示例中删除了它,并添加了硬编码选项来模拟它,将此范围限定为事件问题。
这从服务器端开始,因此第一个下拉列表已经在“html”中。接下来的三个是从(模拟的)json调用中加载的。
这些用于识别的类,因为真实页面具有多个这些下拉列表。代码使用$(this)小心在所选的一个集合中工作。
如果只有一个选项,还有一个“自动选择”功能,然后转到下一个选项。此代码在此处,但模拟示例都有多个选项,以避免此问题出现此问题。
提前感谢您的想法!
答案 0 :(得分:0)
你可以做的是使用jQuery检查元素上的所有绑定更改事件,将它们保存在“离线”数组中,解除绑定,执行您的操作并重新绑定它们。
要检查您可以使用的所有绑定更改事件:
var changeEvents = $(element).data("events").change;
jQuery.each(changeEvents, function(key, handlerObj) {
alert(handlerObj.handler) // alerts "function() { alert('changed!') }"
// also available: handlerObj.type, handlerObj.namespace
})
答案 1 :(得分:0)
好吧,我没时间了,不得不解决它。它只是设置一次绑定 - 这就是它的全部内容。所以这解决了这个问题,并且在这种情况下不需要取消绑定/重新绑定或使用live()。
预先执行以下代码。它将下拉列表绑定一次,并禁用第2,第3,第4,直到级联从调用第一个开始。所以绑定完成一次,然后禁用true / false切换。
$('.ddStep1').change(getStep2);
$('.ddStep2').change(getStep3).attr('disabled', true);
$('.ddStep3').change(getStep4).attr('disabled', true);
$('.ddStep4').attr('disabled', true);
(在此应用程序中,最后一个下拉列表没有更改事件;选择第4个后面有一个单独的提交按钮。)
问题是多次调用创建绑定 - 这是一次性的事情,因此多次调用它会在change事件上附加多个调用。
添加和删除选项不会调用更改事件。
回答关于暂时禁用该事件的原始问题(虽然不是我的问题的解决方案),我确实从这个答案中使用live()了解,并认为这将是要走的路: Best way to remove an event handler in jQuery? 使用命名空间的问题的另一个答案看起来也不错。