<html>
<head><META http-equiv=\"Content-Type\" content=\"text/html; charset=shift_jis\">
<title>Test</title>
<script language=javascript>
var http_request = false;
var strData;function set()
{
    getData();    var txt = document.forms["Fm"].textAr;
    var s = txt.value.indexOf(document.selection.createRange().text);
    var n = document.selection.createRange().text.length;
    txt.value = strData;
    txt.focus();
var r = document.selection.createRange();
r.collapse(false);
r.moveStart("character", -txt.value.length+s);
r.moveEnd("character", -txt.value.length+n+s);
r.select();
}function getData(){
//strData = window.document.TestApplet.GetStringData();
strData = 1234567890;
}
</script>
</head>
<body>
<form method = "post" action = "" name = "Fm">
<input type = "button" value = "更新" onclick = "set()">
<textarea name = "textAr" rows = 10 cols = 140>123456
</textarea><input type = hidden name = "btnH">
</form>
</body>
</html>

解决方案 »

  1.   

    function set()
    {
      sel = document.selection.createRange().text;
      getData();
      document.getElementById("textAr").innerText=strData ; 
      var rng = document.getElementById("textAr").createTextRange();
      rng.findText(sel);
      rng.select();
    }
      

  2.   

    稻草人,在 value 没有任何选中的情况下你的代码报错!
      

  3.   

    稻草人的,我自己做了个判断
    if( sel != "" ){
    rng.findText(sel);
    rng.select();
    }
    另外:稻草人的代码,如果一开始选者几个数字,后来随着textarea数量的增加,选着的代码超过1行,结果回去的地方不对了。。
    把document.getElementById("textAr").innerText+=strData ; 
    改成:
     document.getElementById("textAr").innerText+=strData ; 
      

  4.   

    在梅大的基础上改的
    <html>
    <head><META http-equiv=\"Content-Type\" content=\"text/html; charset=shift_jis\">
    <title>Test</title>
    <script language=javascript>
    var http_request = false;
    var strData;function set()
    {
        getData();    var txt = document.forms["Fm"].textAr;
        var s = txt.value.indexOf(document.selection.createRange().text);
        var n = document.selection.createRange().text.length;
        txt.value = strData;
        txt.focus();
    var r = document.getElementById("textAr").createTextRange();
    r.collapse(false);
    r.moveStart("character", -txt.value.length+s);
    r.moveEnd("character", -txt.value.length+n+s);
    r.select();
    }function getData(){
    //strData = window.document.TestApplet.GetStringData();
    strData = 1234567890;
    }
    </script>
    </head>
    <body>
    <form method = "post" action = "" name = "Fm">
    <input type = "button" value = "更新" onclick = "set()">
    <textarea name = "textAr" rows = 10 cols = 140>123456
    </textarea><input type = hidden name = "btnH">
    </form>
    </body>
    </html>
      

  5.   

    没看到,草人已经发了,我还在想用findText来做呢
    这个有些部分可以参考fantiny兄弟的一个帖子
    http://community.csdn.net/Expert/topic/4290/4290025.xml?temp=.2094538
      

  6.   

    在优化下草人的,:)获取新数据再查找,修正如果找不到会全部都选上的情况
    ccccffff兄弟,上面的回复说代码超过一行就不行是什么问题啊?
    <html>
    <head><META http-equiv=\"Content-Type\" content=\"text/html; charset=shift_jis\">
    <title>Test</title>
    <script language=javascript>
    var http_request = false;
    var strData;function set()
    {
      sel = document.selection.createRange().text;
      getData();
      document.getElementById("textAr").innerText=strData ; 
      var rng = document.getElementById("textAr").createTextRange();
     if( sel != "" ){
    if(rng.findText(sel))
    rng.select();
    }
    }function getData(){
    //strData = window.document.TestApplet.GetStringData();
    strData = "123456789023423523544444444444444444444444444444444444444444444444444444444444444444444123456789023423523544444444444444444444444444444444444444444444444444444444444444444444123456789023423523544444444444444444444444444444444444444444444444444444444444444444444123456789023423523544444444444444444444444444444444444444444444444444444444444444444444123456789023423523544444444444444444444444444444444444444444444444444444444444444444444123456789023423523544444444444444444444444444444444444444444444444444444444444444444444123456789023423523544444444444444444444444444444444444444444444444444444444444444444444123456789023423523544444444444444444444444444444444444444444444444444444444444444444444123456789023423523544444444444444444444444444444444444444444444444444444444444444444444";
    //strData="dgdfgdfgdfgdfg"
    }
    </script>
    </head>
    <body>
    <form method = "post" action = "" name = "Fm">
    <input type = "button" value = "更新" onclick = "set()">
    <textarea name = "textAr" rows = 10 cols = 140>12345
    </textarea><input type = hidden name = "btnH">
    </form>
    </body>
    </html>
      

  7.   

    明白了,是因为值里面有重复的数据,findText方法默认是返回第一个查到的数据,所以有的时候会不一致
      

  8.   

    那你就把我的思路与 findText 结合起来
      

  9.   

    这样可以了,function set()
    {
      r1 = document.selection.createRange();
      ss = r1.text;
      r  = r1.getClientRects();
      getData();
      document.getElementById("textAr").innerText=strData ; 
      
      if( ss != "" )
      {
      var rng = document.getElementById("textAr").createTextRange();
      var rng2= rng.duplicate();
      rng.moveToPoint(r[0].left,r[0].top);
      rng.select();
      rng2.setEndPoint("StartToEnd", rng);
      rng.moveToPoint(r[r.length-1].right,r[r.length-1].top);
      rng2.setEndPoint("EndToEnd", rng);
      rng2.select();
      }
    }
      

  10.   

    哈哈,想出来了,问题在于indexOf也是选第一个,不能知道选择的那个,我把选择的那个替换掉,加个特殊字符,再替换回来,就OK了
    <html>
    <head><META http-equiv=\"Content-Type\" content=\"text/html; charset=shift_jis\">
    <title>Test</title>
    <script language=javascript>
    var strData;
    function set()
    {
      var obj=document.getElementById("textAr")
      document.selection.createRange().text=document.selection.createRange().text+"###"
       var s = obj.value.indexOf(document.selection.createRange().text);
       var n = document.selection.createRange().text.length-3;
      sel = document.selection.createRange().text;
      getData();
      obj.innerText=strData ; 
      obj.value=obj.value.replace(/###/,"")
      var r = document.getElementById("textAr").createTextRange();
    r.collapse(false);
    r.moveStart("character", -obj.value.length+s);
    r.moveEnd("character", -obj.value.length+n+s);

    r.select();

    }
    function getData(){
    //strData = window.document.TestApplet.GetStringData();
    strData = "123456789023423523544444444444444444444444444444444444444444444444444444444444444444444123456789023423523544444444444444444444444444444444444444444444444444444444444444444444123456789023423523544444444444444444444444444444444444444444444444444444444444444444444123456789023423523544444444444444444444444444444444444444444444444444444444444444444444123456789023423523544444444444444444444444444444444444444444444444444444444444444444444123456789023423523544444444444444444444444444444444444444444444444444444444444444444444123456789023423523544444444444444444444444444444444444444444444444444444444444444444444123456789023423523544444444444444444444444444444444444444444444444444444444444444444444123456789023423523544444444444444444444444444444444444444444444444444444444444444444444";
    //strData="dgdfgdfgdfgdfg"
    }</script>
    </head>
    <body>
    <form method = "post" action = "" name = "Fm">
    <input type = "button" value = "更新" onclick = "set()">
    <textarea name = "textAr" rows = 10 cols = 140 >12345
    </textarea><input type = hidden name = "btnH">
    </form>
    </body>
    </html>
      

  11.   

    faint
    稻草人实现的,好像没你这么麻烦。。
    他用的这个  getClientRects方法
      

  12.   

    呵呵
    我也在查。。
    对了,天外兄你有什么好一点的书推荐么?
    javascript的
      

  13.   

    呵呵,惭愧,一本系统点的javascript书都没看过,只是看了jscript手册,剩下的就是泡论坛学习。据说javascript权威指南不错,我也没看过,过些天我也要看下
      

  14.   

    发现稻草人兄写的一个大bug,天外兄,你也来看看
    如果一开始选者3-10行,然后按动textarea的滚动条,下拉3行,然后再按更新,那么就会发现,1-2行也别选中了。<html>
    <head><META http-equiv=\"Content-Type\" content=\"text/html; charset=shift_jis\">
    <title>Test</title>
    <script language=javascript>
    var http_request = false;
    var strData;function set()
    {
      r1 = document.selection.createRange();
      ss = r1.text;
      r  = r1.getClientRects();
      getData();
      document.getElementById("textAr").innerText=strData ; 
      
      if( ss != "" )
      {
      var rng = document.getElementById("textAr").createTextRange();
      var rng2= rng.duplicate();
      rng.moveToPoint(r[0].left,r[0].top);
      rng.select();
      rng2.setEndPoint("StartToEnd", rng);
      rng.moveToPoint(r[r.length-1].right,r[r.length-1].top);
      rng2.setEndPoint("EndToEnd", rng);
      rng2.select();
      }}
    function getData(){
    //strData = window.document.TestApplet.GetStringData();
    strData = "123456789023423523544444444444444444444444444444444444444444444444435444444444444444412345678902342352354444444444444444444444444444444444444444444444444444444444444444444412345678902342352354444444444444444678444444444444444444444444444444444444444444444444441234567890234235235444444444444444444444444444444444444444444444444444444444444444444441234567890234235235444444444444444444444444444444444444444444444444444444444444444444441234567890234235235444444444444444444444444444444444444444467844444444444444444412345678902342352354444444444444444444444444444444444444444444444444444444444444444444412345678902342352354444444444444444444478544444444444444444444444444444444444123456789023423523544444444444444444444444444444444444444444444444444444444444444444444";
    }
    </script>
    </head>
    <body>
    <form method = "post" action = "" name = "Fm">
    <input type = "button" value = "更新" onclick = "set()">
    <textarea name = "textAr" rows = 10 cols = 10>123456
    </textarea><input type = hidden name = "btnH">
    </form>
    </body>
    </html>
      

  15.   

    天外兄,你的也有些问题
    1:画面上会多出"###"这三个字符
    2:循环读取的时候,选中的结果就没了。。代码如下:<html>
    <head><META http-equiv=\"Content-Type\" content=\"text/html; charset=shift_jis\">
    <title>Test</title>
    <script language=javascript>
    var http_request = false;
    var strData;
      function set()
    {
      var obj=document.getElementById("textAr")
      document.selection.createRange().text=document.selection.createRange().text + "###";
       var s = obj.value.indexOf(document.selection.createRange().text);
       var n = document.selection.createRange().text.length-3;
      sel = document.selection.createRange().text;
      getData();
      obj.innerText=strData ; 
      obj.value=obj.value.replace(/###/,"")
      var r = document.getElementById("textAr").createTextRange();
    r.collapse(false);
    r.moveStart("character", -obj.value.length+s);
    r.moveEnd("character", -obj.value.length+n+s);

    r.select();
    }var the_timeout = setTimeout("fresh();",2000);
    function fresh() {
    set();
    the_timeout = setTimeout("fresh();",2000)
    }function getData(){
    //strData = window.document.TestApplet.GetStringData();
    strData = "123456789023423523544444444444444444444444444444444444444444444444435444444444444444412345678902342352354444444444444444444444444444444444444444444444444444444444444444444412345678902342352354444444444444444678444444444444444444444444444444444444444444444444441234567890234235235444444444444444444444444444444444444444444444444444444444444444444441234567890234235235444444444444444444444444444444444444444444444444444444444444444444441234567890234235235444444444444444444444444444444444444444467844444444444444444412345678902342352354444444444444444444444444444444444444444444444444444444444444444444412345678902342352354444444444444444444478544444444444444444444444444444444444123456789023423523544444444444444444444444444444444444444444444444444444444444444444444";
    }
    </script>
    </head>
    <body>
    <form method = "post" action = "" name = "Fm">
    <input type = "button" value = "更新" onclick = "set()">
    <textarea name = "textAr" rows = 10 cols = 10>123456
    </textarea><input type = hidden name = "btnH">
    </form>
    </body>
    </html>
      

  16.   

    兄弟,原来你要实现的是这样的啊,刚刚搞了好久终于差不多了。:)
    你看看还有没有问题?
    <html>
    <head><META http-equiv=\"Content-Type\" content=\"text/html; charset=shift_jis\">
    <title>Test</title>
    <script language=javascript>
    var strData;
    flag=false  function set()
    {
      var obj=document.getElementById("textAr")
      if(document.selection.createRange().text!="")
      {
       if(arguments[0]!=1)
       {
       document.selection.createRange().text=document.selection.createRange().text + "###";
       }
       else
       {
       if(document.selection.createRange().text!=r.text)
       {
       flag=true;//查看是否重新选择
       document.selection.createRange().text=document.selection.createRange().text + "###";
       }
       }
      }
      if(arguments[0]!=1)
      {
       sel = document.selection.createRange().text;
       s = obj.value.indexOf(document.selection.createRange().text);
        n = document.selection.createRange().text.length-3;
      }
      else
      {
       if(flag)
       {
       sel = document.selection.createRange().text;
       s = obj.value.indexOf(document.selection.createRange().text);
        n = document.selection.createRange().text.length-3;
        flag=false;
       }
       else
       {
       sel=r.text+"###"
       r.text=r.text+"###"
       s = obj.value.indexOf(sel);
        n = sel.length-3;
        }
      }
      getData();
      obj.innerText=strData ; 
      obj.value=obj.value.replace(/###/,"")
       r = document.getElementById("textAr").createTextRange();
    r.collapse(false);
    r.moveStart("character", -obj.value.length+s);
    r.moveEnd("character", -obj.value.length+n+s);
    r.scrollIntoView()
    r.select();
    setTimeout("set(1);",2000);
    }setTimeout("set();",2000);function getData(){
    //strData = window.document.TestApplet.GetStringData();
    strData = "123456789023423523544444444444444444444444444444444444444444444444435444444444444444412345678902342352354444444444444444444444444444444444444444444444444444444444444444444412345678902342352354444444444444444678444444444444444444444444444444444444444444444444441234567890234235235444444444444444444444444444444444444444444444444444444444444444444441234567890234235235444444444444444444444444444444444444444444444444444444444444444444441234567890234235235444444444444444444444444444444444444444467844444444444444444412345678902342352354444444444444444444444444444444444444444444444444444444444444444444412345678902342352354444444444444444444478544444444444444444444444444444444444123456789023423523544444444444444444444444444444444444444444444444444444444444444444444";
    }
    </script>
    </head>
    <body>
    <form method = "post" action = "" name = "Fm">
    <input type = "button" value = "更新" onclick = "set()">
    <textarea name = "textAr" rows = 10 cols = 10>123456
    </textarea><input type = hidden name = "btnH">
    </form>
    </body>
    </html>
      

  17.   

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML>
    <HEAD>
    <TITLE> New Document </TITLE>
    <SCRIPT LANGUAGE="JavaScript">
    var staus ;
    var oRange;
    var objTimer;
    var objTimer1;
    var objTimer2;
    var sBookMark;
    <!--
    function fnSearch() {
    fm1.txtarea1.focus();
    oRange = fm1.txtarea1.createTextRange();
    searchtxt(1);
    }function searchtxt(n){
    var v1;
    var v2;
    var txtr;
    var blnS; window.clearInterval(objTimer1);
    window.clearInterval(objTimer2); v1 = fm1.txtarea1.value;
    v2 = fm1.txtarea2.value;
    v3 = fm1.txtarea3.value; if( n == 1) {
    if (oRange != null) {
    oRange.findText(v2);
    if  (oRange.findText(v2) == true){
    //sBookMark = oRange.getBook();
    oRange.select();
    oRange.scrollIntoView();
    objTimer2 = window.setInterval("searchtxt(2)",1000);
    }
    else{
    objTimer = window.setInterval("searchtxt(3)",1000);
    }
    }
    staus = 2 ;
    }
    else if(n==2)  {
    oRange.text = v3;
    staus = 1;
    objTimer1 = window.setInterval("searchtxt(1)",1000);
    }
    else if(n==3) {
    staus = 3 ;
    window.clearInterval(objTimer);
    window.clearInterval(objTimer1);
    window.clearInterval(objTimer2);
    }
    }
    //-->
    </SCRIPT>
    </HEAD>
    <BODY>
    <FORM METHOD=POST name="fm1">
    <TEXTAREA NAME="txtarea1" ROWS="20" COLS="50">
    this is the original text, and this is the string will be repalced.
    this is the original text, and this is the string will be repalced.
    this is the original text, and this is the string will be repalced.
    this is the original text, and this is the string will be repalced.
    this is the original text, and this is the string will be repalced.
    this is the original text, and this is the string will be repalced.
    </TEXTAREA>
    <TEXTAREA NAME="txtarea2" ROWS="20" COLS="50"> will be </TEXTAREA>
    <TEXTAREA NAME="txtarea3" ROWS="20" COLS="50"> has been </TEXTAREA>
    <input type="button" value="search" onclick="fnSearch()">
    </FORM></BODY>
    </HTML>
      

  18.   

     , good good study , day day up ~