2012-05-07 59 views
2

如何防止用戶將多行換行插入到文本字段中? 我更喜歡使用jQuery的解決方案。如何防止用戶使用jQuery在textarea中輸入多箇中斷?

更新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; 
    } 
} 
}); 
+2

您試過的所有東西到目前爲止? – xbonez

+0

不,說實話我不知道如何解決這個問題。 – weltschmerz

回答

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函數以外才能正常工作,並且變量code應該在頂部,執行回車鍵的檢查只有一次,因爲第二次檢查並不是真的有必要。 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

+0

喜歡看'.on()'的人們 – honyovk

+0

@adeneo在小提琴中它起作用,那正是我所需要的。請參閱問題編輯,我已將它包含在我的代碼中,但它不起作用。 – weltschmerz

+0

@丹尼斯 - 更新了我的答案,因爲對於評論來說這有點多餘,看看現在是否適合你,如果沒有,我會再看一遍! – adeneo

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
$("#myTarea").keydown(function(e) { 
    if(e.keyCode == 13) { 
     if($(this).val().match(/\n/)) e.preventDefault(); 
    } 
}); 

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

DEMO.

0

解決方案的關鍵是防止插入回車\n的默認行爲,一旦您檢測到頁面上至少有一個\n字符。

在傳遞給按鍵處理程序的event對象中,使用「which」方法檢查輸入鍵「keypress」事件,該事件由數字13表示。如果按下該鍵,請檢查整個內容用於回車的textarea,它又由轉義序列\n表示。如果\n字符集合的長度是大於0,然後調用event.preventDefault(),這防止了輸入鍵從被添加到文本域的值屬性:

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