元素事件侦听器上的this.id成为单击元素的所有ID的数组

时间:2019-03-20 09:10:13

标签: javascript jquery

我在所有文本框上都有一个事件侦听器。单击文本框后,我想打开一个键盘。然后,在键盘的Enter上,我想使用调用它的文本框的ID进行一些逻辑处理。但是,id(代码中的txtbxId)只是成为我单击的第一个文本框,然后成为我在数组中单击的第二个文本框。  例如,警报变为“ textbox1”-在第二个文本框单击后,警报为“ textbox1”“ textbox2” 我试图将变量id强制为”,将其删除等等,都无济于事, 此处的代码段:

$('.textbox').click(function() {            
  var txtbxId = this.id;
  $("#Keyboard").show();

  $(document).on('keydown', function(e) {
    if (e.which === 13) { 
      alert(txtbxId);                 
    }
  });
});
}); 

2 个答案:

答案 0 :(得分:1)

问题是因为您要嵌套事件。因此,除了在点击事件发生时复制keydown事件之外,您还向这些事件提供了每个单独的id

要解决此问题,请对所有.textbox元素使用单个事件处理程序,并从对引发事件的元素的引用中读取它们自己的id,这些元素可以通过{{1}获得}关键字:

this

答案 1 :(得分:0)

问题是,第一次单击文本框时,on('keydown')函数永远不会被取消分配,因此,每次单击.textbox时,您都在进行新的keydown回调,但不会删除旧的回调

我建议您在用于管理.keydown回调的onClick回调之外创建一个对象,这样您随时都可以只有一个。

类似这样的东西:

window.keydownmanager = {
  init: () => {
        $(document).on('keydown', function (e) {
                        window.keydownmanager.callback(e);
        });
  },

  callback: () => {},

  setCallback: (cb) => {
    window.keydownmanager.callback = cb;
  }
}

在您的onClick回调中,执行以下操作:

var txtbxId = this.id;

$("#Keyboard").show();
window.keydownmanager.setCallback(function(e) {
  if (e.which === 13) { 
    alert(txtbxId);                 
  }
})