求textarea框ctrl+z为什么无效?

之前我提问过一贴子:
http://topic.csdn.net/u/20080105/15/6d88c565-c9c3-494c-a320-ad98b0b14e61.html
已解决贴子的问题,但在我如下的实例仍找不到好办法解决:希望各位达人能再帮忙解决!

HTML code
<html>
<head>
<title>test</title>
<script language="JavaScript">
<!--
function SymError()
{
  return true;
}
window.onerror = SymError;

function changecountbyte(value,length){
    var l=strlength(value)
    if (l<=length) {
        if (document.all!=null) document.all("countbyte").innerText="现在还可以输入"+(length-l)+"字符"
    }
    else
    {
        document.all("countbyte").innerText="输入字符数超出范围";
        if (window.event.keyCode!=13){
        alert('输入字符数超出范围');
    }
    }
    return true
}

function strlength(str){
    var l=str.length;
    var n=l
    for (var i=0;i<l;i++)
    {
        if (str.charCodeAt(i)<0||str.charCodeAt(i)>255) n++
    }
    return n       
}

function loadFuc(){
    var tb = document.getElementById("abc");
    tb.onKeyDown = function(){return changecountbyte(document.form1.abc.value,200)};
    tb.onkeyup = function(){return changecountbyte(document.form1.abc.value,200)};   
}
-->
</SCRIPT>
</head>
<body onLoad="return loadFuc()">
    <table width="100%"  border="0" cellpadding="0" cellspacing="0"  >
     <form name=form1 method="post">   
      <tr>
        <td valign="top">
        <SPAN id=countbyte><SCRIPT language=JavaScript>changecountbyte(document.form1.abc.value,200);</SCRIPT></SPAN><br />   
        <textarea name ="abc" cols="80" rows="15" id="abc">asdfsdf</textarea>
        </td>
      </tr>
      </form>
    </table>
</body>
</html>


 
 
 
问题点数:100 回复次数:18 显示所有回复显示星级回复显示楼主回复 修改 删除 举报 引用 回复  
 

 加为好友
发送私信
在线聊天
 showliz
清风
等级:
可用分等级:富农
总技术分:233
总技术分排名:56264

 发表于:2008-02-19 18:06:011楼 得分:0
就是在如上的页面中,不破坏原功能上,解决ctrl+z不能执行取消操作(undo)的问题。
 
修改 删除 举报 引用 回复  
 
 加为好友
发送私信
在线聊天
 chinmo
藏*无限
等级:
可用分等级:富农
总技术分:91860
总技术分排名:62
3
7
 发表于:2008-02-19 18:27:102楼 得分:15
<input      type=text      onpropertychange="setTextInputValue(document.all.bbb,this.value);">  <input      type=text      name=bbb> 

<script>
/**
*  setTextInputValue
*/
function  setTextInputValue(obj,value)  //  For  IE:  To  keep  Undo  after  change  value.
{
if(obj.createTextRange)  obj.createTextRange().text=value;
else  obj.value=value;
}
</script>

这个可以实现吗?
 
修改 删除 举报 引用 回复  
 
 加为好友
发送私信
在线聊天
 showliz
清风
等级:
可用分等级:富农
总技术分:233
总技术分排名:56264

 发表于:2008-02-19 18:36:183楼 得分:0
chinmo,我试过您说的这个方法,但没能找到好的解决办法。就是套不上去哦。
 
修改 删除 举报 引用 回复  
 
 加为好友
发送私信
在线聊天
 chinmo
藏*无限
等级:
可用分等级:富农
总技术分:91860
总技术分排名:62
3
7
 发表于:2008-02-19 19:20:514楼 得分:0
套不上去?什么意思?
 
修改 删除 举报 引用 回复  
 
 加为好友
发送私信
在线聊天
 chinmo
藏*无限
等级:
可用分等级:富农
总技术分:91860
总技术分排名:62
3
7
 发表于:2008-02-19 19:38:155楼 得分:0
