切换jquery事件状态(开/关)而不再指定处理程序

时间:2012-10-12 11:14:48

标签: jquery events javascript-events event-handling

我有一个悬停(mouseenter / mouseout)事件和与之关联的处理程序的元素。 我希望停用此事件一次,直到我的页面被加载或执行某个操作然后我希望它可以重新激活而不再指定相同的处理程序。

如果我这样做:

$(element).on('mouseout', handler); //Initial state when i prepare my object
$(element).off('mouseout'); //To turn off the event for the time-being.

如果我想重新打开/重新关联事件,我必须重新分配他的处理程序。

我的要求是:

  1. 我绑定了事件和处理程序:

    $(element).on('eventName', handler)
    
  2. 代码:

    $(element).freezeEvent(); //It wont trigger the mouseenter/mouseout event.
    
  3. 代码:

    $(element).unFreezeEvent(); //It will make mouseenter/mouseout event and its original handler to be called up.
    
  4. 请建议。步骤和流程必须是这样的。

1 个答案:

答案 0 :(得分:1)

一个非常简单的解决方案是处理处理程序本身的冻结。

var handler = function (event) {

  if (!$(event.target).isFrozen()) {

     // do whatever you like...
  }
}

jQuery扩展:

$.fn.freeze = function () {

  return this.each(function () {

    $(this).data('frozen', true);
  });
}

$.fn.unfreeze = function () {

  return this.each(function () {

    $(this).data('frozen', false);
  });
}

$.fn.isFrozen = function () {

  return !!this.eq(0).data('frozen');
}

冻结和解冻这样的元素:

$(element).freeze(); // returns jQuery object for chaining
$(element).unfreeze(); // returns jQuery object for chaining

获取当前状态:

var state = $(element).isFrozen(); // returns true or false

要确保你的处理程序在附加后不立即获取triggert,只需在附加之前冻结元素:

$(element).freeze().on('someEvent', handler);