我有一个相当大的 javascript 类,可以生成一个完整的 ajax 生成的应用程序。在 ajax 页面的一个版本中,有许多下拉菜单。这些菜单可以在应用程序生命周期的不同时间点创建和销毁。
这是我看到的行为:
用户打开页面版本 1:没有下拉列表用户转到页面版本 2:使用 jQuery onchange 事件添加的下拉列表。按预期工作。用户返回到页面的版本 1,下拉列表被删除。用户返回到第 2 版页面,再次添加下拉列表(使用相同的元素 ID)下拉列表现在将具有“双重”事件处理,触发每个 onchange 的事件。
我正在努力的行为如下。
在初始页面加载时,我添加了一个 onchange 事件:
function myClass(){
//Initiate once for current and future elements.
jQuery(document).on('change',".mydropdowns",
function(e){
self.submitDescriptionChange(this);
}
);
}
myClass.prototype.submitDescriptionChange = function (el){
doSomeAjaxStuff();
}
这很好用,除了每次用户转到页面版本 1 并返回页面版本 2 时,事件都会成倍增加。很快您就可以在每个更改事件中触发 20 次事件,在这种情况下会创建 20 个 ajax 调用。
从逻辑上讲,通过使用 jQuery.off() 我应该能够避免这种情况。但是发生的事情是事件从过去和未来的元素中删除,这意味着当我重新创建页面版本 2 时,下拉菜单将不起作用。
我尝试过的每一种方式(并且我尝试过 LOADS),我要么最终没有触发事件,要么触发了多个事件。我似乎找不到一种方法来添加/替换事件只触发一次的元素。
有什么想法可以解决这个问题吗?
更新
是的,所以事实证明我误诊了这个问题。它实际上来自反复重新绑定“hashchange”事件,而不是重新绑定 onchange 事件。为误导而道歉。将 bind() 函数移至仅在解决问题后才执行的某个位置。