/**
* Created by 晟途 on 2017/9/21.
*/
'use strict';
class Stamp {
constructor(dom, text, options = {}) {
let $root = document.getElementById(dom.replace('#',''));
$root.style.position = "relative";
let d = document.createElement('div');
let style = {
position: "fixed",
left: 0,
right: 0,
top: 0,
bottom: 0,
opacity: options.opacity ? options.opacity : .05,
"pointer-events": "none",
"z-index": 999999,
"background-repeat":"repeat"
};
for(let key in style) d.style[key] = style[key];
document.body.appendChild(d);
let bgUrl = this.stamp(d, text);
//低版本IE如果pointer-event失效需要hack
!this.supportsPointerEvents() && this.bindClick($root,bgUrl,d);
}
bindClick ($root,bgUrl,removeTarget) {
removeTarget.attachEvent('onclick', (e)=>{
removeTarget.style.display = "none";
let x = e.x, y = e.y;
let target = document.elementFromPoint(x,y);
let evt = document.createEvent('MouseEvents');
evt.initEvent("click", true, true);
target.dispatchEvent(evt);
removeTarget.style.display = "block";
})
}
supportsPointerEvents (){
let dummy = document.createElement('_');
if(!('pointerEvents' in dummy.style)) return false;
dummy.style.pointerEvents = 'auto';
dummy.style.pointerEvents = 'x';
document.body.appendChild(dummy);
let r = getComputedStyle(dummy).pointerEvents === 'auto';
document.body.removeChild(dummy);
return r;
}
stamp (dom, text) {
var _ns = "http://www.w3.org/2000/svg";
// 创建一个svg对象
var svg = document.createElementNS(_ns, "svg");
var width = 250, height = 100;
this.setA(svg, {
width : width,
height : height
})
// // svg中绘制文本
var svgText = document.createElementNS(_ns, "text");
this.setA(svgText, {
fill: "black",
"text-anchor": "middle",
"font-family": "monospace",
"transform": "translate(125, 50)rotate(-15)"
})
svgText.textContent = text
svg.appendChild(svgText);
var svgStr = new XMLSerializer().serializeToString(svg);
var bgUrl = 'data:image/svg+xml;base64,' + this.encode(svgStr);
dom.style.backgroundImage = 'url(' + bgUrl + ')';
return bgUrl;
}
encode (input) {
var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
var output = "";
var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
var i = 0;
input = this._utf8_encode(input);
while (i < input.length) {
chr1 = input.charCodeAt(i++);
chr2 = input.charCodeAt(i++);
chr3 = input.charCodeAt(i++);
enc1 = chr1 >> 2;
enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
enc4 = chr3 & 63;
if (isNaN(chr2)) {
enc3 = enc4 = 64;
} else if (isNaN(chr3)) {
enc4 = 64;
}
output = output +
_keyStr.charAt(enc1) + _keyStr.charAt(enc2) +
_keyStr.charAt(enc3) + _keyStr.charAt(enc4);
}
return output;
}
_utf8_encode (string) {
string = string.replace(/\r\n/g, "\n");
var utftext = "";
for (var n = 0; n < string.length; n++) {
var c = string.charCodeAt(n);
if (c < 128) {
utftext += String.fromCharCode(c);
}
else if ((c > 127) && (c < 2048)) {
utftext += String.fromCharCode((c >> 6) | 192);
utftext += String.fromCharCode((c & 63) | 128);
}
else {
utftext += String.fromCharCode((c >> 12) | 224);
utftext += String.fromCharCode(((c >> 6) & 63) | 128);
utftext += String.fromCharCode((c & 63) | 128);
}
}
return utftext;
}
setA (target, obj) {
for(let key in obj) {
target.setAttribute(key, obj[key])
}
}
}
module.exports = Stamp;
export default Stamp;