2011-06-20 165 views
0

在两个不同的事件处理程序之间共享一个函数的最佳方式是什么?我希望得到相同的结果,但需要根据哪个元素被点击,在函数中定义一些情况因变量。jQuery:使用相同事件函数的两个元素

我可以破解一个解决方案,但想知道这种情况下的最佳实践。简单的问题,必须有一个简单的答案...

var onMyEvent = function(e){ 
    if(click triggered from 'a'){ 
     //do that 
    } 
    if(click triggered from 'div'){ 
     //do that 
    } 
} 


$('a').click(onMyEvent); 
$('div').click(onMyEvent); 

FIDDLE:http://jsfiddle.net/f6C92/

回答

5

我猜会是几种方式来实现这一点,如检查e目标对象的变量等,但对于您的场景,最简单和最易读的将使用is()函数,您可以向其传递任何CSS选择器以测试感兴趣的对象是否与其匹配。

var onMyEvent = function(e){ 
    if($(this).is('a')){ 
     //do that 
    } 
    if($(this).is('div')){ 
     //do that 
    } 
} 


$('a').click(onMyEvent); 
$('div').click(onMyEvent); 

还有那些谁也认为,上述花费不必要的往返jQuery的,当你可以通过测试this.tagName == 'A'达到相同的,但我通常建议委托这些事情jQuery的为好,对于浏览器兼容性原因。

的另一个巧妙的方法是通过相关信息的事件数据:

var onMyEvent = function(e){ 
    if(e.data.type == 'a'){ 
     //do that 
    } 
    ... 
} 


$('a').click({ type: 'a' }, onMyEvent); 
$('div').click({ type: 'div' }, onMyEvent); 
+0

是,对于这种情况的最佳做法是什么? – wilsonpage

+0

我正在寻找像var a = b ||一样非常整齐的东西C; – wilsonpage

+1

@pagewil:不,不是,但不是,但你又不是试图追求最佳实践,因为如果你是的话,你会将相同的功能分开。然后,将元素传递给函数,而不是事件。 – Shef

1

事件的target属性将包含被点击的元素。在此updated fiddle中,我使用e.target.id提醒点击元素的id

1

这应该做的伎俩:

var onMyEvent = function(e) { 
    if (this.tagName == "A") { 
     alert("a"); 
    } else if (this.tagName == "DIV") { 
     alert("div"); 
    } 
} 
2

这取决于差异多么复杂的,但我真的不喜欢在处理程序检查元素类型。我可能会做这样的事情:

function doSomething(...){ 
    // do stuff 
} 


$('a').click(function(){ 
    // set some variables and send them as parameters to doSomething 
    doSomething(...); 
}); 

$('div').click(function(){ 
    // set some variables and send them as parameters to doSomething 
    doSomething(...); 
}); 

doSomething包含了常见的代码。

1
var onMyEvent = function(e){ 
    if(this.tagName == 'A'){ 
     alert("a"); 
    } 
    if(this.tagName == 'DIV'){ 
     alert("div"); 
    } 
} 

$('a').click(onMyEvent); 
$('div').click(onMyEvent); 

即使这会在我看来,工作,最好设置不同的处理程序,每个标签,并调用同一个函数里面,像kingjiv建议

相关问题