2011-12-18 76 views
3

我有两部分脚本。防止调用函数


Part 1 : 
$("mySelector").click(function() { 
    alert('you call me'); 
}) 

Part 2 : 
$("mySelector").click(function() { 
    if(myCondition) { 
      //how can i prevent calling the first function from here ??? 
    } 
}) 

整个问题,是我必须part1的没有访问。所以我需要解除第一部分中已经指定的事件,如果myCondition是真的,否则我需要调用第一个函数。

感谢

UPDATE:

谢谢。我不知道stopImmediatePropagation()。但我觉得,必须有类似的东西:)

但实际上在我的情况下,它不工作:(

请看看我的网站 http://www.tours.am/en/outgoing/tours/%D5%80%D5%B6%D5%A4%D5%AF%D5%A1%D5%BD%D5%BF%D5%A1%D5%B6/Park-Hyatt-Goa/

酒店描述选项卡我有云旋转木马,当我点击没有活动图像(不是前面的图像),你可以看到我安慰,我stopImmediatePropagation()那里,但事件但是电话:(

回答

1

禁止访问:

$("#mySelector").click(function() { 
    alert('you call me'); 
}) 

访问:

var myCondition = true, //try false too 
    fFirstFunction = $("#mySelector").data("events").click[0].handler; 
$("#mySelector").unbind("click"); 
$("#mySelector").click(function() { 
    if(myCondition) { 
     alert(myCondition); 
    } else { 
     $("#mySelector").click(fFirstFunction); 
    } 
}); 

this例如

+0

情况如何? – alex 2011-12-18 14:22:00

+2

您是否错过了'if(myCondition)'部分? – Jon 2011-12-18 14:22:12

+0

抱歉,现在修复了。 – noob 2011-12-18 14:47:32

5

如果你的处理程序先注册,然后你可以SE event.stopImmediatePropagation这样的:

$("mySelector").click(function(event) { 
    if(myCondition) { 
      event.stopImmediatePropagation(); 
    } 
}) 

要知道,这将停止事件冒泡,所以它也将防止父元素click处理程序被调用。

更新:如果这不起作用,那么您的处理程序会附加到您想要控制的处理程序之后。这是一个让解决方案更加困难的问题。我建议你看看你是否可以在“另一个人之前”绑定,否则你将不得不解除绑定现有的处理程序,然后通过保留对它的引用来有条件地调用它。请参阅jQuery find events handlers registered with an object

+0

@alex:我在第一次尝试时弄错了,并在运行维修时被删除。 :) – Jon 2011-12-18 14:15:57

+0

:) +1给你先生。 – alex 2011-12-18 14:17:12

+0

谢谢。我不知道stopImmediatePropagation()。但我觉得,一定有这样的事情:) 但实际上在我的情况下它不起作用:( 请看看我的网站 http://www.tours.am/en/outgoing /游览/%D5%80%D5%B6%D5%A4%D5%AF%D5%A1%D5%BD%D5%BF%D5%A1%D5%B6/Park-Hyatt-Goa/ 根据**酒店描述**选项卡我有云旋转木马,当我点击没有活动的图像(不是前面的图像),你可以看到我安慰,我stopImmediatePropagation()那里,但事件然而调用:( – Simon 2011-12-18 14:22:57

-1
return false; 

- 或 -

event.preventDefault(); 
+0

其实这只会阻止* bubbling *,所以它不会工作 – Jon 2011-12-18 14:13:25

+0

'preventDefault'阻止本地操作,如在链接上导航;'stopPropagation'防止冒泡。 – pimvdb 2011-12-18 14:14:08

+0

请注意,两者不是一回事。虽然'return false'会停止事件处理,'event.preventDefault()'会停止默认行为(例如:单击链接将发出导航命令,直到被阻止)。 – sitifensys 2011-12-18 14:17:17

1

您可以拨打

$('mySelector').unbind('click'); 

摆脱所有点击处理程序。如果您的脚本在之后加载另一个(似乎是这种情况),那么应该这样做。但请注意,它会解除所有“单击”处理程序的绑定,因此请确保在添加自己的处理程序之前调用该处理程序。

1

如果你不能保证你的处理程序首先连接,请尝试以下代码:

var events = $('mySelector').data("events"); //all handlers bound to the element 
var clickEvents = events ? events.click : null;//all click handlers bound to the element 
$('mySelector').unbind('click');    //unbind all click handlers 
//bind your handler 
$("mySelector").click(function(e) { 
    if (myCondition) { 
     //do what you want 
    } else { 
     //call other handlers 
     if (clickEvents) { 
      for (var prop in clickEvents) 
       clickEvents[prop].call(this, e); 
     }   
    } 
}) 

更新:

  • 上面的代码的jQuery 1.3.2
  • 以上代码基于jQuery 1.3.2的内部实现,因此请在更新jQuery时仔细检查。