【问题标题】:How to access data associated with element when using event-delegation使用事件委托时如何访问与元素关联的数据
【发布时间】:2013-02-15 06:13:47
【问题描述】:

我在 n 行上使用事件委托,我的旧方法是将每一行与事件绑定,代码看起来像这样:

function getDiv (data) {
    var div = $("<div class='theDiv'>");

    div.click(function () {
        console.log(data);
    });

    return div;
}

function getContainer() {
    var i, container;

    container = $("<div class='container'></div>");
    for (i = 0 ; i < 1000 ; i++) {
        container.append(getDiv(i));
    }
    return container;
}

$("body").append(getContainer());

注意:在这种方法中,每个行元素 (theDiv) 都可以访问它们的数据。

现在的问题是,我想绑定单击 container 并访问数据,事件委托方法如下所示:

function getNewDiv (data) {
    var div = $("<div class='theDiv'>");

    return div;
}

function getNewContainer() {
    var i, container;

    container = $("<div class='container'></div>");
    for (i = 0 ; i < 1000 ; i++) {
        container.append(getNewDiv(i));
    }

    container.click (function (e) {
        var targetElem = e.target;
        console.dir(e);
        if ($(targetElem).hasClass("theDiv")) {
            console.log("row was clicked");
        }
    })

    return container;
}

$("body").append(getNewContainer());

现在,如何访问与每一行关联的数据?

根据我的学习: 我可以将数据添加到

  • data-*,但这会限制我使用简单的数据类型
  • $.data 关联到元素

还有其他方法吗?

【问题讨论】:

    标签: javascript performance dom-events event-delegation


    【解决方案1】:

    .on 允许您进行事件委托:

    container.on('click', '.theDiv', function () {
        //`this` is `.theDiv`.
    });
    

    【讨论】:

      【解决方案2】:

      您可以在getNewDiv() 中使用$.data() 来存储引用索引:

      function getNewDiv (dataIndex) {
          return $("<div class='theDiv'>").data('idx', dataIndex);
      }
      

      然后,使用每个元素的数据索引变量来引用大数据数组中的一个对象:

      var mydata = [{ ... }, { ... }, { ... }];
      
      container.on('click', '.theDiv', function () {
          var data = mydata[$(this).data('idx')];
          console.log("row was clicked");
      });
      

      【讨论】:

      • 还有其他方法吗?我在考虑不使用 $.data 或 data-*,好吧 $.data 更优雅但仍然:)
      • @dilliwal 您存储在每个数据中的数据可能只是指向可以从单击处理程序引用的对象数组的索引。
      • @AbhishekDilliwal 我已经更新了我的答案,以举例说明如何保持数据集中。
      • 感谢 Jack,即使我也这么认为,唯一的问题是,当 dom 元素被删除时,我必须跟踪 dataArray。将其保存在 $.data 中会更好,因为当我们使用 jQuery 的 remove 时,它也会删除数据。
      • @AbhishekDilliwal 是的,我显然没有考虑删除节点 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-02
      • 2012-08-15
      • 1970-01-01
      • 1970-01-01
      • 2011-10-14
      • 1970-01-01
      相关资源
      最近更新 更多