2011-10-23 79 views
0

我是新來的jQuery和我試圖用這個代碼字符計數器添加到文本字段:jQuery的:JavaScript錯誤「錯誤:TA沒有定義」

$(function(){ 
    $('.content').keypress(function(){ 
     ta = $(this); 
     if(ta.val().length >= 350){ 
      ta.val(ta.val().substr(0, 350)); 
     } else { 
      $("#counter span").text(350-ta.val().length); 
     } 
    }); 
}); 

setInterval('$("#counter span").text(350-ta.val().length);', 350); 

HTML(與Rails代碼)

<div> 
<%= f.label :content, "Content" %><br /> 
<%= f.text_area :content, :class => "content" %><br /> 
<div id="counter"><span>350</span> characters remaining.</div> 
</div> 

我不斷收到JavaScript錯誤:

"Error: ta is not defined" 

,並指出我在我的代碼這個特定行。

setInterval('$("#counter span").text(350-ta.val().length);', 350); 

任何深入瞭解發生了什麼,以及如何解決這將非常感激,因爲我想在其他文本字段多個計數器添加到網站的其他地方。

謝謝。

+0

不要將字符串傳遞給'setInterval'。 – SLaks

+0

爲什麼不呢?你能爲我做我應該做的嗎? –

+0

在按鍵按下ta之前,您正在運行setinterval。 – scrappedcola

回答

1

只有第一次按鍵時纔會定義ta。所以之前的時間間隔會出錯。你也應該把setInterval行放在$()函數中。按鍵

$(function(){ 
    ta = $(".content"); 

    $('.content').keypress(function(){ 
     ta = $(this); 
     if(ta.val().length >= 350){ 
      ta.val(ta.val().substr(0, 350)); 
     } else { 
      $("#counter span").text(350-ta.val().length); 
     } 
    }); 

    setInterval('$("#counter span").text(350-ta.val().length);', 350); 
}); 

但是,我不確定爲什麼你有setInterval當你的按鍵事件函數似乎做倒計時所需的所有功能。

+0

感謝您的幫助,任何機會,你可以告訴我一個工作版本沒有setInterval? –

+0

當然,這裏是一個工作jsfiddle http://jsfiddle.net/daFbZ/1/我已經改變了你的按鍵到一個keyup按鍵導致減少一個。 –

3

你得到這個錯誤的原因是因爲你還沒有定義的TA

改變這一點:

ta = $(this); 

這樣:

var ta = $(this); 

也,傳你想要的代碼在像這樣的匿名函數中進入setInterval:

setInterval(function() 
{ 
    $("#counter span").text(350 - ta.val().length); 
}, 350); 

但是,還有一個問題。 setInterval調用的匿名函數的作用域不包含ta ...因此,您將無法引用ta.val().length。您需要在文檔之外聲明ta,並將其設置在裏面,這樣才能確保該變量的範圍是正確的。

編輯:

var taLength = 0; 
$(function(){ 
    $('.content').keypress(function(){ 
     var ta = $(this); 
     if(ta.val().length >= 350){ 
      ta.val(ta.val().substr(0, 350)); 
     } else { 
      $("#counter span").text(350-ta.val().length); 
     } 
     taLength = ta.val().length; 
    }); 
}); 

setInterval(function() 
{ 
    $("#counter span").text(350 - taLength); 
}, 350); 
0

也許你正在你的性格計數器在錯誤的道路:

你不能讓一個setInterval功能運行所有的時間在現場數字符,你應該做到這一點:

$(function(){ 
    $('.content').keypress(function(){ 
     var ta = $(this); 
     if(ta.val().length >= 350){ 
      ta.val(ta.val().substr(0, 350)); 
     } else { 
      $("#counter span").text(350-ta.val().length); 
     } 

     $("#counter span").text(350 - ta.val().length); 
    }); 
}); 
0

TA沒有定義,直到裏面的按鍵()的匿名功能,因此你不能用它那功能之外。

你可以重新寫你的代碼,像這樣:

setInterval('$("#counter span").text(350-$(\'.content\').val().length);', 350); 

我建議你刪除setInterval的使用,而不是僅僅更新每個按鍵之後的字符數。雖然,您必須考慮其他情況,例如粘貼文本等。

相關問題