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 自定义微信菜单 ... 
随机推荐
- 1,fiddler的工作原理和安装
			1,工作原理就是通过设置代理监控客户端和服务端的协议 2,fiddler的安装 1,官方的下载地址:https://www.telerik.com/download/fiddler 一步步安装即可 2 ... 
- mysql导出导入数据
			使用sql语句导出数据: 导出时如果不写绝对路径,会提示The MySQL server is running with the --secure-file-priv option so it can ... 
- laravel 默认所有请求带session解决办法
			laravel app/Http/Kernel.php protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\Encr ... 
- idea出现找不到实体类
			今天经理遇到一个很奇怪的问题: 在使用idea时,就是包真实存在,但是包中的实体类却无法智能提示,也无法导入成功: 我推荐的解决办法是重新导入,但是没有用,经理在网上找了很多解决方式,依然无效: 最后 ... 
- 摹客iDoc的PS插件全新改版!—— 智能检测不对应的设计稿
			一.简洁美观——iDoc的PS插件全新界面 iDoc对PS插件的界面进行了全新设计,无论是登录.上传.还是设置界面,都变得更精致.简洁美观,功能分布也非常明确,是一款轻巧且实用的小插件. 二.同步上传 ... 
- 《Java并发编程的艺术》并发编程的挑战(一)
			并发编程的挑战 并发编程的初衷是让程序运行的更快,但是更多的使用多线程真的会让程序变快吗? 1.线程上下文切换 关于线程上下文切换 多个线程在一个处理器里并不是同时进行的,而是非常快速地在线程之间进行 ... 
- AJAX随笔1
			[1] AJAX简介 > 全称: Asynchronous JavaScript And XML > 异步的JavaScript和XML > AJAX就是通过JavaSc ... 
- sql中varchar(n),nvarchar(n) 长度性能及所占空间分析
			sql中varchar(n),nvarchar(n) 长度性能及所占空间分析 1.varchar(n),nvarchar(n) 中的n怎么解释: nvarchar(n)最多能存n个字符,不区分中英文. ... 
- 虹软人脸检测和识别C# - API
			using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Drawing2D ... 
- 获取window.location.href中传的值,并且转换成json数据使用
			做个记录保存一下,以免以后再次用到忘记了. function locVal(){ var url=window.location.href; if (url.indexOf('?')==-1)retu ... 
