jquery 多个事件响应

jquery multiple event responses

我是一名经验丰富的程序员,但在 Javacsript/JQuery 方面经验不多。我正在尝试修复其他人的代码,所以我有点不适应。另外,我们正在使用两者的古老版本。

我们有从 link 弹出的对话框。它有一个文本字段和一个确定按钮。您输入电子邮件地址,信息就会发送给您。当您单击“确定”时,一切都按预期工作。当你在地址后面输入回车时,你会得到 n 个副本,n 是对话框打开的次数。

  $(index_init);

  function index_init()
    {
    $("#forward_one_dialog").dialog(
      {
      autoOpen: false,
      modal: false,
      zIndex: 3000,
      buttons: { "Ok": forward_one}
      });
    $(".link_forward").click(function()
      {
      if ($("#forward_one_dialog").dialog("isOpen") == true)
      {
        return false;
      } else {
      $("#forward_one_dialog").dialog("open");
      $("#forward_one_dialog").keypress(function(e) {
        if(e.keyCode == $.ui.keyCode.ENTER) {
          forward_one();
        }
      });
      $("#forward_one_to").focus();
      }
    });
    }

  function forward_one()
    {
    var dialog = "#forward_one_dialog";
    var path = $("#forward_one_url").attr('value');
    var url = "/emails/list/" + path + "/forward/?fmt=json";
    var recipients = $("#forward_one_to").val();
    if (!recipients)
      {
      $(dialog).dialog("close");
      // this is in list.js:
      error_txt("#no_forward");
      return false;
      }
    var emailid = $("#forward_one_emailid").attr('value');
    var data = { "subset" : [emailid], "recipients" : recipients };
    $.post(
      url,
      data,
      function(jsonrpc, xhrstatus) {
        jsonrpc_status(jsonrpc, xhrstatus, "#forward_one_dialog");
      },
      "json"
     );
    $(dialog).dialog("close");
    return false;
  }

如您所见,单击“确定”并输入时调用 forward_one。只是次数而已。

如果有任何帮助,我尝试重置 forward_one 中文本字段的值。在那种情况下,对话框不包含最后一个值。我仍然接到多个电话,但只有一个有新的价值。其余的具有重置值。

$(".link_forward").click(function()
{
  /* ... */
  $("#forward_one_dialog").keypress(function(e) {
    if(e.keyCode == $.ui.keyCode.ENTER) {
      forward_one();
    }
  });
  /* ... */
});

这里可以看到,每次点击.link_forward,都会调用keypress。此对 keypress 的调用将 添加到 #forward_one_dialog 元素的处理程序。因此每次单击它时,都会在现有处理程序之上添加另一个处理程序。这是你的问题的原因。将此调用移至单击处理程序之外的 keypress,以便仅应用一次。如果必须只在打开对话框后调用它,那么创建一个布尔值来跟踪它是否已经被调用并确保它只被调用一次。