欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

文本修改留痕

程序员文章站 2024-02-14 10:39:34
在办公自动化,公文审核的时候,就需要用到 留痕操作了,就是把修改的东西直接在文本上显示,而不直接改动它。在以前,我没有用vml去做,很勉强的用 textrange 改变文本...
在办公自动化,公文审核的时候,就需要用到 留痕操作了,就是把修改的东西直接在文本上显示,而不直接改动它。在以前,我没有用vml去做,很勉强的用 textrange 改变文本的颜色,然后增加一个层显示更改信息。第一次修改还可以实现,但不能做到再次修改,因为,第二次修改的时候,那些原来创建的对象都消失了,而这些对象都是通过 select 操作得到的,用户不选择,脚本就没有办法创建那些对象。
    不久前,我想到了 vml ,开始还觉得是不可能的事情,但我发现了 textrange 对象一个很强大的方法 getclientrects(),这个方法可以返回 textrange 对象包含的每一行的矩形信息。意思是说,如果你用鼠表选择一段文本,文本会自动高亮显示,这样看上去就是一块块矩形组成的不规则图形。getclientrects 方法就可以得到这些矩形的坐标和高宽,这样一来,就可以在选择的文本外套一层 vml 画的矩形,oh my god...真是酷呆了。当我第一次看到它的时候,兴奋的抱着小白(猫)满屋子乱跳。     接下来,讲讲 textrange 对象以及 getclientrects 和 vml 结合画痕迹:
    textrange 对象,顾名思义,文本区域,就是网页上的一部分区域,可以是文本也可以是图像和别的段落格式。所有能用鼠标选择的都可以变成 textrange 对象。ie4 的时候就出现了。textrange 有个强大的方法就是 execcommand(),它可以执行很多命令,动态更改网页中内容、样式。创建 textrange 对象一般有两种途径,一种是用户选择了一段文本,可以使用 var otextrange=document.selection.createrange(); 还有种就是直接把document 创建成 textrange :var otextrange=document.createtextrane() 。不知道有没有注意,两个方式使用的函数不一样,第一个因为本省就是文字了,所有使用 createrange(), 第二个不能确定是否都是文字,所有,必须用 createtextrange()。
    使用 getclientrects 返回的是一个 textrectangle 对象,它是一个集合,没个子集拥有四个属性 bottom,top,left,right ,就是两个角的坐标,这个坐标值是相对于页面的,所以可以直接应用到 vml 中来。
function createrect(num)
{
 var newmark=document.createelement("<div id='mark"+num+"'></div>");
 edit.insertbefore(newmark);
 var orcts = otemprange.getclientrects();//otemprange是一个 textrange 对象
 for(var i=0;i<orcts.length;i++)
 {
  var t=orcts[i].top;
  var l=orcts[i].left;
  var r=orcts[i].right;
  var b=orcts[i].bottom;
  var newrect=document.createelement("<v:roundrect oncontextmenu='popid="+num+";popup();' id='rect"+num+"no"+i+"' style='position:absolute;visibility:hidden' filled=f strokecolor=red strokeweight=1.5pt></v:roundrect>");
  newmark.insertbefore(newrect);
  newrect.style.postop=t+document.body.scrolltop-3;
  newrect.style.posleft=l-2;
  newrect.style.width=r-l;
  newrect.style.height=b-t;
  newrect.style.visibility="";
 }
}

    其他的代码就不再说了,我想说说整个脚本执行的过程。首先用户用鼠标选择一段文字,然后脚本马上把选择的文字创建成临时 textrange 对象,并且通过 execcommand 把这段文字的背景颜色改掉,以做对比。当用户点右键的时候,脚本检查到用户的事件源,如果临时 textrange 对象存在,菜单上将显示 “标记选择中的”这项,如果事件源是已经标记过的文本,菜单上将显示“取消标记”这项。当用户意见选择“标记选中的”的时候,脚本弹出 对话框,提示用户意见输入对选择的这段文字的处理。
    脚本得到用户的选择,就执行上面的代码,用 vml 把选择的文字框起来,然后生成一个层,上面记录的是修改的内容。当用户选择的“取消标记”,本身已经标记过的文字在点右键的事件上就有个 popid=xx 的表达式,popid是个全局变量,通过这个popid 到 document 中去寻找相应的 vml 标记和层,然后使他们的 outerhtml 为空,就起到了取消标记的目的!
    可以访问下面的页面,可以实现过程的。
    文本修改留痕


    到目前为止,关于vml的介绍已经全部写完了。当然我想这里面错误还是有的,理解上也有很不足,表达上还有欠缺的地方。由于 vml 应用的还不太普遍,但功能强大,我觉得有必要让大家都了解一下vml技术,至少让大家知道,很多东西其实都可以用vml完成的。大家一起研究吧!
相关标签: 文本修改留痕