javascript - 事件监听器的影响?

标签 javascript jquery

eventlisteres 有什么影响?我说的是大数字,这里有一个例子:

  • 一开始只有x.marker
  • 当点击 .marker 时,通过 JS 添加所有 child - 事件监听器
  • 每个 child 做自己的事情,这意味着他们每个人都有自己的事件监听器

<!-- Final HTML of single .marker when it has been clicked -->
<div class="marker">
    <div class="remove"></div>
    <div class="change"></div>
    <div class="add"></div>
    <div class="drag"></div>
</div>

var count = 20 000;

for(i = 0; i < count; i++) {

    var marker = document.createElement('div');
    marker.className = 'marker';
    someParentElement.appendChild(marker);

    marker.click( function() {
        //Create child elements
        var remove = document.createElement('div');
        remove.className = 'remove';
        marker.appendChild(remove);

        var change = document.createElement('div');
        change.className = 'change';
        marker.appendChild(change);

        var add = document.createElement('div');
        add.className = 'add';
        marker.appendChild(add);

        var drag = document.createElement('div');
        drag.className = 'drag';
        marker.appendChild(drag);

        //Children eventlisteners
        remove.click( function() {
            //Do it's thing
        });
        change.click( function() {
            //Do it's thing
        });
        add.click( function() {
            //Do it's thing
        });
        drag.click( function() {
            //Do it's thing
        });
    });
}

请不要介意其他事情,例如以编程方式创建 20 000 个元素。我的问题是:让所有这些事件监听器中包含所有这些代码会产生什么影响?只要事件监听器没有被触发,事件监听器中的代码是什么或有多少并不重要?

最佳答案

尝试使用事件委托(delegate),单一事件处理器。参见 switch , .is()

var count = 100;

for (i = 0; i < count; i++) {

  var marker = document.createElement('div');
  marker.className = 'marker';
  marker.innerHTML = marker.className + " " + i;
  document.body.appendChild(marker);

  //Create child elements
  var remove = document.createElement('div');
  remove.className = 'remove';
  remove.innerHTML = "remove" + i;
  marker.appendChild(remove);

  var change = document.createElement('div');
  change.className = 'change';
  change.innerHTML = "change" + i;
  marker.appendChild(change);

  var add = document.createElement('div');
  add.className = 'add';
  add.innerHTML = "add" + i;
  marker.appendChild(add);

  var drag = document.createElement('div');
  drag.className = 'drag';
  drag.innerHTML = "drag" + i;
  marker.appendChild(drag);
  //Create child elements
}

var check = function(args) {
  alert(args.innerHTML.replace(/[^\d+]/g, ""))
}

var obj = {
  remove: check,
  change: check,
  add: check,
  drag: check
}

var message = function(name) {
  console.log(name)
}

$("body").on("click", ".marker", function(event) {
  var name = event.target.className;
  switch (name) {
    case "remove":
      /* do stuff */
      message(name);
      break;
    case "change":
      /* do stuff */
      message(name);
      break;
    case "add":
      /* do stuff */
      message(name);
      break;
    case "drag":
      /* do stuff */
      message(name);
      break;
    default:
      /* do stuff */
      alert(name);
      break;
  }

  // utilizing `.is()`
  if ($(event.target).is(".remove")) {
    // do stuff
    event.target.innerHTML += "clicked"
  }
  if ($(event.target).is(".change")) {
    // do stuff
    event.target.innerHTML += "clicked"
  }
  if ($(event.target).is(".add")) {
    // do stuff
    event.target.innerHTML += "clicked"
  }
  if ($(event.target).is(".drag")) {
    // do stuff
    event.target.innerHTML += "clicked"
  }
  if (!$(event.target).is(".marker")) {
    // utilizing an object
    obj[event.target.className](event.target)
  }

})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js">
</script>

关于javascript - 事件监听器的影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35120160/

相关文章:

jquery - 如何防止默认事件触发但仍允许事件冒泡

javascript - 使用 Google Map Api 时出现错误。 Google Api key 无权使用此 api

javascript - Chai 测试对象数组到 "contain something like"对象子匹配

javascript - 为什么 JavaScript 调试器不在调试器语句处暂停?

php - Javascript 相当于 PHP 的 md5() ,它也适用于多字节字符串?

javascript - fullpage.js - 如果 'scrolloverflow' 设置为 true 则无法向下滚动到下一部分

javascript - 如何使用php在下拉列表中自动更新三天的日期

javascript - 在 DOM 准备好之后、UI 渲染之前,如何使用 jquery 做一些事情?

Javascript 在索引页面上加载良好,但在其他页面上则不然

javascript - 如何合并 ng-message 消息