如何防止在ajax页面加载时初始化相同的事件处理程序
jQuery - How to prevent the same event handlers to get initialized when an ajax page load occurs?
我用jQuery和PHP从废料构建了一个表。它具有实时搜索、表列排序和分页功能(jQuery事件处理程序检查任何更改,然后使用ajax重新加载表)。表位于PHP中的div中,因此它将表加载到表的div中)。当发生任何更改并触发ajax加载时,事件处理程序也会重新加载,因为PHP文件发生了更改,页面中出现了以前没有事件处理程序的元素。这样做的问题是同一个事件会有太多的事件处理程序。
下面是一些jQuery代码的简化片段。
// for the first initialization
$('document').ready(function(){
var tableSettings = setSettings(1, 2, 3); // returns a simple array
loadTable(tableSettings);
});
// loads the table and the event handlers
function loadTable(tableSettings){
$('#table_content').load('modules/donations_table.php', tableSettings, function(){
search();
});
}
// search() has event handlers like this
$('#location').change(function(){
var tableSettingsNew = setSettings(1, 2, 4);
loadTable(tableSettingsNew); // this is where the problem occurs
});
正如您所看到的,当#location发生更改时,它会更改tableSettingsNew数组,并将其与POST请求一起发送到donations_table.php以从数据库生成新的表行。在#location修改4次之后,loadTable()函数被调用了15次。
我知道我可以用donations_table.php中的内联脚本解决这个问题,但我正在寻找一个更优雅的解决方案。是否有任何方法来重置我的事件处理程序,所以当页面加载时,它会破坏,然后重建他们,而不重新加载整个页面?
在评论中,serakfalcon和cookie monster都给了我正确的答案:事件委托。这里有一篇关于它的短文。
在我的例子中,解决方案是改变$('#location').change(function() {...} )
到$('#table_content').on('change', '#location', function(){})
,因为ajax加载的元素是在#table_content,所以这个事件处理程序将检查里面发生的一切,所以我不需要加载我的事件处理程序,但一次。
谢谢大家的评论。
- datepicker引导程序再次初始化
- 如何使用onDeviceReady设置AngularJS应用程序并初始化Cordova的功能
- Rails应用程序中的每个javascript文件都需要.on('page:change',初始化)吗?
- 引导程序巡回未初始化
- $(this.el).find()在事件处理程序中工作,而不是在初始化函数(主干.js)中工作
- CoffeeScript:对象初始化程序中的Getter/Setter
- 如何初始化Twitter引导程序表单助手日期选择器
- Angular 2应用程序基础初始化
- 在 Rails 上初始化应用程序 CSS 和 JavaScript 标签时,未显示 FullCalendar 标题工具栏
- $http AngularJS 应用程序初始化之前的请求
- AngularJS在应用程序初始化后注入模块
- 通过C++应用程序初始化节点.js环境
- Cordova(PhoneGap)在jQuery Mobile应用程序的每一页上重新初始化
- 修改 .appendChild() 的目标,它会导致程序重新初始化
- 如何使用需要异步初始化的提供程序配置 angular
- 未定义的函数初始化标签输入引导程序 3.
- 重新初始化煎茶触摸应用程序,而不执行页面重新加载
- Ember-cli 创建/初始化应用程序.js两次
- 当从ember.js1.11.3升级到1.12以删除弃用警告时,我如何将这些初始化程序转换为实例初始化程序
- Emberjs中的实例初始化程序