Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jQuery:使用相同事件函数的两个元素_Javascript_Jquery_Events_Javascript Events - Fatal编程技术网

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的退路,是吗?