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 相关文章推荐
JavaScript实现拼音排序的方法
Nov 20 Javascript
js简单的弹出框有关闭按钮
May 05 Javascript
jQuery的:parent选择器定义和用法
Jul 01 Javascript
JS+CSS实现可以凹陷显示选中单元格的方法
Mar 02 Javascript
在JavaScript中操作时间之getMonth()方法的使用
Jun 10 Javascript
javascript中select下拉框的用法总结
Jan 07 Javascript
vue-cli单页应用改成多页应用配置详解
Jul 14 Javascript
vue2.0在table中实现全选和反选的示例代码
Nov 04 Javascript
node实现基于token的身份验证
Apr 09 Javascript
Vuex的各个模块封装的实现
Jun 05 Javascript
vue+element使用动态加载路由方式实现三级菜单页面显示的操作
Aug 04 Javascript
vue-cli3访问public文件夹静态资源报错的解决方式
Sep 02 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
网页游戏开发入门教程三(简单程序应用)
2009/11/02 PHP
利用PHP获取网站访客的所在地位置
2017/01/18 PHP
javascript div 弹出可拖动窗口
2009/02/26 Javascript
CheckBoxList多选样式jquery、C#获取选择项
2013/09/06 Javascript
js打开新窗口方法整理
2014/02/17 Javascript
jQuery插件扩展实例【添加回调函数】
2016/11/26 Javascript
jQuery基于正则表达式的表单验证功能示例
2017/01/21 Javascript
利用js查找数组中指定元素并返回该元素的所有索引示例
2017/03/29 Javascript
微信小程序实现自定义modal弹窗封装的方法
2018/06/15 Javascript
bootstrap里bootstrap动态加载下拉框的实例讲解
2018/08/10 Javascript
js使用swiper实现层叠轮播效果实例代码
2018/12/12 Javascript
JS严格模式原理与用法实例分析
2020/04/27 Javascript
vue模块移动组件的实现示例
2020/05/20 Javascript
Vue 请求传公共参数的操作
2020/07/31 Javascript
vue实现顶部菜单栏
2020/11/08 Javascript
web.py中调用文件夹内模板的方法
2014/08/26 Python
Python functools模块学习总结
2015/05/09 Python
详解 Python 与文件对象共事的实例
2017/09/11 Python
Python数据类型之Tuple元组实例详解
2019/05/08 Python
python Event事件、进程池与线程池、协程解析
2019/10/25 Python
python如何实现复制目录到指定目录
2020/02/13 Python
Python使用pdb调试代码的技巧
2020/05/03 Python
PyQt5.6+pycharm配置以及pyinstaller生成exe(小白教程)
2020/06/02 Python
美国最大的珠宝商之一:Littman Jewelers
2016/11/13 全球购物
比利时买床:Beter Bed
2017/12/06 全球购物
速比涛英国官网:Speedo英国
2019/07/15 全球购物
向全球直邮输送天然健康产品:iHerb.com
2020/05/03 全球购物
外贸业务员求职自荐信分享
2013/09/21 职场文书
自考自我鉴定范文
2013/10/30 职场文书
活动总结报告范文
2014/05/04 职场文书
岗位说明书怎么写
2014/07/30 职场文书
2016年小学“我们的节日·中秋节”活动总结
2016/04/05 职场文书
python实现黄金分割法的示例代码
2021/04/28 Python
自从在 IDEA 中用了热部署神器 JRebel 之后,开发效率提升了 10(真棒)
2021/06/26 Java/Android
Vue的过滤器你真了解吗
2022/02/24 Vue.js
Grafana可视化监控系统结合SpringBoot使用
2022/04/19 Redis