目前,我们正在从一个用于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
不存在的元素上声明的基本侦听器?我们应该只是声明上面的初始简单形式,并将其留在那里,或者首先检查元素以某种方式为我们节省一些宝贵的资源和/或避免一些我们没有看到的隐藏错误?还是我还缺少另一个角度?
谢谢!
答案 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);
}