2011-10-23 57 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的使用,而不是仅仅更新每个按键之后的字符数。虽然,您必须考虑其他情况,例如粘贴文本等。

相关问题