JQuery скрывает простые ошибки JavaScript - PullRequest
5 голосов
/ 06 октября 2011

Я использую JQuery и flot в Chrome и Firefox.Работая над своим кодом, я обнаруживаю, что молча происходит сбой при выполнении таких глупых вещей, как доступ к несуществующим хеш-структурам и т.я не вижу никаких ошибок.

Любые указатели о том, как обойти это без общего хак-н-слэша, чтобы изолировать, где простая ошибка?

jshint не был слишком полезным.

- edit -

больше отладки показывает тенденцию.

Я в основном нахожу опечатки (неопределенные переменные) и преждевременную выборку свойств объекта до того, как они существуют.Использование .hasOwnProperty () помогло, но обременительно.Я думаю, что где-то видел удобную утилиту, которая помогает лаконично тестировать глубокие структуры.

Ответы [ 2 ]

3 голосов
/ 06 октября 2011

.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/

0 голосов
/ 06 октября 2011

здесь есть обходной путь:

jQuery ошибка на нулевом селекторе

но я сомневаюсь, что это действительно то, что вы хотите-

...