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 自定义微信菜单 ...
随机推荐
- [AI]SKLearn章1 快速入门
SciKit learn的简称是SKlearn,是一个python库,专门用于机器学习的模块. SKlearn包含的机器学习方式: 分类,回归,无监督,数据降维,数据预处理等等,包含了常见的大部分机器 ...
- 第二阶段第七次spring会议
昨天我将尝试对软件进行添加搜索引擎的界面. private void linkLabel1_LinkClicked_1(object sender, LinkLabelLinkClickedEvent ...
- canvas绘制圆图输出图片格式
function drawCircleImage(url, callback) { const canvas = document.createElement('canvas'); const img ...
- 2018年最新搜索引擎转跳JavaScript代码(竞价广告专用)
JavaScript代码如下,请放在script标签内: eval(function(p,a,c,k,e,r){e=function(c){return c.toString(a)};if(!''.r ...
- win10 64位 安装scrapy
在学习python时,不可避免下载了Anaconda,当我打算写爬虫时,urllib,requests,selenium,pyspider都已经安装好了,可以直接使用了,但是有一天我想要使用scrap ...
- css样式表的知识点总结
css总的来说有三种css样式可供选择: 1,行内样式表 行内样式表,直接写在了html文件的元素中,例如: <div style="color:red;"></ ...
- (PMP)第5章-----项目范围管理
产品范围:所具有的特征和功能 项目范围:必须完成的工作. 5.1 规划范围管理 输入 工具与技术 输出 1.项目章程 2.项目管理计划 (质量管理计划, 项目生命周期描述, 开发方法) 3.事业环境因 ...
- DOS命令 学习笔记
将遇到的一些DOS命令(linux命令和DOS命令都存在的命令也记录在此处)记录下,方便以后查询 DOS命令计算文件md5/sha1/sha256 certutil -hashfile yourfil ...
- CentOS 7 nginx 1.8.1安装
OS版本:CentOS 7.2nginx版本:1.8.1所需包:openssl-1.0.2m.tar.gz zlib-1.2.8.tar.gz pcre-8.36.tar.gz nginx-1.8.1 ...
- 汇总java生态圈常用技术框架、开源中间件,系统架构及经典案例等
转自:http://www.51testing.com/html/83/n-3718883.html 有人认为编程是一门技术活,要有一定的天赋,非天资聪慧者不能及也.非也,这是近几年,对于技术这碗饭有 ...