复制单击事件,销毁它们并稍后附加它们

时间:2015-09-18 05:12:50

标签: javascript jquery

我试图完全禁用某些元素的点击事件,但可以选择稍后重新启用它们。

到目前为止我尝试过:

$('a').on('click', function(e) {
   // some stuffs...
});

...

$('a').each(function(i, el) {
   this.clickEvents = $._data(el, 'events').click;
   $(el).off('click');
});

// reenable them later (this is not working)
$('a').each(function(i, el) {
   $(el).on('click', this.clickEvents);
});

...

我错的任何想法?

2 个答案:

答案 0 :(得分:4)

在每个.handler中尝试clickEvent

$('a').each(function(i, el) {
   // clickEventHandlers is an array of handler functions
   this.clickEventHandlers = $._data(el, 'events').click.map(function(e) {
      return e.handler;
   });
   $(el).off('click');
});

// re-enable them later
$('a').each(function(i, el) {
   // reapply the handlers in order
   this.clickEventHandlers.forEach(function(handler) {
      $(el).on('click', handler);
   });
});

关于这一点的好处是您可以按顺序重新应用所有事件监听器

工作JSFiddle

答案 1 :(得分:1)

对第一个$._data(el, 'events').click[0].handler事件尝试click,或使用$.each()迭代所有click或其他事件;将handler存储在元素.data();例如,.data("events");使用$(this).data().events[0]

重新附加处理程序

$("a").data("events", []).on("click", function() {
  console.log(this)
});

$("a").each(function(i, el) {
  $.each($._data(el, 'events').click, function(index, event) {
    $(el).data().events.push(event.handler)
  })
  console.log($(this).data("events"));
  $(el).off("click");
});

// reenable them later (this is not working)
$("a").each(function(i, el) {
  $.each($(this).data().events, function(index, handler) {
    $(el).on("click", handler);
  })
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<a href="#">click</a>