Javascript 网页水印(非图片水印)实现代码


Posted in Javascript onMarch 01, 2010

1 概述
1.1 定义
在一些B/S结构的应用系统中,有很多页面是需要有水印的。常见的就是公文系统、合同系统等。大家常常关注的是网站图片增加水印,而很少关注页面水印。刚去Google了一圈,关于页面水印的文章的数量为几乎为0. 本文中,流牛木马就与大家一起交流一下有关制作网页水印的心得。
本文讨论以下的情形: 新增水印的方法需要用Javascript完成,并要求能够方便地加入到原有的页面中,不能影响到已有的功能。
1.2 预期目标
就图片水印实现方案来说,我们预期至少包括以下几个目标:
1. 实现悬浮、半透明的图片水印
2. 包含水印的页面,所有元素均为只读(不可写)
3. 在包含框架页面中,可以控制任意一个子页面或父页面的水印生成
4. 在页面放大、缩小(resize过程)后,需要在保证页面不刷新的前提下,重新生成适应页面大小的新水印,以保证所有内容都被水印覆盖,并且不会因水印图片范围过大而产生滚动条。
5. 支持IE6\7\8浏览器。暂不考虑其他浏览器。
1.3 效果图
加密前:
Javascript 网页水印(非图片水印)实现代码 

加密后:

Javascript 网页水印(非图片水印)实现代码
可以打开附件里的文件进行查看。
2 实现步骤
2.1 基本构思
加密的过程是一个Javascript函数执行过程,所以我们首先应该考虑用Javascript操作DOM对象的方式。
在已有的HTML页面中,新建一个DOM对象在Body节点下。该对象的长、宽均经过计算,保证在覆盖全部页面内容的同时又不产生滚动条。将该对象覆盖到原有的页面之上,设置背景图,并设置为透明。
创建新DOM元素:
使用document对象里的createElement方法。创建元素后,设置它的z-index为一个大整数,保证它能够比已有网页的最大z-index大,才能完成“覆盖”。
计算新对象大小:
利用三个DOM对象值: clientWidth 、scrollHeight与clientHeight.
网页中一般不会出现横向滚动条,故不使用scrollWidth.
而纵向的滚动条就很常见了。
为了保证页面内容全部覆盖,在未出现滚动条的时候,使用clientHeight,出现滚动条后,则使用scrollHeight。
设置透明:
利用Alpha值。Alpha是IE支持的css filter。
2.2 应变细节
有一个小细节是很有意思的,前文也提过了,就是resize的过程。
试想,当一个页面打开的时候是550px×400px,那么自然会生成550px×400px大小的水印。但当用户对它进行最大化时,页面没有刷新,不会重新执行生成水印的函数,那么以前生产的水印图片就太小了。
如下图所示的情况。请注意,它的右侧、下侧都是没有水印的。
Javascript 网页水印(非图片水印)实现代码 
为了应对这种情况,我们就需要对body的onresize()函数进行处理。如果以前定义没有onresize()函数,则直接添加onresize();如果以前有onresize()函数,则对之进行修改。
2.3 最终代码
考虑到框架页面需要考虑的情况,该方法包括三个参数: 目标页面对象、目标页面字符串、 背景图片。

function GetWaterMarked(targetObj,jpgUrl,targetStr ) { 
var windowobj=targetObj; 
var waterMarkPicUrl=jpgUrl; 
var controlWindowStr=targetStr; 
if(windowobj.document.getElementById("waterMark") != null) 
return; 
var m = "waterMark"; 
var newMark = windowobj.document.createElement("div"); 
newMark.id = m; 
newMark.style.position = "absolute"; 
newMark.style.zIndex = "9527"; 
newMark.style.top = "0px"; 
newMark.style.left = "0px"; 
newMark.style.width = windowobj.document.body.clientWidth; 
if( parseInt(windowobj.document.body.scrollHeight) > parseInt(windowobj.document.body.clientHeight) ) 
{ 
newMark.style.height = windowobj.document.body.scrollHeight; 
}else 
{ 
newMark.style.height = windowobj.document.body.clientHeight; 
} 
newMark.style.backgroundImage = "url("+ waterMarkPicUrl +")"; 
newMark.style.filter = "alpha(opacity=50)"; 
windowobj.document.body.appendChild(newMark); 
var markStr = "var sobj ="+controlWindowStr+".document.getElementById('waterMark');sobj.style.width ="+controlWindowStr+".document.body.clientWidth;sobj.style.height ="+controlWindowStr+".document.body.clientHeight;"; 
if(windowobj.document.body.onresize != null) 
{ 
var oldResiae = windowobj.document.body.onresize.toString(); 
var oldResiaeStr = oldResiae.substr(oldResiae.indexOf("{")+1); 
var oldResiaeStr= oldResiaeStr.substr(0,oldResiaeStr.lastIndexOf("}")); 
oldResiaeStr+=";"+markStr; 
windowobj.document.body.onresize = new Function(oldResiaeStr); 
} 
else 
{ 
windowobj.document.body.onresize = new Function(markStr); 
} 
}

