【问题标题】:Shortest way of attaching multiple DOM elements to one event handler using Jquery?使用 Jquery 将多个 DOM 元素附加到一个事件处理程序的最短方法?
【发布时间】:2011-02-10 03:09:57
【问题描述】:

我需要使用 jQuery 将单个事件处理程序附加到多个 DOM 元素。我目前正在使用 jQuery 的 each() 方法来实现这一点。见下文:

$([elm1, elm2, elm3]).each(function() {
  this.click(eventHandler);
});

我想知道是否有一种方法可以在不使用 each 方法和闭包的情况下做到这一点。我以为我可以做类似的事情:

$(elm1, elm2, elm3).click(eventHandler);

这种语句在 Prototype.js 中有效,但在 jQuery 中无效。我问这个问题的原因是因为在同时使用 Prototype.js 和 jQuery 之后,我发现 jQuery 需要更简单的语句才能在几乎每个领域实现相同的任务所以我认为必须有更好的方法来做到这一点?


更新

经过一些调试,结果发现我最初尝试使用的是:

$([elm1, elm2, elm3]).click(eventHandler);

失败是因为变量 elm1、elm2 和 elm3 是使用 jQuery 的 $ 函数创建的。所以问题已经改变了,为什么以下方法不起作用:

var elm1 = $('#elm1');
var elm2 = $('#elm2');
var elm3 = $('#elm3');

$([elm1, elm2, elm3]).click(eventHandler);

但使用 DOM 可以做到以下几点:

var elm1 = document.getElementById('elm1');
var elm2 = document.getElementById('elm2');
var elm3 = document.getElementById('elm3');

$([elm1, elm2, elm3]).click(eventHandler);

【问题讨论】:

  • @Camsoft:正如你所说,elm1 elm2 elm3 是使用$ 创建的(意味着动态),你可以像我之前提到的那样为它们使用 jquery 的实时功能。
  • @Sarfra 好吧,看来我不完全理解 jQuery 在这里做什么。基本上,变量 elm1、elm2 和 elm3 是函数参数,因此它们可能是本机 DOM 对象或 jQuery 版本,具体取决于调用函数时使用的内容。

标签: jquery events event-handling prototypejs


【解决方案1】:

这应该可以解决问题:

$([elm1, elm2, elm3]).bind('click', function(){
    // your code here.....
});

JQuery 甚至可以让上述代码更短,因此您可以在此处省略 bind

$([elm1, elm2, elm3]).click(function(){ 
  // your code here
});

【讨论】:

  • 那行不通。 $ 接受两个参数,一个元素/选择器和一个上下文。 OP 对$([...]) 提出了正确的想法。而且,顺便说一句,$().click(...)$().bind('click', ...) 完全相同。
  • 您不能在元素数组上调用live。它们是否是动态生成的没有区别。
  • 另外值得注意的是,您的 .live() 示例不起作用。他使用的是 DOM 元素,而不是选择器,并且 .live() 完全脱离选择器进行操作,请阅读 .live() 文档的警告部分了解详细信息:api.jquery.com/live
【解决方案2】:

您可以像这样尽可能短地执行此操作:

$([elm1, elm2, elm3]).click(eventHandler);

当您去掉数组的括号时,您调用的是 different overload of jQuery(),括号中您将 1 个参数作为数组传递,因此您调用的是 jQuery(elementArray) 构造函数。

【讨论】:

  • 奇怪,因为这是我尝试的第一件事。我知道 jQuery 函数的第二个参数是作用域,所以我已经尝试将数组中的元素作为第一个参数传递,但我无法让它工作。 ?
  • 好像我发现了什么不起作用。当我传递使用 document.getElementById() 实例化的 DOM 元素时,似乎上述工作正常,但我实际上是使用 $('#elm1') 等传递 jQuery 版本。
  • @Camsoft - 在这种情况下,elem1.add(elem2).add(elem3) 但我会看看你是如何开始收集这个集合的,可能会在那里缩短它。你也可以$("#elem1, #elem2, #elem3")
  • 我会这样做 $("#elem1, #elem2, #elem3") 但 DOM 元素是函数变量而不是字符串。
  • @Camsoft - 你也可以这样做:$([elm1[0], elm2[0], elm3[0]]),但我认为它的可读性不如.each()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-29
  • 1970-01-01
  • 2011-02-07
  • 1970-01-01
  • 2015-07-15
相关资源
最近更新 更多