如何防止用户使用jQuery在textarea中输入多个中断?

时间:2012-05-07 23:32:04

标签: jquery line-breaks

如何阻止用户在一行中插入多个换行符到文本字段? 我更喜欢使用jQuery的解决方案。

更新1:

我已将anadeo的代码插入到我的代码中,如下所示。不幸的是它不起作用 - 它仍然允许在textarea #posttext中连续多个换行符。有人知道怎么修这个东西吗?谢谢:))

//Post something
$('#postDiv').on('keydown', '#posttext', function(e) {
if (e.which==13 && !e.shiftKey && $('#posttext').val()!=' Post something...') {

    var last = false;

    var code = (e.keyCode ? e.keyCode : e.which);
    if(code == 13) {
        if (last) { e.preventDefault(); }
        last=true;
    }else{
        last=false;
    }

    //If not currently loading and enough text typed in, submit
    if($('#imageFeedback').html()!=' | Loading...' && $('#posttext').val().length>15){

        //Say that it is loading
        $('#imageFeedback').css('color','black').css('font-weight','normal').html(' | Loading...');

        //Call function to post
        post($(this));
        return false;
    }
}
});

4 个答案:

答案 0 :(得分:3)

我想出了这个:

新增和改进(可以定义允许的换行数)

http://jsfiddle.net/cEzUx/6/

<textarea id="my" rows="5"></textarea>
<div id="out"> </div>

maxBreaks = 1;

$("#my").keydown(function(e) {
    if(e.keyCode == 13) {    
        if(countBreaks($("#my").val()) == maxBreaks) {
            e.preventDefault();
        }
    }
});

function countBreaks(str) {
  var num = 0;        
  for (var i = 0; i < str.length; i++) {
      if (str.charAt(i) === '\n') { num++; }
  }
  return num;
}
​

答案 1 :(得分:2)

$(textarea).on('keydown', function(e) {
    var code = (e.keyCode ? e.keyCode : e.which);
    if(code == 13 && this.value.match(/\n/g)) e.preventDefault();
});​

FIDDLE

...more than one line break in a row

您是否考虑连续避免多个换行符(一个接一个),如下所示:

var last = false;

$(textarea).on('keydown', function(e) {
    var code = (e.keyCode ? e.keyCode : e.which);
    if(code == 13) {
        if (last) { e.preventDefault(); }
        last=true;
    }else{
        last=false;
    }
});​

FIDDLE

修改

首先,on()仅在jQuery 1.7+中受支持,因此请确保您使用的是较新版本的库。

您还使用on()的委托版本,这应该不是问题,但它假设您的textarea稍后插入DOM,而不是从头开始,即。它是用JS等动态插入的。

其余的似乎没问题,但是last变量必须放在keydown函数之外才能正常工作,var code应该在顶部,检查enter键只有一次,因为第二次检查不是真的有必要。 code变量实际上是可选的,因为jQuery应该标准化e.which,但检查是否支持keycodewhich似乎是一个好主意,以确保跨浏览器兼容性。

检查#posttext值只会运行一次,一旦输入换行符,值不再是Post something...,并且“限制换行符”功能将被启用?

总而言之,我认为这应该有效,试试看看?

var last = false;

$('#postDiv').on('keydown', '#posttext', function(e) {
    var code = (e.keyCode ? e.keyCode : e.which);
    if (code==13 && !e.shiftKey && $('#posttext').val()!=' Post something...') {
        if (last) { e.preventDefault(); }
        last=true;
    }else{
        last=false;
    }
});​

FIDDLE

此外,使用不太常见的变量名称而不是last可能是一个好主意,例如MyLastTypedPostTextLast等等,不太可能与之混淆在某个其他地方或插件等名称为last的函数或变量。

答案 2 :(得分:1)

$("#myTarea").keydown(function(e) {
    if(e.keyCode == 13) {
       if($(this).val().match(/\n/)) e.preventDefault();
    }
});

<textarea id="myTarea" rows="5"></textarea>

DEMO.

答案 3 :(得分:0)

解决方案的关键是,一旦检测到页面上至少有一个\n字符,就会阻止插入回车\n的默认行为。

在传递给按键处理程序的event对象中,使用“which”方法检查输入键“keypress”事件,该事件由数字13表示。如果按下该键,请检查用于回车的textarea的全部内容,再次由转义序列\n表示。如果\n个字符集的长度大于0,则调用event.preventDefault(),这会阻止将enter键添加到textarea的value属性中:

$('#wmd-input').keypress(function(event) {
    if(event.which == 13 && $('#wmd-input').val().match(/\n/g).length > 0) {
        event.preventDefault();
    }
});