2

JSLint から JQuery コードを検証しようとしたところ、多くのエラーが発生しました。修正方法を教えてください。

これは、以下のパスワード強度メーター コードです。

    $.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')});

        });
4

3 に答える 3

2

あなたのエラーはスタイルエラーです、JSLintはこれを好きではありません:

if(condition) thing();

if()このように、で見たい{}です:

if(condition) { thing(); }

次のように、あいまいさを排除するには:

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

otherThing()条件に関係なく実行されますが、それは一見明確ではありませんが、これは次のとおりです。

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

また、オプションのセミコロンは好きではありません(そして、私もそうしません、それらを使用します!)、常にそれらを含めます、そしてこれは純粋なスタイルです:それはそのgetPasswordStrength親の上部で宣言された内部関数を見たいです。

プログラムは正常であり、正常に実行されます。JSLint検証がどれだけ重要かを決定します。

于 2010-11-03T11:51:23.927 に答える
0

あなたのコードであなたが書く

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

それは私には思われる

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

読みやすくなります(それがあなたが望むものであり、それ以上のことを忘れていない場合). 後で JavaScript コードにいくつかの最小化ツールを使用することにした場合、'{' と '}' の使用は、常に正しく機能するコードを受け取るために非常に重要です。

JavaScript ではステートメントの最後にセミコロンを書くのが良いスタイルなので、次のステートメントの後に推奨事項に従って配置しないのはなぜでしょうか?

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

さらに、関数内のグローバル変数$max, $num,に関するアドバイスに従い、宣言を追加するのが良いと思います$temprandomPasswordvar

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 は非常に優れていると思います。手動で見つけるのが難しい小さなエラーを見つけるのに役立つからです。

于 2010-11-03T12:29:02.670 に答える
0

これが「固定」コードです。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')});
});
于 2010-11-07T03:49:45.680 に答える