如果调用Javascript事件监听器并且缺少目标元素会发生什么?

时间:2012-03-28 19:14:07

标签: javascript javascript-events jquery

目前,我们正在从一个用于Rails项目的common.js文件中加载站点范围的事件监听器。我们知道(大部分)那里涉及的权衡,并且只是试图减轻它们。一旦我们的基本架构成立,我们可以通过控制器或视图将它们移到单独的文件中。

目前,快速的问题是我们如何才能在必要时激活它们,这会引发错误的伪禅问题:

如果在森林中声明事件监听器时没有人在身边听到它,它是否仍会发出声音?

换句话说,如果在给定页面的javascript中声明一个基本监听器(即,没有像.live().delegate()这样的持久性),并且目标元素实际上不存在于该给定页面,除了用于评估它和检查元素的DOM的几个周期之外,是否真的发生了什么?它在内存中是否活跃,正在寻找那个元素?别的什么?它似乎永远不会抛出一个有趣的错误,因为在其他情况下,这样的调用会产生null / nil / invalid类型的错误。

例如:

  $(document).ready(function () {
      $('#element').bind('blur keyup', function);
    }

假设#element不存在。有什么事真的发生吗?此外,最好将它包装在预过滤器中,如:

  $(document).ready(function () {
    if ($('#element')) {
      $('#element').bind('blur keyup', function);
    }

或者,浏览器中的.js解释器是否足够智能,只是忽略在$(document).ready不存在的元素上声明的基本侦听器?我们应该只是声明上面的初始简单形式,并将其留在那里,或者首先检查元素以某种方式为我们节省一些宝贵的资源和/或避免一些我们没有看到的隐藏错误?还是我还缺少另一个角度?

谢谢!

2 个答案:

答案 0 :(得分:4)

JQuery旨在与0多个选定元素一起使用 如果没有选择任何元素,则不会发生任何事情。

请注意,使用jQuery选择器时永远不会为null。例如:

$('#IDontExist') // != null
$('#IDontExist').length === 0 // true (it's ajQuery object with 
                              //       zero selected elements).

docs说:

  

如果没有元素与提供的选择器匹配,则新的jQuery对象为“空”;也就是说,它不包含任何元素,并且.length属性为0。

答案 1 :(得分:2)

$('#element')如果结果为空集,那么jQuery将不会做任何事情。

由于jQuery总是返回一个对象,我们可以在空集上调用方法,但在内部它会在应用它的逻辑之前进行检查。

即使您想在附加事件处理程序之前检查元素是否存在,您也可以使用jQuery对象的length属性。

if ($('#element').length > 0) {
    $('#element').bind('blur keyup', function);
}