单击“确定”时JavaScript警报不会消失

单击“确定”时JavaScript警报不会消失,javascript,jquery,alert,Javascript,Jquery,Alert,我在这里创建了一个JQuery动态表,并尝试实现输入检查以确保只保存数字。通过在单元格外部单击或按enter按钮来更新单元格,我试图实现的是在输入无效输入时发出警报 “focusout”功能警报工作正常。另一方面,“按键”功能警报行为异常,警报消息会像正常情况一样弹出,但无论我单击“确定”多少次,它都不会消失 根据console.log()的说法,该警报以某种方式触发了“focusout”函数。但即使是这样,我也不明白这是如何导致错误的,因为“focusout”函数工作正常。我尝试在警报后使用$

我在这里创建了一个JQuery动态表,并尝试实现输入检查以确保只保存数字。通过在单元格外部单击或按enter按钮来更新单元格,我试图实现的是在输入无效输入时发出警报

“focusout”功能警报工作正常。另一方面,“按键”功能警报行为异常,警报消息会像正常情况一样弹出,但无论我单击“确定”多少次,它都不会消失

根据console.log()的说法,该警报以某种方式触发了“focusout”函数。但即使是这样,我也不明白这是如何导致错误的,因为“focusout”函数工作正常。我尝试在警报后使用$(this).focus(),但没有成功。知道我遗漏了什么吗

提前谢谢

$(document).on('keypress', '.row_data', function (event) {

  if (event.which === 13) {
    event.preventDefault()
    
    if (isNaN($(this).html())) {
      alert("Enter valid number")
    } else {
      var elem = $(this)
      saveValue(elem)
    }
  }
});

/* Saves the edited cell data when user clicks outside the cell */
$(document).on('focusout', '.row_data', function (event) {
  event.preventDefault();

  if (isNaN($(this).html())) {
    alert("Enter valid number")
  } else {
    var elem = $(this)
    saveValue(elem)
  }
});
编辑

所以这里是我的HMTL的上下文。我用把手创建了一个表格,但基本上我所有的单元格都是这样的

      <span class="row_data" edit_type="click" col_name="col_1">{{col_1}}</span>
    </td>
    <td>£
      <span class="row_data" edit_type="click" col_name="col_2">{{col_2}}</span>
    </td>
    <td>£
      <span class="row_data" edit_type="click" col_name="col_3">{{col_3}}</span>
    </td>

您好,在这里使用HTML将有助于建议更好的解决方案,但简单的猜测是,您正在使用事件创建一个循环

您说过keypress事件是问题所在,只是出于测试目的,您尝试过将keypress更改为keydown/keyUp


此外,我建议将警报更改为console.log,以便于调试。

嗨,在此处使用HTML将有助于建议更好的解决方案,但简单的猜测是,您正在创建一个包含事件的循环

您说过keypress事件是问题所在,只是出于测试目的,您尝试过将keypress更改为keydown/keyUp


我还建议将警报更改为console.log,以便于调试。

我在下面对您的代码做了一些更改,并对其进行了完整的评论。最好不要在任何可能的情况下重复代码,只需使用各种方法维护单个函数和触发器,而不必确保分别维护两个不同的函数

您当前多次触发您的
警报
,我们可以将代码合理化一点,以避免触发警告的两个不同功能

我认为您可以通过以下方式简化:

$(":focus").blur();
这将从处于焦点的元素中移除焦点

我假设您的
.row\u数据
是一个
输入
,因此也使用了
.val()
,而不是
.html()
,您可能需要根据您的用例将其更改回去

如果你还希望得到别的东西,请告诉我


//我建议使用keyup而不是keypress
$(文档).on('keyup','row_data',函数(事件){
//检查是否是退货
if(event.which==13){
//消除焦点
//这将触发下面的函数,管理单个函数将更容易
$(':focus').blur();
//防止违约
event.preventDefault()
}
});
/*当用户在单元格外单击时保存编辑的单元格数据*/
$(文档).on('focusout','row_data',函数(事件){
//防止违约
event.preventDefault();
//检查NaN是否
//Used.val()-不确定是否需要在用例中使用.html
if(isNaN($(this.val())){
//通知用户
警报(“输入有效数字”)
}否则{
//传递要保存的元素
保存值($(此))
}
});
//测试保存功能
函数saveValue(elem){
//发送到控制台以证明其有效
log(“保存”+elem.val());
}

我在下面对您的代码做了一些更改,并对其进行了完整的评论。最好不要在任何可能的情况下重复代码,只需使用各种方法维护单个函数和触发器,而不必确保分别维护两个不同的函数

您当前多次触发您的
警报
,我们可以将代码合理化一点,以避免触发警告的两个不同功能

我认为您可以通过以下方式简化:

$(":focus").blur();
这将从处于焦点的元素中移除焦点

我假设您的
.row\u数据
是一个
输入
,因此也使用了
.val()
,而不是
.html()
,您可能需要根据您的用例将其更改回去

如果你还希望得到别的东西,请告诉我


//我建议使用keyup而不是keypress
$(文档).on('keyup','row_data',函数(事件){
//检查是否是退货
if(event.which==13){
//消除焦点
//这将触发下面的函数,管理单个函数将更容易
$(':focus').blur();
//防止违约
event.preventDefault()
}
});
/*当用户在单元格外单击时保存编辑的单元格数据*/
$(文档).on('focusout','row_data',函数(事件){
//防止违约
event.preventDefault();
//检查NaN是否
//Used.val()-不确定是否需要在用例中使用.html
if(isNaN($(this.val())){
//通知用户
警报(“输入有效数字”)
}否则{
//传递要保存的元素
保存值($(此))
}
});
//测试保存功能
函数saveValue(elem){
//发送到控制台以证明其有效
log(“保存”+elem.val());
}


“无论我单击确定多少次,它都不会消失”-因此很可能不是一个警报“不会消失”,而是单独的警报,每次只显示相同的消息。假设这里有实际的输入字段,你应该考虑使用<代码>输入<代码>事件,而不是你现在要使用的两个,这应该避免当前由于警告而失去焦点的任何问题。再次触发另一个警报。是输入的
.row\u data'
类吗?您的
警报
正在触发
focusout
事件,该事件。。。创建另一个警报。始终使用
console.log
而不是<