1

这个问题是参考这个 jQuery 限制插件。这是来源:

(function($){ 
    $.fn.extend({  
        limit: function(limit,element) {
            var interval, f;
            var self = $(this);

            $(this).focus(function(){
                interval = window.setInterval(substring,100);
            });
            $(this).blur(function(){
                clearInterval(interval);
                substring();
            });

            substringFunction = "function substring(){ var val = $(self).val();var length = val.length;if(length > limit){$(self).val($(self).val().substring(0,limit));}";

            if(typeof element != 'undefined')
                substringFunction += "if($(element).html() != limit-length){$(element).html((limit-length<=0)?'0':limit-length);}"

            substringFunction += "}";
            eval(substringFunction);
            substring();            
        } 
    }); 
})(jQuery);

现在我可能只是在这里吹毛求疵......但也许我错过了一些东西。以下是我的问题/疑虑:

1)在字符串中创建子字符串函数然后eval'ing它的目的是什么?仔细看,如果函数正常初始化,扩展似乎可以正常工作。

2)我不喜欢它使用 asetInterval来执行子字符串函数。难道一个keypress或类似的事件不是更好、更合乎逻辑的方式吗?此外,我认为这是(或至少启用)v1.2 更改日志中引用的“闪烁文本”错误的原因(不,它没有修复)。

3)为什么要f初始化变量?它从未被使用或引用过。

4)另外,这不是一个可链接的方法,作为一个 jQuery 扩展,它应该是。我对编写 jQuery 扩展不太熟悉,但这可以通过return this;在方法结束时完成,对吗?

看起来这只是一个糟糕的编程案例,但我想得到一个外界的意见。

4

1 回答 1

1

1) 我同意。看起来他不理解我的关闭。

2) 很难准确预测哪些事件可能会改变文本框的内容。按键很明显,但也许鼠标事件也可以做到。它也可以由其他 Javascript 函数更新。

3)我有几个猜测:a)当他试图让闭包工作时,他正在使用它来保存回调函数,并且在切换到 eval kludge 时没有删除声明;b)它应该保存子字符串函数字符串,但是他犯了一个错误并substringFunction在分配它时调用了它(注意他忘记了var那里的声明)。

4) 对。

仅仅因为有人将他们的代码发布到网站并不意味着他们是专家。

于 2012-10-09T01:06:30.560 回答