繁体   English   中英

循环动态设置JQuery中的事件监听器(单击)

[英]Dynamically setting event listeners (on click) in JQuery in a loop

我遍历一个自定义对象的数组,并为该数组中的每个对象创建一个带有on click事件监听器的按钮,以动态设置on click事件的结果。 换句话说,单击按钮A可能会导致警报“ foo”,单击按钮B可能会导致不同的行为-警报“ bar”。

我的JSHint linter说:“不要在循环中创建函数”。

我希望SO社区可以共享更好的设计模式来实现此目标(香草js或JQuery)。

查看小提琴 -这是我正在做的极其简化的版本,但说明了这一点。

Javascript(ES6):

class Tool {
 constructor (name, mainFunction) {
  this.name = name;
  this.mainFunction = mainFunction;
 }
 getName() {
   return this.name;
 }
 getMainFunction() {
   return this.mainFunction;
 }
}

var hammer = new Tool('hammer', 'bang on nails');
var saw = new Tool('saw', 'cuts heavy wood');
var toolbox = [hammer, saw];

for (let i in toolbox) {
  $('.wrapper').append('<div class=\"'+toolbox[i].getName()+'  button\">'+toolbox[i].getName()+'</div>');
  $('.wrapper').on('click', '.'+toolbox[i].getName(), function() {
    alert(toolbox[i].getMainFunction());
   });
}

html

<div class="wrapper">
 Buttons:
</div>

您可以简单地将点击功能分配给共享类.button ,还可以将消息分配给data属性: DEMO

class Tool {
 constructor (name, mainFunction) {
  this.name = name;
  this.mainFunction = mainFunction;
 }
 getName() {
   return this.name;
 }
 getMainFunction() {
   return this.mainFunction;
 }
}

var hammer = new Tool('hammer', 'bang on nails');
var saw = new Tool('saw', 'cuts heavy wood');
var toolbox = [hammer, saw];

for (let i in toolbox) {
  $('.wrapper').append('<div data-message="'+toolbox[i].getMainFunction()+'" class=\"'+toolbox[i].getName()+'  button\">'+toolbox[i].getName()+'</div>');
}

  $('.wrapper').on('click', '.button', function() {
    alert($(this).data('message'));
   });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM