急:textBpx控件输入中文时不触发客户端keydown和keyPress事件,请指教!

csxwd 2007-12-24 03:49:19
最近在改进Web的textBox控件,因为maxLength属性仅仅按照Unicode码进行长度校验,且在多行时无效。如果在keyUp事件中判断长度进行截取,那可以做到。问题是:现在希望超出长度时,按下键就不输入,而不是先输入后被截掉这种效果。但是输入中文时又不触发keyDown或keyPress事件。头疼啊,这个月要交付了,请各位帮帮小弟。
...全文
282 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
指间的风 2007-12-26
  • 打赏
  • 举报
回复
上边的那个发错了


String.prototype.len=function()
{
return this.replace(/[^\x00-\xff$]/g,"**").length;
}


function CheckLengthForJs(args)
{
var ValidStrLength=4000;
if (args.value.len()<=ValidStrLength)
{

return true;
}

else
{
args.select();
return false;
}

}
在提交以前,先验证一下长度。
指间的风 2007-12-26
  • 打赏
  • 举报
回复
String.prototype.len=function()
{
return this.replace(/[^\x00-\xff$]/g,"**").length;
}
function CheckLength(oSrc, args)
{
var ValidStrLength=4000;
if (args.Value.len()<=ValidStrLength)
args.IsValid = true;
else
args.IsValid = false;
}

在提交以前,先验证一下长度。
toyleo 2007-12-25
  • 打赏
  • 举报
回复
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title> New Document </title>
<meta name="Generator" content="EditPlus">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<script language="JavaScript">
<!--
String.prototype.ansiLength = function()
{
var nl = this.length;
var al = nl;
for (var i = 0; i < nl; i++)
{
if (this.charCodeAt(i) > 127)
{
al = al + 1;
}
}
return al;
}

function keyd(obj)
{
var nKeyCode = event.keyCode;
if (event.ctrlKey || nKeyCode==8 || nKeyCode==46 || nKeyCode==37 || nKeyCode==38 || nKeyCode==39 || nKeyCode==40) return true;
var rng = document.selection.createRange();
var nLeft = 50 - obj.value.ansiLength() + rng.text.ansiLength();
if (nLeft<=0) return false;
return true;
}

function valuefix(obj)
{
if ((event.propertyName == "value")&&(obj.value.ansiLength() > 50))
{
obj.value = SubAnsiStr(obj.value,50);
}
}

function SubAnsiStr(str,i)
{
if (i <= 0) return '';
var iCount = 0;
var sReturn = '';
for (var j = 0; j < str.length; j++)
{
if ((str.charCodeAt(j) >= 32) && (str.charCodeAt(j) <= 126))
{
if ((i - iCount) == 0) return sReturn;
sReturn += str.charAt(j);
iCount++;
}
else if ((str.charCodeAt(j) == 13)||(str.charCodeAt(j+1) == 10))
{
if ((i - iCount) <= 1) return sReturn;
sReturn += str.charAt(j);
sReturn += str.charAt(j+1);
iCount = iCount + 2;
j++;
}
else
{
if ((i - iCount) <= 1) return sReturn;
sReturn += str.charAt(j);
iCount = iCount + 2;
}
}
return sReturn;
}
//-->
</script>
</head>

<body>
<textarea style="width:150px;height:70px" onpropertychange="return valuefix(this);" onkeydown="return keyd(this);" ></textarea>
<input onpropertychange="return valuefix(this);" onkeydown="return keyd(this);" ></input>
</body>
</html>


差不多了吧
JK_10000 2007-12-24
  • 打赏
  • 举报
回复
<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>New Page 1</title>
</head>

<body>
<textarea maxlength=30 onbeforedeactivate=" return checkMaxLength(this);">fds afds afds afd afds afdsa fdsa fdsa fdfdsa fdsa fds afdsa </textarea>
</body>