3 原有页面处理
需要在原有的<body>标签处加入一个onload方法。如:
<body onload="GetWaterMarked(window,'watermark.jpg','this')">
4 附件
演示地址 http://demo.3water.com/js/js_wartermark/baidu_mark.htm
附件下载
http://xiazai.3water.com/201003/yuanma/js_wartermark.rar
Javascript 相关文章推荐
分享一个asp.net pager分页控件
Jan 04 Javascript
jquery 插件学习(五)
Aug 06 Javascript
jquery中each方法示例和常用选择器
Jul 08 Javascript
解决jQuery ajax请求在IE6中莫名中断的问题
Jun 20 Javascript
js实现文字截断功能
Sep 14 Javascript
bootstrap table实例详解
Jan 06 Javascript
vue.js如何更改默认端口号8080为指定端口的方法
Jul 14 Javascript
vue使用keep-alive实现数据缓存不刷新
Oct 21 Javascript
9102年webpack4搭建vue项目的方法步骤
Feb 20 Javascript
vue递归组件实战之简单树形控件实例代码
Aug 27 Javascript
jQuery实现中奖播报功能(让文本滚动起来) 简单设置数值即可
Mar 20 jQuery
js实现右键弹出自定义菜单
Sep 08 Javascript
使用js获取QueryString的方法小结
Feb 28 #Javascript
JQuery 将元素显示在屏幕的中央的代码
Feb 27 #Javascript
jquery 最简单易用的表单验证插件
Feb 27 #Javascript
JQuery团队打造的javascript单元测试工具QUnit介绍
Feb 26 #Javascript
getElementsByTagName vs selectNodes效率 及兼容的selectNodes实现
Feb 26 #Javascript
JavaScript 空位补零实现代码
Feb 26 #Javascript
javascript replace()正则替换实现代码
Feb 26 #Javascript
You might like
PHP开发文件系统实例讲解
2006/10/09 PHP
php magic_quotes_gpc的一点认识与分析
2008/08/18 PHP
php生成rss类用法实例
2015/04/14 PHP
PHP内存使用情况如何获取
2015/10/10 PHP
Symfony实现行为和模板中取得request参数的方法
2016/03/17 PHP
PHP给文字内容中的关键字进行套红处理
2016/04/12 PHP
跟着Jquery API学Jquery之一 选择器
2010/04/07 Javascript
Jquery Ajax的Get方式时需要注意URL地方
2011/04/07 Javascript
JavaScript数据类型详解
2015/04/01 Javascript
JQuery实现样式设置、追加、移除与切换的方法
2015/06/11 Javascript
详解JavaScript对W3C DOM模版的支持情况
2015/06/16 Javascript
javascript伸缩型菜单实现代码
2015/11/16 Javascript
在Vue中如何使用Cookie操作实例
2017/07/27 Javascript
node.js中TCP Socket多进程间的消息推送示例详解
2018/07/10 Javascript
浅析vue给不同环境配置不同打包命令
2018/08/17 Javascript
详解ECMAScript2019/ES10新属性
2019/12/06 Javascript
使用TS来编写express服务器的方法步骤
2020/10/29 Javascript
基于ajax实现上传图片代码示例解析
2020/12/03 Javascript
[01:10:49]Secret vs VGJ.S 2018国际邀请赛淘汰赛BO3 第二场 8.24
2018/08/25 DOTA
Python结巴中文分词工具使用过程中遇到的问题及解决方法
2017/04/15 Python
Python基础教程之利用期物处理并发
2018/03/29 Python
Python同步遍历多个列表的示例
2019/02/19 Python
Django中Middleware中的函数详解
2019/07/18 Python
浅析python,PyCharm,Anaconda三者之间的关系
2019/11/27 Python
pytorch torch.nn.AdaptiveAvgPool2d()自适应平均池化函数详解
2020/01/03 Python
Jupyter notebook运行Spark+Scala教程
2020/04/10 Python
Python基于codecs模块实现文件读写案例解析
2020/05/11 Python
简单了解Python字典copy与赋值的区别
2020/09/16 Python
中国双语服务优势的在线购票及活动平台:247tickets
2018/10/26 全球购物
实习生自荐信范文
2013/11/13 职场文书
大学自我鉴定
2013/12/20 职场文书
爱护公物演讲稿
2014/09/09 职场文书
2015年房地产销售工作总结
2015/04/20 职场文书
2015年信息中心工作总结
2015/05/25 职场文书
只需要12页,掌握撰写一流商业计划书的技巧
2019/05/07 职场文书
MySQL高级进阶sql语句总结大全
2022/03/16 MySQL