.length
ваш друг при отладке jQuery.Потому что даже если:
document.getElementById('nonexistent');
вернет null
в JavaScript, использование селектора 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 предназначен для автоматического сбоя, так как один из его основных сценариев использования цепочки.И если селекторы или методы-прототипы возвращали бы нуль или ложь в цепочке, использование jQuery приводило бы к ошибкам с нулевой ссылкой чаще, чем хотелось бы большинству неопытных программистов.
Обновление
Вы можете, вероятно, сделать свою собственную отладку, изменив прототипы, если в режиме отладки.Я попробовал это:
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]));
}
}
Теперь, когда я вызываю 'hide', он предупреждает меня, если в цепочке нет элементов:
$('#nonexistent').hide(); // consoles a warning
Fiddle: http://jsfiddle.net/B4XQx/