0

我在 jquery 中构建了一个级联下拉列表,并从几个示例中进行了修改。我添加了一项功能,让用户“备份”并重新选择较早的下拉菜单。这会重新加载下一个下拉菜单,并清除和禁用后续下拉菜单。

http://jsfiddle.net/goodeye/gA6GZ/

问题是在第一次通过后,选择元素的更改事件被绑定,所以我认为重新加载新值会导致后来的更改事件触发。

我分离了 .change() 绑定,而不是链接它。我以前在加载选择选项之前将其链接起来。这有助于第一次通过,但不是随后的时间。

对于这个问题,我特别在寻找一种处理这个序列的好方法:

  • 避免改变()
  • 更新下拉列表
  • 设置更改()

这个问题: 在 jQuery 中删除事件处理程序的最佳方法? 有 unbind() 作为主要答案,然后是使用 live() 的后续答案。live() 方法使用了一个让我有点困惑的类,并且没有得到那么多的选票。

重现:
选择第1步,见第2步火。
选择第2步,见第3步火。
再次选择第1步,见第2步火。
然后麻烦开始了:
选择第2步,看第3步火两次。
选择第3步,看第4步火3次。
再次选择第 1 步,看第 2 步触发两次。
等等。
它甚至变得更糟;我会看到第 3 步触发五次。

一些细节:

在实际代码中,这些从 json ajax 调用加载。我从示例中删除了它,并添加了硬编码选项来模拟它,将其范围限定为事件问题。

这从服务器端开始,所以第一个下拉列表已经在 html 中。接下来的三个是从(模拟的)json 调用中加载的。

这些使用类进行识别,因为真实页面有不止一组这样的下拉菜单。该代码使用 $(this) 来小心在选定的一组内工作。

如果只有一个选项,还有一个“自动选择”功能,然后继续下一个选项。该代码在那里,但模拟示例都有多个选项,以避免此问题出现此问题。

提前感谢您的想法!

4

2 回答 2

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
})
于 2011-07-17T22:58:17.313 回答
0

好吧,我没时间了,不得不解决它。只需设置一次绑定 - 这就是它的全部内容。所以这解决了问题,在这种情况下不需要取消绑定/重新绑定,或者使用 live() 。

预先执行以下代码。它绑定下拉列表一次,并禁用第二、第三、第四个,直到级联从调用第一个开始。所以绑定完成一次,然后切换禁用的真/假。

$('.ddStep1').change(getStep2);
$('.ddStep2').change(getStep3).attr('disabled', true);
$('.ddStep3').change(getStep4).attr('disabled', true);
$('.ddStep4').attr('disabled', true);

(在这个应用程序中,最后一个下拉菜单没有更改事件;选择第 4 个后有一个单独的提交按钮。)

问题在于创建绑定的多次调用 - 这是一次性的事情,因此多次调用它是在更改事件上附加多个调用。

添加和删​​除选择选项不会调用更改事件。

回答关于暂时禁用事件的原始问题(尽管不是我的问题的解决方案),我确实从这个答案中理解了使用 live() ,并认为这将是要走的路: Best way to remove an event handler in jQuery? 使用名称空间对该问题的另一个答案看起来也不错。

于 2011-07-20T16:22:36.910 回答