È che secondo me sbagli proprio approccio. Lascia perdere jQuery, ti complica solo la vita! Prova a partire da qui:
codice:
<!doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Esempio</title>
<script type="text/javascript">
function normalOnly(oField, oKeyEvent) {
var nKey = (oKeyEvent || window.event || { charCode: 0 }).keyCode,
// qui il numero massimo di caratteri per riga:
nLineChrs = 30,
// qui il numero massimo di caratteri in totale:
nTotalChrs = 154,
nSelS = oField.selectionStart, nSelE = oField.selectionEnd,
sVal = oField.value, nLen = sVal.length,
nBackward = 0, nNewLine = 0, nLineStart = 0;
if (nSelS >= nLineChrs) {
nBackward = nSelS - nLineChrs;
nNewLine = sVal.substring(nBackward, nSelS).search(new RegExp("\\n(?!.{0," + String(nLineChrs - 2) + "}\\n)"));
nLineStart = nBackward + nNewLine + 1;
}
var nAfterLen = nSelE + nLineStart + nLineChrs - nSelS,
sLine = sVal.substring(nLineStart, nSelS) + sVal.substring(nSelE, nAfterLen > nLen ? nLen : nAfterLen),
bKeepLine = nKey === 13 || nLen + 1 < nLineChrs || ((nNewLine > -1 || nKey > 0) && (sLine.length < nLineChrs || (nKey > 0 && (nLen === nAfterLen || sVal.charAt(nAfterLen) === "\n")) || /\n/.test(sLine)));
return (nKey > 32 && nKey < 41) || (bKeepLine && nLen + nSelS - nSelE < nTotalChrs);
}
</script>
</head>
<body>
<form name="myForm">
Textarea con numero fisso di caratteri per riga:
<textarea cols="50" rows="10" name="myInput" onkeypress="return(normalOnly(this, event));" onpaste="return(false);" />Lorem ipsum</textarea></p>
</form>
</body>
</html>