注意下边的,altKey和altLeft,ctrlKey和ctrlLeft 
   
   
   
  event  对象 
   
  -------------------------------------------------------------------------------- 
   
  代表事件状态,如事件发生的元素,键盘状态,鼠标位置和鼠标按钮状态。 
   
  成员表 
   
  下面的表格列出了  event  对象引出的成员。请单击左侧的标签来选择你想要查看的成员类型。 
   
      属性           
     
  SHOW:   
  属性   
  集合   
  对象   
    属性  描述   
  Abstract  使用  event  对象获取高级流重定向器(ASX)文件中项目横幅的  Abstract  内容。   
  altKey  设置或获取  Alt  键的状态。   
  altLeft  设置或获取左  Alt  键的状态。   
  Banner  使用  event  对象获取高级流重定向器(ASX)文件中项目的  Banner  内容。   
  button  设置或获取用户所按的鼠标按钮。   
  cancelBubble  设置或获取当前事件是否要在事件句柄中向上冒泡。   
  clientX  设置或获取鼠标指针位置相对于窗口客户区域的  x  坐标,其中客户区域不包括窗口自身的控件和滚动条。   
  clientY  设置或获取鼠标指针位置相对于窗口客户区域的  y  坐标,其中客户区域不包括窗口自身的控件和滚动条。   
  contentOverflow  获取表明文档处理当前  LayoutRect  对象后是否包含附加的内容。   
  ctrlKey  设置或获取  Ctrl  键的状态。   
  ctrlLeft  设置或获取左  Ctrl  键的状态。   
  dataFld  设置或获取  oncellchange  事件影响的数据列。   
  fromElement  设置或获取事件发生时激活或鼠标将要离开的对象。   
  keyCode  设置或获取与导致事件的按键关联的  Unicode  按键代码。   
  MoreInfo  通过  event  对象获取高级流重定向器(ASX)文件中项目横幅的  MoreInfo  内容。   
  nextPage  获取打印模板中下页的位置。   
  offsetX  设置或获取鼠标指针位置相对于触发事件的对象的  x  坐标。   
  offsetY  设置或获取鼠标指针位置相对于触发事件的对象的  y  坐标。   
  propertyName  设置或获取对象上发生更改的属性名称。   
  qualifier  设置或获取由数据源对象提供的数据成员的名称。   
  reason  设置或获取数据源对象的数据传输结果。   
  recordset  从数据源对象设置或获取对默认数据集的引用。   
  repeat  获取  onkeydown  事件是否正在重复。   
  returnValue  设置或获取事件的返回值。   
  saveType  当  oncontentsave  触发时获取剪贴板类型。   
  screenX  设置或获取获取鼠标指针位置相对于用户屏幕的  x  坐标。   
  screenY  设置或获取鼠标指针位置相对于用户屏幕的  y  坐标。   
  shiftKey  设置或获取  Shift  键的状态。   
  shiftLeft  设置或获取左  Shift  键的状态。   
  srcElement  设置或获取触发事件的对象。   
  srcFilter  设置或获取触发  onfilterchange  事件的滤镜对象。   
  srcUrn  获取触发事件的行为的统一资源名称(URN)。   
  toElement  设置或获取用户要将鼠标指针移动指向的对象的引用。   
  type  从  event  对象中获取事件名称。   
  wheelDelta  设置或获取滚轮按钮滚动的距离和方向。   
  x  设置或获取鼠标指针位置相对于父文档的  x  像素坐标。   
  y  设置或获取鼠标指针位置相对于父文档的  y  像素坐标
 
修改 删除 举报 引用 回复  
 
 加为好友
发送私信
在线聊天
 chinmo
藏*无限
等级:
可用分等级:富农
总技术分:91860
总技术分排名:62
3
7
 发表于:2008-02-19 20:21:566楼 得分:0
呵呵,那2个函数冲突了,要坐下判断才行!
加入只有setTextInputValue这函数时就可以,所以你就得获取ctrl状态来判断运行语句
 
修改 删除 举报 引用 回复  
 
 加为好友
发送私信
在线聊天
 showbo
要学习了.....さようなら
等级:
可用分等级:富农
总技术分:56879
总技术分排名:140
3
3
 发表于:2008-02-20 14:35:517楼 得分:5
JK兄不是已经帮你把type=text的搞好了?套下就得了,不过好象得按2下ctrl+z才能使用undo功能


HTML code<textarea  onpropertychange="setTextInputValue(document.all.bbb,this.value);"></textarea>   <textarea  name=bbb>  

</textarea>

<script>
/**
*   setTextInputValue
*/
function   setTextInputValue(obj,value)   //   For   IE:   To   keep   Undo   after   change   value.
{
if(obj.createTextRange)   obj.createTextRange().text=value;
else   obj.value=value;
}
</script>

 
 
修改 删除 举报 引用 回复  
 
 加为好友
发送私信
在线聊天
 chinmo
藏*无限
等级:
可用分等级:富农
总技术分:91860
总技术分排名:62
3
7
 发表于:2008-02-20 14:41:138楼 得分:0
呵呵,没有用的
是他的函数冲突了
必须处理2个函数的关系
单单只有setTextInputValue时很简单!
 
修改 删除 举报 引用 回复  
 
 加为好友
发送私信
在线聊天
 JK_10000
JK
等级:
可用分等级:小地主
总技术分:30868
总技术分排名:325

 发表于:2008-02-20 16:19:199楼 得分:80
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML> <HEAD>
<META http-equiv=Content-Type content="text/html; charset=utf-8">
<META content="MSHTML 6.00.2900.3268" name=GENERATOR> </HEAD>
<BODY>
<HR>
计算长度并且不影响undo。----强烈不推荐 <BR> <TEXTAREA style="WIDTH: 400px; HEIGHT: 200px" onpropertychange=checkMaxLengthXXXXX(this);> </TEXTAREA>

