前言:今天在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自定义水印的更多相关文章

  1. js自定义验证码

    分享一个js自定义的验证码 window.onload = function () {     var code;     $('.changePassword').click(function () ...

  2. js自定义弹出框

    js自定义弹出框: 代码如下 <html> <head><title>自定义弹出对话框</title> <style type ="te ...

  3. 超酷HTML5 Canvas图表应用Chart.js自定义提示折线图

    超酷HTML5 Canvas图表应用Chart.js自定义提示折线图 效果预览 实例代码 <div class="htmleaf-container"> <div ...

  4. 与你相遇好幸运,Sails.js自定义responses

    在 /api/responses/ 新建文件 >serviceDBError.js 自定义的数据库错误 >serviceError.js  自定义的数据错误 >serviceSucc ...

  5. jquery.validate.js默认配置,jquery.validate.js自定义提示信息

    jquery.validate.js默认配置,jquery.validate.js自定义提示信息 配置jQuery.validator默认的处理方法 >>>>>>& ...

  6. web前端对上传的文件进行类型大小判断的js自定义函数

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. js自定义事件、DOM/伪DOM自定义事件

    一.说明.引言 我JS还是比较薄弱的,本文的内容属于边学边想边折腾的碎碎念,可能没什么条理,可能有表述不准确的地方,可能内容比较拗口生僻.如果您时间紧迫,或者JS造诣已深,至此您就可以点击右侧广告(木 ...

  8. Vue.js自定义指令的用法与实例

    市面上大多数关于Vue.js自定义指令的文章都在讲语法,很少讲实际的应用场景和用例,以致于即便明白了怎么写,也不知道怎么用.本文不讲语法,就讲自定义指令的用法. 自定义指令是用来操作DOM的.尽管Vu ...

  9. 3.Node.js 自定义微信菜单

    文章目录:         1.Node.js 接入微信公众平台开发         2.Node.js access_token的获取.存储及更新         3.Node.js 自定义微信菜单 ...

随机推荐

  1. python_命令

    1)pydoc是python自带的一个文档生成工具,使用pydoc可以很方便的查看类和方法结构 linux环境: pydoc raw_input windows环境:python -m pydoc r ...

  2. instanceof简单用法

    语法: 对象 instanceof 类: 含义:如果这个对象时这个类或者这个类的子类的实例化,那么结果及时ture, 否则 false. 常常用来判断一个类是否是某个类的子类,以此判断A类是否继承或者 ...

  3. HTML5-之workers(多线程执行)

    注:test.js 不涉及DOM元素

  4. HTTPie命令介绍

    HTTPie 是一个 HTTP 的命令行客户端.其目标是让 CLI 和 web 服务之间的交互尽可能的人性化.HTTPie 可用于与 HTTP 服务器做测试.调试和常规交互. 1 定制 HTTP 方法 ...

  5. vue 导航守卫,验证是否登录

    路由跳转前,可以用导航守卫判断是否登录,如果登录了就正常跳转,没有登录就把路由指向登录页面. router.beforeEach((to, from, next) => { const next ...

  6. java构建树形菜单递归工具类

    1.设计菜单实体 import java.util.List; public class Menu { //菜单id private Long id; //父节点id private Long par ...

  7. vue el-upload form 同时提交

    项目需要form 表单和文件上传同时在一个请求,废话不多说上代码: 上传的组件使用pug格式 .row.my-4 .col-12 el-form(:model='domain', :rules='va ...

  8. PowerShell工作流学习-5-自定义活动

    关键点: a)除了内置活动和自定义活动,还可以用C# 编写自定义活动,并将其包括在 XAML 工作流和脚本工作流中,若要将自定义活动添加到脚本工作流中,请使用 #Requires 语句的 Assemb ...

  9. Cache高速缓冲存储器

    Cache的命中率:命中Cache的次数比总访问次数 平均访问时间:t(Cache)X命中次数+t(未命中)X未命中次数 Cache与主存的映射方式: 直接映射 全相联映射 组相联映射 图片来源:ht ...

  10. parrot os 更新到3.7后无法上网(DNS暂时无法解析)

    parrot os 更新到最新后可能ping的通IP,ping不通域名,是DNS解析出问题了 修改/etc/resolv.conf sudo rm /etc/resolv.conf sudo vi / ...