2011-07-18 73 views
0

我创建了一个将通过ajax加载的页面。在这个页面上,我创建了一个函数,它将为指定的键分配一些功能[我正在使用jQuery Hot键]。javascript:事件通过ajax加载页面后多次执行。

这里是,我使用将功能分配

function setupKeys() 
{ 
    $.each(keyMap, function (event, listener_name){ 
     $(document).bind('keydown', event, listener[listener_name]); 
    }); 
} 

这将在页面被加载时,每次执行的功能。

如果我第一次加载页面并按下回车键,函数将会执行。假设如果我通过ajax再次加载页面并且引用浏览器并按下回车键,则该函数执行两次。我重复同样的功能将执行三次。

我该如何避免这种情况? keyMap是一个对象

keyMap = { 
'Ctrl+s':'save_data', 
'return':'test_return', 
'tab':'test_return' 
}; 

listener = new Array();

请帮忙。

[对不起英语]

Krish。

回答

1

为什么不绑定绑定之前的事件?没有probs没有约束,防止双重事件登记。

function setupKeys() 
{ 
    $.each(keyMap, function (event, listener_name){ 
     $(document).unbind('keydown', listener[listener_name]); 
     $(document).bind('keydown', event, listener[listener_name]); 
    }); 
} 
+0

谢谢来头。我按照你的建议尝试过,但事件事件仍会多次触发。但是,如果我确保'setupKeys'只执行一次,像marc这样的建议,事件触发只有一次,即使我通过ajax重新加载页面。但我的发布是,我必须在多个页面中使用此功能。 – Nick

+0

我对代码做了一些改变,而不是将事件分配给文档,我试图将它分配给表单,然后尝试'console.log($(“#mainForm”)。data('events'));'它只显示类似这在萤火虫'keydown对象{}' – Nick

+0

我使用jquery 1.3.1 – Nick

0

您必须检查setupKeys是否已被执行。只需添加一个变量

var isSetupKeysCalled = false; 

将被设置为false你的函数内。

0

尝试在绑定事件之前取消绑定事件,以确保事件在页面上不会被多次触发。

$.each(keyMap, function (event, listener_name){ 
     $(document).unbind('keydown').bind('keydown', event, listener[listener_name]); 
    }); 
0

我无法用解除绑定方法解决问题。所以我修改了marc建议的函数。我认为它现在工作。

谢谢marc

0

问题已解决!

,因为我是使用下面的语法jQuery的热键应该用来解除绑定事件

$.each(keyMap, function (event, listener_name){ 
      $(document).unbind('keydown', event, listener[listener_name]); 
      $(document).bind('keydown', event, listener[listener_name]); 
     }); 
相关问题