2012-10-09 52 views
1

這個問題是參照this jQuery limit plugin。這裏的來源: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?仔細看看,如果函數正常初始化,擴展看起來好像很好。

2)我不喜歡它使用setInterval來執行子字符串函數。 keypress或類似事件不會是更好,更合乎邏輯的方式來做到這一點嗎?另外,我認爲這是導致(或至少啓用)v1.2 change log中引用的「閃爍文本」錯誤的原因(不,它不是固定的)。

3)爲什麼初始化變量f?它從不使用或引用。

4)另外,這不是一個可鏈接的方法,作爲一個jQuery擴展,它應該是。我對編寫jQuery擴展不太熟悉,但是可以通過在方法結尾處的return this;完成,對嗎?

看起來這只是一個糟糕的編程案例,但我想獲得外部意見。

回答

1

1)我同意。看起來他不明白我的封閉。

2)很難準確預測哪些事件可能會改變文本框的內容。按鍵是顯而易見的,但也許鼠標事件也可以做到這一點。它也可以通過其他Javascript函數進行更新。

3)我有兩個猜測:a)他正在使用它來保持回調函數,當他試圖讓封閉工作,並沒有刪除聲明,當他切換到評估kludge; b)它應該保存子串函數字符串,但他犯了一個錯誤,並在他分配它時調用它substringFunction(注意他忘記了var聲明)。

4)對。

僅僅因爲有人將他們的代碼發佈到網站並不意味着他們是專家。

+0

2)好點。複製/粘貼會繞過'keypress',但我認爲'change'事件仍然會觸發,所以我會嘗試綁定兩者。無論如何,我想擺脫'setInterval',所以我將不得不玩弄事件。 3)我沒有注意到'var'的缺失,它確實困擾着我的窗口對象。呸。 非常感謝。 – tomaroo