Javascript jQuery:使用相同事件函数的两个元素
在两个不同的事件处理程序之间共享一个函数的最佳方式是什么?我希望得到相同的结果,但需要根据单击的元素在函数中定义一些情况相关变量 我可以破解一个解决方案,但我想知道这种情况下的最佳实践。简单的问题必须有一个简单的答案 示例Javascript jQuery:使用相同事件函数的两个元素,javascript,jquery,events,javascript-events,Javascript,Jquery,Events,Javascript Events,在两个不同的事件处理程序之间共享一个函数的最佳方式是什么?我希望得到相同的结果,但需要根据单击的元素在函数中定义一些情况相关变量 我可以破解一个解决方案,但我想知道这种情况下的最佳实践。简单的问题必须有一个简单的答案 示例 var onMyEvent = function(e){ if(click triggered from 'a'){ //do that } if(click triggered from 'div'){ //do
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:我想有几种方法可以实现这一点,比如检查目标对象的
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);
有人会争辩说,当您可以通过测试this.tagName==“A”
来实现同样的目标时,上述操作需要到jQuery进行不必要的往返,但出于浏览器兼容性的原因,我通常也建议将这些任务委托给jQuery
另一个简洁的方法是将相关信息作为事件数据传递:
var onMyEvent = function(e){
if(e.data.type == 'a'){
//do that
}
...
}
$('a').click({ type: 'a' }, onMyEvent);
$('div').click({ type: 'div' }, onMyEvent);
事件的
target
属性将包含已单击的元素。在本例中,我使用e.target.id
警告单击元素的id
,这应该可以做到:
var onMyEvent = function(e) {
if (this.tagName == "A") {
alert("a");
} else if (this.tagName == "DIV") {
alert("div");
}
}
这取决于差异有多复杂,但我并不喜欢在处理程序中检查元素类型。我可能会这样做:
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
包含公共代码
var onMyEvent = function(e){
if(this.tagName == 'A'){
alert("a");
}
if(this.tagName == 'DIV'){
alert("div");
}
}
$('a').click(onMyEvent);
$('div').click(onMyEvent);
即使在我看来这会起作用,最好为每个标记设置一个不同的处理程序,并在其中调用相同的函数,就像kingjiv建议的那样这是这种情况下的最佳实践吗?我正在寻找一些非常简洁的方法,比如var a=b | c@pagewil:不,不是这样,但你也不是在追求最佳实践,因为如果你是,你会把相同的功能从那个功能中分离出来。然后,将元素传递给函数,而不是事件。@shef你的意思是像@kingjiv的例子吗?@pagewil:是的!我只是好奇,为什么您要监听
div
元素上的click
事件?你不是在考虑一个没有JS的退路,是吗?