2012-08-07 33 views
4

我无法弄清楚为什么我的JavaScript不能正常工作。它与j Query以及它应该选择所有的文本区域标签,然后为每个文本区域统计输入的字符数量,然后不允许用户在达到最大长度后再输入字符数量,还显示字符计数器在每个文本区域框下。 它所做的只是显示剩余的字符,但在按下每个键后不会递减,并且在达到最大长度时也不会停止。它也不会选择所有的文本区域,只需要找到它的第一个区域。使用jQuery的TextArea字符计数器

这里是我的TextAreaCounter.js

$(document).ready(function){ 
var $texts = $('textarea[maxlength]'); 
$texts.each(function){ 
    $var $this = $(this), 
    max = $(this).attr('maxlength'), 
    textId = $(this)attr.('id'), 
    $parent = $this.parent(), 
    countId = textId+'-count'; 

$div = $('<div>Characters Remaining: </div>').addClass('count-down').insertAfter($this); 
$input = $('<input></input>').attr({ 
    type:"text", 
    readOnly: "readOnly", 
    value: max, 
    id: countId 
    }).css({ 
     width: "25px" 
     marginTop: "5px" 
     marginBottom: "10px" 
    }).addClass('readOnly').appendTo($div); 

$this.on({ 
    keyup: function(){ 
    val = $this.val(), 
    countVal = $('#'+countId).val(), 
    if(val.length > max){ 
     $this.val(val.substr(0,max)); 
     alert('Max length exceeded: ' +max); 
     return false; 
    }else{ 
     $('#'+countId).val(max-val.length); 
    } 
    }, 
    blur: function(){ 
    val=$this.val(); 
    if(val.length > max){ 
     $this.val(val.substr(0,max)); 
     alert('Max length exceeded: ' +max); 
     return false; 
    }else{ 
     $('#'+countId).val(max-val.length); 
    } 
    } 
}); 
}); 
}); 

当我加了一些警示,在这里的代码没有显示,它表明,它没有得到与keyup事件的this.on部分。 我将这个外部js文件包含到一个jsp文件中,该文件是我的页面制作的,并且有我的文本区域。 我还为textarea元素添加了一个id和maxlength属性。 任何帮助将是伟大的谢谢你。

+0

噢,抱歉,这只是在问题 – Sheldor 2012-08-07 04:53:09

+0

注意一个错字是截断的字符串返回允许的最大长度为用户类型是非常笨重 - 更好的改变背景颜色或以其他方式将其突出显示为错误并将其留给用户修复。否则当用户尝试编辑字段的开始或中间时,用户会感到困惑,并开始删除_end _...中的多余字符。 – nnnnnn 2012-08-07 04:56:47

回答

1

哦,天哪 - 唐诺为什么你需要以上,如果你能做到这一点的代码:http://jsfiddle.net/btyCz/

有限公司演示http://jsfiddle.net/jnXEy/(我已经将限制设置为20)随意玩耍。

请让我再知道如果我错过了anythig,但低于应该帮助:)

您可以始终把支票上的长度进行限制。

代码

$('#myInput').keyup(function() { 
    $('#charCount').text(this.value.replace(/{.*}/g, '').length); 
});​ 

HTML

<textarea id="myInput"></textarea> <br> 
Counter: <span id="charCount"></span>​ 
+1

什么是正则表达式替代?我不认为它正在做你想做的事 - 在你的小提琴中输入“asdf {sdf} asdf”',看看计数是什么...... – nnnnnn 2012-08-07 04:52:45

+0

replace(/{.*}/)的用法是什么('#charCount')。text(this.value.replace(/{.*}/ g,'').length);' – 2012-08-07 04:54:34

+1

@nnnnnn saweet bruv! ':)'你好吗?我将尽快替换替换':)' – 2012-08-07 04:54:44

0

你的代码中有许多语法错误。 现在试试这个:

$(document).ready(function() { // bracket was missing here... 
    var $texts = $('textarea[maxlength]'); 
    $texts.each(function() { // bracket was missing here... 
     var $this = $(this), // incorrect variable declaration here... 
     max = $this.attr('maxlength'), 
     textId = $this.attr('id'), // incorrect method call here... 
     $parent = $this.parent(), 
     countId = textId + '-count', 

     $div = $('<div>Characters Remaining: </div>').addClass('count-down').insertAfter($this), 
     $input = $('<input></input>').attr({ 
      type: "text", 
      readOnly: "readOnly", 
      value: max, 
      id: countId 
     }).css({ 
      width: "25px", // missing comma here... 
      marginTop: "5px", // missing comma here... 
      marginBottom: "10px" 
     }).addClass('readOnly').appendTo($div); 

     $this.on({ 
      keyup: function() { 
       var val = $this.val(), 
       countVal = $('#' + countId).val(); // must have semicolon here... 
       if (val.length > max) { 
        $this.val(val.substr(0, max)); 
        alert('Max length exceeded: ' + max); 
        return false; 
       } else { 
        $('#' + countId).val(max - val.length); 
       } 
      }, 
      blur: function() { 
       var val = $this.val(); 
       if (val.length > max) { 
        $this.val(val.substr(0, max)); 
        alert('Max length exceeded: ' + max); 
        return false; 
       } else { 
        $('#' + countId).val(max - val.length); 
       } 
      } 
     }); 
    }); 
}); 

http://jsbin.com/uzohuv/3

+0

非常感谢你:)但你可以显示说哪些行号有语法错误,因为我没有看到他们。 (我确实在var $ texts = $('textarea [maxlength]')中有额外的单引号;在我的解释中,我解决了这个问题,再次感谢 – Sheldor 2012-08-07 05:18:55

+0

我更新了代码,据我记忆。 – 2012-08-07 05:32:30

+0

嗯,所有这些只是我在这个问题上做的愚蠢的拼写错误,实际上并不是我的代码,但我猜它与它的反应与我的jsp页面有关,因为它似乎对你有用。它也可以在一个页面上为多个textarea工作吗?它只会尝试为我的jsp页面中的第一个文本区域元素工作 – Sheldor 2012-08-07 06:02:28