定义许多JQuery事件处理程序“昂贵吗?”内部在C / C ++或JavaScript级别实现?

时间:2010-05-31 17:16:42

标签: javascript jquery events javascript-events

我有一个很长的网络表单。我想知道我是否应该单独bind()到每个元素(我真正想要的)或者我应该只定义一个bind()所有的输入元素然后在处理程序中执行if-then来处理特定的元素? / p>

2 个答案:

答案 0 :(得分:3)

jQuery的事件处理程序是用JavaScript实现的(它们必须是)。

通常,最好对整个表单使用单个处理程序,而不是使用大量单个元素。但是jQuery的live功能可以提供很多帮助,它为你做了大量的事件代理管道工作。例如:

$("#formid input").live('focus', function(event) {
    var field = $(this);
    // `field` now references the field that was focussed
});

...观看formid表单中的所有字段以进行焦点事件。如果你正在使用jQuery 1.4,那么即使focus事件没有冒泡,它也能用于focus事件,因此使用事件委托通常很棘手。在1.4之前不起作用,但是像click这样的冒泡事件就是这样做的。

答案 1 :(得分:0)

我会绑定到所有输入,但您可以使用类将其缩小到您想要的输入。

而不是

$("#formid input").click(function() { 
  if($(this).attr('something') == 'special_field') {
    //do A
  }
});

为您感兴趣的元素<input class='special_field' ... >添加一个类,然后更改您的选择器:

$("#formid input.special_field").click(function() { 
    //do A
});

这将把处理程序限制为只有所需的元素,而不进行任何if语句检查。

您可以对需要特殊处理的任何事情重复此操作。

关于.live()方法的最终说明。由于几个原因,这可能非常方便:

  1. 它实际上并没有为每个匹配的元素创建一个绑定,它默认在body元素上创建一个监听器(你可以选择另一个元素作为监听器)并等待一个偶数冒泡到它。当它冒泡时,它会针对选择器检查触发的元素,如果匹配则触发事件。
  2. 因为事件触发时应用了选择器,这意味着通过Javascript或AJAX添加的新元素将触发代码而无需绑定或重新绑定它们。
  3. 对于许多元素,有一个监听器,对于大型集合,它可以更快。