.length 是你调试 jQuery 的朋友。因为即使:
document.getElementById('nonexistent');
将在 JavaScript 中返回 null,使用 jQuery 选择器将返回一个对象并强制转换 true:
if(!document.getElementById('nonexistent')) {
alert('not here!');
}
if(!$('#nonexistent')) {
alert('here, here!');
}
这意味着:
$('#nonexistent').doSomething().doSomethingElse().whatever();
可能不会抛出错误,因此您将很难知道链中什么“不起作用”。
但是,检查对象长度是可行的:
if(!$('#nonexistent').length) {
alert('not here!');
}
jQuery 被设计为静默失败,因为它的核心用例之一是链接。如果选择器或原型方法会在链中返回 null 或 false,那么使用 jQuery 会比大多数没有经验的程序员想要的更频繁地抛出 null-reference 错误。
更新
如果处于调试模式,您可能可以通过修改原型来进行自己的调试。我试过这个:
var debug = ['hide','show'], // Array of jQuery methods to debug
i = 0, name;
for(; debug[i]; i++) {
name = debug[i];
if (typeof $.fn[name] == 'function') {
$.fn[name] = (function(name, fn) {
return function() {
if ( !this.length ) {
console.warn('No elements selected when calling '+name);
}
fn.apply(this, Array.prototype.slice.call( arguments ));
};
}(name, $.fn[name]));
}
}
现在,每当我调用“隐藏”时,如果链中没有元素,它会警告我:
$('#nonexistent').hide(); // consoles a warning
小提琴:http://jsfiddle.net/B4XQx/