<DIV id=tipDiv>最多可输入100个字符。 <SPAN id=tipOk
style="DISPLAY: none">你还可以输入 <IMG> <IMG> <IMG>个。 </SPAN> <SPAN id=tipError
style="DISPLAY: none">输入的字符超过100了 </SPAN> </DIV>
<SCRIPT>

function  checkMaxLengthXXXXX(obj) 
{
var l=obj.value.length;
if(l>100){
  tipOk.style.display="none";
  tipError.style.display="";
}
else{
  tipOk.style.display="";
  tipError.style.display="none";
  var imgs=tipDiv.getElementsByTagName("img");
  var l2=100-l;
  var imgSrc="http://www.44card.com/images/";
  imgs[2].src=imgSrc+(l2%10)+".gif"
  imgs[1].src=imgSrc+((l2-l2%10)%100/10)+".gif"
  imgs[0].src=imgSrc+((l2-l2%100)%1000/100)+".gif"
}
}
</SCRIPT>

<HR>
推荐用以下类似的方案: <BR> <TEXTAREA onblur=checkMaxLength(this,100); style="WIDTH: 400px; HEIGHT: 200px"> </TEXTAREA>
<br>最多可输入100个字符。
<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>
</BODY> </HTML>
 
 
修改 删除 举报 引用 回复  
 
 加为好友
发送私信
在线聊天
 showliz
清风
等级:
可用分等级:富农
总技术分:233
总技术分排名:56264

 发表于:2008-02-20 16:21:3310楼 得分:0
是啊,我觉得应该要在changecountbyte这个函数内进行处理。
showbo所说的已经改变我页面上即时计算textarea字符数的功能了。
 
修改 删除 举报 引用 回复  
 
 加为好友
发送私信
在线聊天
 chinmo
藏*无限
等级:
可用分等级:富农
总技术分:91860
总技术分排名:62
3
7
 发表于:2008-02-20 16:26:4811楼 得分:0
JK_10000 好象改了他的代码给你了!他做判断了!
呵呵,JK_10000 有心啊,都是直接答案,我只是告诉他思路,让他自己修改!
呵呵
 
修改 删除 举报 引用 回复  
 
 加为好友
发送私信
在线聊天
 chinmo
藏*无限
等级:
可用分等级:富农
总技术分:91860
总技术分排名:62
3
7
 发表于:2008-02-20 16:28:4012楼 得分:0
哈哈,不过JK_10000 的代码好象少了 <TEXTAREA  style="WIDTH:  400px;  HEIGHT:  200px"  onpropertychange=checkMaxLengthXXXXX(this);> 这个原来的功能
 
修改 删除 举报 引用 回复  
 
 加为好友
发送私信
在线聊天
 JK_10000
JK
等级:
可用分等级:小地主
总技术分:30868
总技术分排名:325

 发表于:2008-02-20 16:35:1813楼 得分:0
大多是旧代码,拷过来粘贴上就是。
更多代码在JKHtml里有。
http://topic.csdn.net/u/20080129/09/2cd2a92f-734e-4541-bc8d-3433ba6e0184.html
 
修改 删除 举报 引用 回复  
 
 加为好友
发送私信
在线聊天
 showliz
清风
等级:
可用分等级:富农
总技术分:233
总技术分排名:56264

 发表于:2008-02-20 16:44:3314楼 得分:0
呵呵,测试了,多谢JK_10000兄的解答。
JK兄的第一种方法好像是每输入字符,都有刷页面的感觉,试过把图片换成本地了也一样,所以可能是JS兄强烈不推荐的原因吧。
第二种方法可惜的是缺少即时计算的功能。
 
修改 删除 举报 引用 回复  
 
 加为好友
发送私信
在线聊天
 showliz
清风
等级:
可用分等级:富农
总技术分:233
总技术分排名:56264

 发表于:2008-02-20 16:47:2815楼 得分:0
好!进去学习学习。
 
修改 删除 举报 引用 回复  
 
 加为好友
发送私信
在线聊天
 JK_10000
JK
等级:
可用分等级:小地主
总技术分:30868
总技术分排名:325

 发表于:2008-02-20 16:56:4616楼 得分:0
刷页面的感觉是因为没有做数字图片预加载处理,预加载一下就没问题了。
不是因为这一点而不推荐。很多dom操作会导致undo丢失,用图片数字浪费资源,也不灵活,还会诱发用户想象力,导致报更多的需求/错误,所以不推荐

加支付宝好友偷能量挖...


评论(0)网络
阅读(131)喜欢(1)JavaScript/Ajax开发技巧