【问题标题】:Multiple selectors: identify the triggering one?多个选择器:识别触发的选择器?
【发布时间】:2010-11-30 14:57:30
【问题描述】:

这是一个我无法弄清楚的非常小的问题。我敢肯定有人可以立即回答:

拥有多个选择器,例如

$('a.button, span.xyz, a.another').click(function(e) {
   var clicked_element = ???;
});

,我如何才能确定实际点击了哪个选择器?我需要像$(clicked_element)... 一样使用它。

谢谢。

【问题讨论】:

    标签: javascript jquery-selectors jquery


    【解决方案1】:

    使用 $(this) 可以获得被点击的元素。使用 is() 可以帮助你确定点击了什么。

    $('a.button, span.xyz, a.another').click(function(e) {
      if ($(this).is("a.button")) {
        alert("a.button was clicked");
      } else if ($(this).is("span.xyz")) {
        alert("span.xyz was clicked");
      } else if ($(this).is("a.another")) {
        alert("a.another was clicked");
      }
    });
    

    已编辑:

    当我写下这个答案时,似乎有更好的方法。 Patrick DW 的评论引起了我的兴趣,我想知道更多。他的澄清在这里jQuery - Issues with combining selectors in a single event handler

    这将是一个更好的方法

    $("a.button").click(function(e) { ... });
    $("span.xyz").click(function(e) { ... });
    $("a.another").click(function(e) { ... });
    

    据我了解,如果您的目标是将通用功能放在一个位置,那么应该这样处理

    function commonFunctionality(elementSelector) {
      // common code for all elements here or at the end
    
      switch (elementSelector) {
        case "a.button":
          //do stuff for a.button only;
          break;
        case "span.xyz":
          //do stuff for span.xyz only;
          break;
        case "a.another":
          //do stuff for a.another only;
          break;
      }
    
      // common code for all elements
    }
    
    
    $("a.button").click(function(e) { ... });
    $("span.xyz").click(function(e) { ... });
    $("a.another").click(function(e) { ... });
    

    【讨论】:

    • @bobsoap。欢迎您,请不要忘记接受正确答案。
    • 问题在于它有效地将.delegate() 遭受的低效率(针对选择器进行测试)与分配多个冗余处理程序的低效率相结合。所以你得到了两全其美。
    • @Patrick DW... 你能解释更多吗?我相信你说我应该将点击处理程序分解成单独的语句?它是否正确?如果是,为什么?
    • @Patrick DW ...我在这里发布了一个问题,希望您能就这些低效率问题得到解答。你能详细解释一下吗stackoverflow.com/questions/4315308/…
    • @bobsoap... 阅读我编辑的答案会很好,因为它可以更深入地了解您的问题。如果您对@Patrick DW 对他对这个问题的回答给予肯定,那也很好。 stackoverflow.com/questions/4315308/…
    【解决方案2】:

    触发事件的元素在函数中可用$(this),即

    $('a.button, span.xyz, a.another').click(function(e) {
       var clicked_element = $(this);
    });
    

    您还可以使用is() 测试以确定元素是否与特定选择器匹配:

    if ($(this).is('a.button'))) { ... }
    

    【讨论】:

    • 对...但是我需要在 if 条件下使用它,并且希望避免使用 hasClass 左右。我需要做类似if(clicked_element == 'a.button') {} else if(clicked_element == 'span.xyz') 的事情。抱歉,如果不清楚。
    • 如果你真的想为每个元素做不同的事情,我建议你为每个元素绑定一个不同的点击处理程序!
    • @bobsoap - 我同意德克斯特的观点。如果这些元素要具有不同的功能,那么我会分配不同的处理程序,而不是增加在每个事件中测试每个处理程序的开销。如果有一些通用功能,则将其放入它自己的函数中,并从各个处理程序中调用它。如果这些都在同一个容器中,那么事件委托可能是更好的解决方案。这样一来,您就可以将测试元素的开销换成更少的处理程序。
    【解决方案3】:

    如果这些元素具有不同的功能,我会同意 Patrick 和 Dexter 的观点。但是,如果您要使用此方法,请尝试使用一些内置的 javascript 方法。我不知道 HTML 标记是什么样的,但假设有这个标记,你可以试试下面的脚本:

    <a class="button" href="http://somesite.com">Some Site</a>
    <span class="xyz">span</span>
    <a class="another" href="/topics/topic2.html">Topic 2</a>
    
    $('a.button, span.xyz, a.another').click(function(e) {
       var clicked = 'a.another';
       if (this.tagName == "SPAN") { clicked = 'span.xyz'; }
       if (this.href.match('somesite')) { clicked = 'a.button'; }
       // Do something
    });
    

    【讨论】:

    • 这类似于我在 Johns 附加帖子上的回答。我非常同意,使用本机 dom 脚本来处理这种类型的代码会非常快,而且通常也更容易理解。
    猜你喜欢
    • 2015-06-16
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多