</html>
<script>
/**
*checkMaxLength.
*/
function checkMaxLength(textareaObj,maxLength)
{
if(maxLength == null) maxLength=textareaObj.getAttribute("maxLength");
if(maxLength == null) maxLength=1024;
var currentLength = textareaObj.value.length;
if (currentLength > maxLength) {
alert("The length of your input ("+currentLength+") is larger than maxLength ("+maxLength+") .");
if(textareaObj.createTextRange){
var textRange=textareaObj.createTextRange();
var enterMatch=textareaObj.value.substr(0,maxLength).match(/\n/ig);
var enterNum=0;
if(enterMatch) enterNum=enterMatch.length
textRange.moveStart('character',maxLength-enterNum);
textRange.select();
}
else {
textareaObj.focus();
textareaObj.setSelectionRange(maxLength, currentLength);
}
window.latestValidateObj=textareaObj;
setTimeout("window.latestValidateObj.focus();",0);
return false;
}
return true;
}
</script>
JK_10000 2007-12-24
  • 打赏
  • 举报
回复
textarea的长度验证在离开焦点或提交前验证
不必在以下情况下验证:
1。onkeydown
2。onkeyup(按住某键不放)
3。onpaste(粘贴)
4。ondragend(拖入)
csxwd 2007-12-24
  • 打赏
  • 举报
回复
function getAnsiLen(str){
return str.replace(/[^\x00-\xff]/g,"**").length;
}
可以返回Ansi码标准的字符长度。
关键问题是:中文输入不触发客户端keydown事件。目前我的处理方式是:
//keyup时执行以下cut方法
function cut(textinput)
{
if (event) {if ((event.shiftKey == true)||(event.ctrlKey == true)||(event.keyCode == 16)||(event.keyCode == 37)||(event.keyCode == 38)||(event.keyCode == 39)||(event.keyCode == 40)||(event.keyCode == 17)) return;};
var maxl = textinput.getAttribute('maxL');
if (maxl == 0) return;
pos = getPos(textinput);
textinput.value = subansistr(textinput.value,maxl);
setPos(textinput,pos);
}

//取光标位置
function getPos(obj)
{
obj.focus();
var workRange=document.selection.createRange();
obj.select();
var allRange=document.selection.createRange();
workRange.setEndPoint('StartToStart',allRange);
var len=workRange.text.length;
workRange.collapse(false);
workRange.select();
return len;
}
//重新设置光标位置
function setPos(obj,pos)
{
var r = obj.createTextRange();
r.collapse(true);
r.moveStart('character',pos);
r.select();
}
因keyup中处理能明显看出字符输入后被截掉了,用户感觉不好!
mingxuan3000 2007-12-24
  • 打赏
  • 举报
回复
我的是
“现在希望超出长度时,按下键就不输入,而不是先输入后被截掉这种效果。“你的这种效果,
至于长度判断你可以在那2个事件里用函数包装
那2个事件一个是ie,一个是ff下用的
csxwd 2007-12-24
  • 打赏
  • 举报
回复
回复铭轩:
可以使用正则表达式来处理unicode码转Ansi码过程中的问题,但是这是这个问题的一个细节,谢谢给我参考建议。
孟子E章 2007-12-24
  • 打赏
  • 举报
回复
你可以使用string.charCodeAt方法得到unicode数字,然后进行判断。
至于事件,为了兼容浏览器,需要多做测试
mingxuan3000 2007-12-24
  • 打赏
  • 举报
回复
<script>
function aa(a){
if(/[^,0-9]/g.test(a.value)){
a.value=a.value.replace(/[^,0-9]/g,"")
}
}
</script>
<input type="text" onpropertychange='aa(this)' oninput='this.value=this.value.replace(/[^,0-9]/g,"")'>

这个是只能输数字和^的例子,参照下
csxwd 2007-12-24
  • 打赏
  • 举报
回复
我之所以完善这个控件也是考虑到控件在判断长度时原来是以Unicode码标准,我希望以Ansi码标准判断,一个中文当成两个长度来处理,这样和数据库保持一致。

87,910

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