js自定义水印
前言:今天在github上看到了一个定义水印的项目,因为获取的星星还蛮多,就多看了几眼,发现该项目简单有趣,心想以后可能会用的到,并且我下载到本地并亲自测试运行了一波。其实该项目最吸引我的是它定义js方法的方式(其实我看过很多项目都是这样定义js方法的,因为他们的项目太大,分析太过于复杂。这个项目让我有了一个切入点)。下面我就把该项目的分析过程与大家分享一下。
一:源码
因为对js,canvan不是太熟悉,故添加了注释已帮助理解和记忆
!function (root, factory) { // root=window factory=方法(可以理解为工厂方法)
if (typeof module === 'object' && module.exports) { // 其实是做的兼容处理(使用方式的兼容处理即js模块开发)
module.exports = factory(root); // nodejs support
module.exports['default'] = module.exports; // es6 support
}
else
root.alimask = factory(root); // 我们用到的代码
}(typeof window !== 'undefined' ? window : this, function () {
var canvas, ctx;
// merge the default value
function mergeOptions(options) { //合并默认参数和可选参数
return Object.assign({
width: 200,
height: 70,
color: '#ebebeb',
alpha: 0.8,
font: '50px Arial'
}, options);
}
return function(text, options) {
if (!canvas || !ctx) {
// if not exist, then initial
if (typeof document !== 'undefined') {
canvas = document.createElement('canvas');
} else {
var Canvas = module.require('canvas');
canvas = new Canvas();
}
ctx = canvas && canvas.getContext && canvas.getContext('2d');
if (!canvas || !ctx) return ''; // if not exist also, then return blank.
}
options = mergeOptions(options);
var width = options.width,
height = options.height;
canvas.width = width;
canvas.height = height;
ctx.clearRect(0, 0, width, height); // clear the canvas
ctx.globalAlpha = 0; // backgroud is alpha
// ctx.fillStyle = 'white'; // no need because of alipha = 0;
ctx.fillRect(0, 0, width, height);
ctx.globalAlpha= options.alpha; // text alpha 透明度
ctx.fillStyle = options.color;
ctx.font = options.font;
ctx.textAlign = 'left';
ctx.textBaseline = 'bottom';
ctx.translate(width * 0.1, height * 0.9); // margin: 10
ctx.rotate(-Math.PI / 12); // 15 degree 图片倾斜角度
ctx.fillText(text, 0, 0);
return canvas.toDataURL(); //生成图片URl
};
});
二 :源码结构分析
源码的简化结构
!function (root, factory) { // root=window factory=方法(可以理解为工厂方法)
root.method //暴露的属性或方法(该js暴露是方法) *****通过root对象暴露全局 你可以理解为全局属性******
}(arg1, function () { // 1.arg1=window()因为window是单例对象并暴露全局2.arg2=function() ******隐藏作用域即闭包 全局的子作用域(对对全局隐藏)*******
function f1(options) { //该方法 做到可隐藏 即只读方法 (只能在该作用域或子作用域中访问到 该作用域对全局作用域隐藏)
}
return function(text, options) { // 参数2 ******提供对隐藏域的访问接口*******
//调用方法f1
f1();
var obj = new **();
return obj;
}
});
分析:通过定义立即执行带参数的立即执行函数来隐藏方法(参数2)和方法f1
原理就是js闭包,相关文章可参考https://www.cnblogs.com/jinliang374003909/p/10352464.html
备注: 合并两个对象的属性方法
Object.assign(obj1,obj2) //以obj1为主,当obj2中有相同的属性时,obj1的属性值被覆盖。当obj2中的属性obj1没有时,obj1添加该属性和值
利用该方法实现了,可选参数和默认参数的机制。 参考地址:https://github.com/hustcc/alimask
js自定义水印的更多相关文章
- js自定义验证码
分享一个js自定义的验证码 window.onload = function () { var code; $('.changePassword').click(function () ...
- js自定义弹出框
js自定义弹出框: 代码如下 <html> <head><title>自定义弹出对话框</title> <style type ="te ...
- 超酷HTML5 Canvas图表应用Chart.js自定义提示折线图
超酷HTML5 Canvas图表应用Chart.js自定义提示折线图 效果预览 实例代码 <div class="htmleaf-container"> <div ...
- 与你相遇好幸运,Sails.js自定义responses
在 /api/responses/ 新建文件 >serviceDBError.js 自定义的数据库错误 >serviceError.js 自定义的数据错误 >serviceSucc ...
- jquery.validate.js默认配置,jquery.validate.js自定义提示信息
jquery.validate.js默认配置,jquery.validate.js自定义提示信息 配置jQuery.validator默认的处理方法 >>>>>>& ...
- web前端对上传的文件进行类型大小判断的js自定义函数
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- js自定义事件、DOM/伪DOM自定义事件
一.说明.引言 我JS还是比较薄弱的,本文的内容属于边学边想边折腾的碎碎念,可能没什么条理,可能有表述不准确的地方,可能内容比较拗口生僻.如果您时间紧迫,或者JS造诣已深,至此您就可以点击右侧广告(木 ...
- Vue.js自定义指令的用法与实例
市面上大多数关于Vue.js自定义指令的文章都在讲语法,很少讲实际的应用场景和用例,以致于即便明白了怎么写,也不知道怎么用.本文不讲语法,就讲自定义指令的用法. 自定义指令是用来操作DOM的.尽管Vu ...
- 3.Node.js 自定义微信菜单
文章目录: 1.Node.js 接入微信公众平台开发 2.Node.js access_token的获取.存储及更新 3.Node.js 自定义微信菜单 ...
随机推荐
- web安全之机器学习入门——3.2 决策树与随机森林
目录 简介 决策树简单用法 决策树检测P0P3爆破 决策树检测FTP爆破 随机森林检测FTP爆破 简介 决策树和随机森林算法是最常见的分类算法: 决策树,判断的逻辑很多时候和人的思维非常接近. 随机森 ...
- java数据结构至对称矩阵压缩存储
刚刚刷java选择题,遇到的对称矩阵压缩存储问题,我们知道对称矩阵是aij=aji的矩阵,压缩存储可以采用一维数组和二维数组存储. 此处只讨论一维数组存储的形式,设数组下标从0开始,对称矩阵为n维矩阵 ...
- python搭建服务器时nginx的有关问题
最近在学习Python服务器搭建的内容,网上大多是Windows环境下的,由于我使用的是Mac,为了不想装双系统折腾,就只好一步步采坑了.比较基础的我一步步记录下来, 1.安装nginx: brew ...
- 记录mysql安装过程遇到问题
1. 远程连接授权 登陆mysql数据库 (如果安装在系统盘可以直接命令, 否则要切换到安装目录..bin/) mysql -u root -p mysql> use mysql; - ...
- spring的一个小例子(二)--解析前面的小例子
接上篇:http://www.cnblogs.com/xuejupo/p/5236448.html 首先应该明白,一个web项目,web.xml是入口. 然后下面来分析上篇博客中出现的web.xml: ...
- 01 C语言程序设计--01 C语言基础--第1章 C语言概述&第2章 GCC和GDB
走进嵌入式开发的世界,企业级项目课程让你达到企业嵌入式应用开发要求.名师在线答疑,解决疑难.科学评测体系,系统评估学习.核心项目实........ 30 门课程 241小时12分钟 824 人学习 学 ...
- Vue控制路由滚动行为
跳转路由时,要求跳转到指定路由的某个地方,可以使用scrollBehavior方法控制. 用法: scrollBehavior(to,from,savedPosition){ } scrollBe ...
- OpenAL音频库例程
Windows下C++可用的OpenAL demo. 基于alut工具库的OpenAL例程,涵盖了基本的OpenAL指令,对部分作出了注释,并且可以播放(当然得把对应的音频文件放到正确的路径下). # ...
- thinkphp 把小程序码二进制流存储到本地
public function getxcxm(){ $id = input('id'); $astk = json_decode($this->getasstk())->access_t ...
- redis_字符串对象
Redis总共支持五种数据类型:string,hash,list,set及zset.这里介绍字符串类型的实现 首先了解字符串对象的结构 // redis对象内存分配,列出主要相关的属性 redisOb ...