JSLint показывает так много ошибок, но моя программа работает нормально - PullRequest
2 голосов
/ 03 ноября 2010

Я попытался проверить свой код JQuery из JSLint и получил много ошибок. Пожалуйста, дайте мне знать, как исправить.

Ниже приведен код надежности пароля

    $.fn.passwordstrength = function(options){
                    return this.each(function(){
                    var that = this;that.opts = {};
                    that.opts = $.extend({}, $.fn.passwordstrength.defaults, options);

                    that.div = $(that.opts.targetDiv);
                    that.defaultClass = that.div.attr('class');

                    that.percents = (that.opts.classes.length) ? 100 / that.opts.classes.length : 100;

                    v = $(this)
                    .keyup(function(){
                    if(typeof el == "undefined")
                    this.el = $(this);
                    var s = getPasswordStrength(this.value);
                    var p = this.percents;
                    var t = Math.floor(s/p);
                    if(100 <= s)
                        t = this.opts.classes.length - 1;
                    this.div
                        .removeAttr('class')
                        .addClass( this.defaultClass )
                        .addClass( this.opts.classes[ t ] );

                })
            });

            function getPasswordStrength(H){
                var D=(H.length);
                if (D<4){ 
                    D=0;
                }
                if(D>5){
                    D=5;
                }
                // This is patern for non-numeric characters
                var F=H.replace(/[0-9]/g,"");
                var G=(H.length-F.length);
                if(G>3){
                    G=3;
                }
                // This is patern for uppercase and lowercase evaluation 
                var A=H.replace(/\W/g,"");
                var C=(H.length-A.length);
                if(C>3){
                    C=3;
                }

                var B=H.replace(/[A-Z]/g,"");
                var I=(H.length-B.length);
                if(I>3){
                    I=3;
                }

                // This is patern for Special Characters
                var P=H.replace(/^[@#$^&]*$/,"");
                var Q=(H.length-P.length);
                if(Q>3){
                    Q=3;
                }

                var E=((D*10)-20)+(G*10)+(C*15)+(I*10)+(Q*10);
                if(E<0){
                    E=0;
                }
                if(E>100){
                    E=100;
                }
                return E;
            }

            function randomPassword() {
                var chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$_+";
                var size = 10;
                var i = 1;
                var ret = "";
                while (i <= size) {
                    $max = chars.length-1;
                    $num = Math.floor(Math.random()*$max);
                    $temp = chars.substr($num, 1);
                    ret += $temp;
                    i++;
                }
                return ret;
            }

        };

        $(document)
        .ready(function(){
            $('input[name="password"]').passwordstrength({targetDiv: '#pwd_strength',classes : Array('weak','medium','strong','complex')});

        });

Ответы [ 3 ]

2 голосов
/ 03 ноября 2010

Ваши ошибки - это ошибки стиля, JSLint не нравится:

if(condition) thing();

Он хочет видеть if() с {}, например:

if(condition) { thing(); }

Комуустраните любую двусмысленность, например:

if(condition)
thing();
otherThing();

otherThing() выполняется независимо от условия, но это не ясно с первого взгляда, тогда как это:

if(condition) {
  thing();
}
otherThing();

Также ему не нравятся необязательные точки с запятой (и я тоже не использую их, черт возьми!), Всегда включайте их, и это просто стиль: он хочет видеть внутреннюю функцию getPasswordStrength, объявленную в верхней части своего родителя.

Ваша программа в порядке и будет работать нормально, вы решаете, насколько важна проверка JSLint.

0 голосов
/ 07 ноября 2010

Вот «фиксированный» код.Я удалил функцию randomPassword, потому что она не указана в вашем коде.

/*global $:false, document:false, el:true*/

$.fn.passwordstrength = function(options){
    function getPasswordStrength(H){
        var D=(H.length);
        if (D<4){ 
            D=0;
        }
        if(D>5){
            D=5;
        }
        // This is patern for non-numeric characters
        var F=H.replace(/[0-9]/g,"");
        var G=(H.length-F.length);
        if(G>3){
            G=3;
        }
        // This is patern for uppercase and lowercase evaluation 
        var A=H.replace(/\W/g,"");
        var C=(H.length-A.length);
        if(C>3){
            C=3;
        }

        var B=H.replace(/[A-Z]/g,"");
        var I=(H.length-B.length);
        if(I>3){
            I=3;
        }

        // This is patern for Special Characters
        var P=H.replace(/^[@#$\^&]*$/,"");
        var Q=(H.length-P.length);
        if(Q>3){
            Q=3;
        }

        var E=((D*10)-20)+(G*10)+(C*15)+(I*10)+(Q*10);
        if(E<0){
            E=0;
        }
        if(E>100){
            E=100;
        }
        return E;
    }

    return this.each(function(){
        var that = this;that.opts = {};
        that.opts = $.extend({}, $.fn.passwordstrength.defaults, options);

        that.div = $(that.opts.targetDiv);
        that.defaultClass = that.div.attr('class');

        that.percents = (that.opts.classes.length) ? 100 / that.opts.classes.length : 100;

        $(this).keyup(function(){
            if(typeof el == "undefined"){
                this.el = $(this);
            }
            var s = getPasswordStrength(this.value);
            var p = this.percents;
            var t = Math.floor(s/p);
            if(100 <= s){
                t = this.opts.classes.length - 1;
            }
            this.div
                .removeAttr('class')
                .addClass( this.defaultClass )
                .addClass( this.opts.classes[ t ] );

        });
    });
};

$(document).ready(function(){
    $('input[name="password"]').passwordstrength({targetDiv: '#pwd_strength',classes : Array('weak','medium','strong','complex')});
});
0 голосов
/ 03 ноября 2010

В вашем коде вы пишете

if(typeof el == "undefined")
this.el = $(this);

Мне кажется, что

if(typeof el == "undefined") {
    this.el = $(this);
}

будет лучше читать (если это то, что вы хотите, и вы не забыли что-то еще). Если впоследствии вы решите использовать некоторые инструменты минимизации для своего кода JavaScript, использование '{' и '}' может быть очень важно для получения всегда правильного рабочего кода.

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

return this.each(function(){
   // ...
})

Более того, я считаю полезным следовать советам о глобальных переменных $max, $num, $temp внутри функции randomPassword и добавлять var объявлений

var $max = chars.length-1;
var $num = Math.floor(Math.random()*$max);
var $temp = chars.substr($num, 1);

То же самое имеет смысл и для v и el внутри функции $.fn.passwordstrength. Если вы будете использовать

var v = $(this)

или

$(this)

(потому что вы не используете v в своем коде. Возможно, вы захотите использовать this.v, но вы должны знать это лучше меня) вместо

v = $(this)

и

if(typeof this.el == "undefined") {
    this.el = $(this);
}

вместо

if(typeof el == "undefined") {
    this.el = $(this);
}

ваша программа будет работать немного быстрее и будет иметь меньше потенциальных конфликтов из-за использования тех же глобальных переменных.

Удаление неиспользуемой функции randomPassword также может быть хорошей идеей.

Лично я нахожу JSLint очень хорошим, потому что он помогает находить небольшие ошибки, которые трудно найти вручную.

...