Javascript多个事件绑定到单个函数,导致多个函数执行
Javascript multiple events bound to single function, causes multiple function execution
我对JavaScript非常陌生(对编程非常陌生,目前正在学习Django, JQuery和JavaScript)。无论如何,我试图编写一个JS函数,允许用户单击创建输入字段的DOM中的元素,以便用户可以动态更改元素的文本内容。然后,我将发送一个JSON/AJAX请求来更改数据库的内容以反映更改。
我已经得到它大部分工作,但注意到一个小问题。我给函数绑定了3个事件;Keyup, focusout和keydown。我试图捕捉每个键,因为他们被按下(动态更新DOM中的另一个元素,以反映其类型的变化),当用户点击远离输入,也当输入键被按下。点击并触发每个按键的效果很好,但是按回车键却给我带来了一个问题。我必须添加keydown事件来捕捉这个。似乎正在发生的事情是,所有三个事件都被触发(即我的AJAX POST被发送了三次)。无法解决这个问题。尝试了一些事情(即禁用事件冒泡),但是我对JS很陌生,所以有点超出我的深度和解决这个问题。提前感谢张贴的任何答案。下面是我写的JS,可能不是最有效的,我相信我会及时学会如何使它更精简。
如何确保按下回车键时on函数运行一次?
提前感谢下面的代码。
/* track key pesses on menu name being updated */
$(document).on('keydown keyup focusout','.name_input',function(event){
/* added to try and fix multiple AJAX requests, doesnt seem to work though */
event.cancelBubble = true;
var levelurl;
var menu_id = parseInt($(this).attr("menu_id"));
var menu_root = $(this).attr("menu_root");
var el = '#subrelative' + menu_id;
var $input = $(this);
if (menu_root.length == 1){
levelurl = '/pages/ajax_request/menu/';
}
else{
levelurl = '/pages/ajax_request/submenu/';
}
/* strip unwanted characters from the input */
$input.val($input.val().replace(/[^A-Za-z-_?&'d]/g, '' ));
if (event.type == 'focusout' || event.which === 13){
event.preventDefault();
$.ajax({
url: levelurl,
type: 'POST',
data: {id: menu_id, action: "modify_name"},
dataType: 'json',
success: function(data){
if (data.status){
/* add stuff once backend AJAX stuff is finished */
}
else{
$('#infomodalTitle').html(data.title);
$('#infomodalBody').html(data.message);
$('#infomodalFooter').html('<a href="javascript:location.reload(true)"><button type="button" class="btn btn-success btn-xs">Reload Page</button></a>');
$('#infomodal').modal('show');
};
/* apparently should stop event bubbling but doesnt. Probably not understanding the event bubbling issue properly */
return false;
},
failure: function(data){
/* display info modal error message */
infotitle = "<font color='red'><b>Error</b></font>"
$('#infomodalTitle').html(infotitle);
$('#infomodalBody').html('<p>Server processing error</p>');
$('#infomodalFooter').html('<button type="button" class="btn btn-success btn-xs" data-dismiss="modal">Dismiss</button>');
$('#infomodal').modal('show');
}
});
}
else{
var eltext = menu_root + $input.val() + '/';
$(el).html(eltext);
};
});
/* ******************** */
像这样修改代码:
var eventFired = false;
$(document).on('keyup focusout','.name_input',function(event){
if( !eventFired ) {
eventFired = true;
//Your code
eventFired = false;
}
});
相关文章:
- 等待回调函数执行
- 暂停函数执行流程,直到ajax请求完成
- Bigcommerce-是否可以在函数执行后更改文本
- 如何对jquery中的未命名函数执行.call()
- 等待函数执行后再继续
- mootools类型的函数将文本作为函数执行
- 停止从另一个函数执行Javascript函数
- Jquery回调函数执行多次
- 如何使即兴 jquery 暂停当前函数执行
- JavaScript 双函数执行
- 来自函数 Javascript 的 NaN 返回值 ||函数执行顺序
- 如何在 JS 中调用 2 次或更多次时延迟函数执行
- 函数执行的次数超出预期
- JS中函数执行错误
- 为什么这个函数执行了两次
- 从子函数执行父函数;t更新父级'的属性
- 如何在jQuery函数执行's处于活动状态
- 使用javascript函数执行php文件
- jQuery函数执行顺序
- javascript中同步函数执行中的问题