2009-11-25 35 views
9

我有这样的代码:我可以在jQuery事件中包装javascript事件吗?

<html> 
<head> 
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> 
    <script type="text/javascript"> 
     $(function(){ 
      $('a.one').click(function(event){ 
       event.preventDefault(); 
      }); 
     }); 
     function test(event){ 
      event.preventDefault(); 
     } 
    </script> 
    <style type="text/css"> 
     a.test { font-weight: bold; } 
     body { font-family:sans-serif; background-color:#AAAAAA;} 
    </style> 
</head> 
<body> 
    <a class="one" href="http://jquery.com/">jQuery</a> 
    <br/> 
    <a class="two" href="http://stackoverflow.com/" onclick='test(event)'>stack overflow</a> 
</body> 
</html> 

的测试功能不起作用,因为它现在站立,因为常规的JavaScript事件不支持jQuery的事件的preventDefault功能。有什么方法可以在jQuery事件中封装常规的JavaScript事件,以便我可以使用例如的preventDefault?

回答

11

试试这个:

function test(e) { 
    $.Event(e).preventDefault(); 
} 

Event object

+3

这确实可以让你访问一些方法,但不是一个“正常的”JQuery事件......例如,你不能使用:$ .Event(e)。其中 – 2011-04-01 16:30:33

+1

$ .Event(e)确实实现了preventDefault,stopPropagation,并stopImmediatePropagation。 https://github.com/jquery/jquery/blob/master/src/event.js#L664 – 2013-09-27 22:54:09

0

我认为这可能是事实,你通过onclick ='test(event)'传递事件。我认为onclick ='test'就足够了。但我可能是错的。

+1

没关系。它在IE和其他浏览器的'event'参数上选取'event'全局,并将其传递给该函数,以便它不必执行通常的'if(!e)e = window.event' IE解决方法。 – bobince 2009-11-25 11:14:04

0

是(见Darin的答案)。你也可以解决IE缺乏的preventDefault而不是(这基本上是什么jQuery是做):

if ('preventDefault' in event) 
    e.preventDefault(); 
else 
    e.returnValue= false; 
0

当你只是想执行JavaScript - 而不是重定向 - 在点击HREF使用的时候“返回false”您的点击功能。例如:

$(function(){ 
     $('a.one').click(function(event){ 
       var condition = confirm('Do you want to redirect to ...?'); 
       return condition == true; 
     }); 
}); 

如果您不希望链接重定向,请使用'javascript:void(0);'作为href属性,所有浏览器仍然会将其渲染为链接而不是锚点(某些IE版本会这样做)。

5

我发现在一个jQuery事件来包装本地事件的最好办法是fix

event = $.event.fix(event); 

请注意,这个功能是不是公共API的一部分(虽然它确实应该) 。

相关问题