print-of-dom
v1.0.0
Published
单独的对一个DOM进行打印,并且可以进行修改,过滤,删除的处理
Downloads
9
Readme
说明
可以单独的对一个DOM进行打印。
采用复制DOM到一个新的iframe中的方式,对字体图标,图片,canvas等都进行了相应的处理
并且可以方便的自己处理每一个元素
安装引用
安装
$ npm install --save print-of-dom
引用
ES
import printOfDom from "print-of-dom";
commonjs
const printOfDom = require("print-of-dom");
全局导入
// ES import "print-of-dom/dist/print-of-dom.js"; window.printOfDom("body"); // 将会在window上注册一个printOfDom方法
基本使用
import printOfDom from "print-of-dom";
printOfDom("body", { debug: true }).then(()=> {
console.log("打印结束");
});
参数说明
printOfDom(domOrSelector [, options] [, printCallback])
注意:打印方法将会返回一个promies来表示打印是否结束。但是只能表示打印页面成功的调起并且关闭,并不能确定打印是否成功
参数:
@param {HTMLElement|String} domOrSelector
- 需要被打印DOM元素 或 选择器字符串@param {Object|printCallback} [options]
- 打印配置或者打印回调函数@param {Function} [options.handler]
- 打印之前,对所有需要打印的DOM进行处理时回调函数@param {Boolean} [options.wrap=false]
- 是否需要将打印节点包含在父元素中@param {RegExp} [options.regExcludeAttr]
- 遍历 originalNode 时,获取原始节点的computedStyle转换为cssText之前需要排除的样式属性@param {Boolean} [options.debug=false]
- 是否开启 debug 模式
返回值:@returns {Promise}
- 打印状态
- 表示打印页面成功的调起并且关闭
- 并不能确定打印是否成功
options.handler(originalNode, clonedNode[, args])
打印之前,对所有需要打印的DOM进行处理时回调函数。可以在这里对即将打印的DOM进行修改,替换,筛选
这个方法会在这些时候调用:
- 遍历 originalNode 时,每个节点克隆后
- 创建iframe标签复制原始的html,body类名和样式时
- 设置了wrap参数,查找到的每个父节点并克隆后
也就是说,在iframe中所有影响打印结果的DOM都会经过这个方法
默认情况下会把canvas标签转换为img
当 options 直接设置为一个方法时是此参数的快捷方式
printOfDom("body", function(originalNode, clonedNode, args){}); // 等同于 printOfDom("body", { handler(originalNode, clonedNode, args){} });
参数:
@param {Node} originalNode
- 原始节点@param {Node} clonedNode
- 克隆节点。原始节点的替代节点,大多情况下是原始节点的克隆,除了 body 和 html@param {Object} [args]
- 设置给替代节点参数@param {String} [args.cssText]
- 将会被设置给替代节点的 style.cssText(行内样式) 值。- 遍历 originalNode 时,原始节点的 computedStyle
- body 和 html 等同原始节点的行内样式
- 设置了wrap参数,查找父节点时,为
position: static;
- 遍历 originalNode 时,原始节点的 computedStyle
@param {String} [args.className]
- 将会被设置给替代节点的 className- 遍历 originalNode,body ,html为原始DOM的
originalNode.className
- 设置了wrap参数,查找父节点时,为
originalNode.className + " print-of-dom__wrap"
- 遍历 originalNode,body ,html为原始DOM的
返回值:@return {Node|Object|undefind}
- 返回值将直接影响替代节点
{Node}
替换默认的替代节点{Object}
替换默认的 args 参数false
排除当前节点以及其所有的子节点。 不能排除 html 和 body{undefind}
不进行任何替换操作。但是可以直接修改args的参数
示例:
替换节点
处理函数中返回一个新的节点可以代替默认的克隆节点 clonedNode
这个替换只是替换克隆节点本身,并不包括所有子节点,子节点依旧会正常添加为新节点的子节点
printOfDom("body", { handler(originalNode, clonedNode, args){ // 把所有的a标签替换为span标签 if(originalNode.tagName === "A"){ let span = document.createElement("span"); span.className = args.className + " new_span"; return span; // return 新节点 } } });
替换参数
printOfDom("body", { handler(originalNode, clonedNode, args){ if(originalNode.tagName === "A"){ return { cssText: args.cssText + "color: red;", className: args.className + " link" } } } });
排除节点
printOfDom("body", { handler(originalNode, clonedNode, args){ // 返回 false 排除当前节点 return !/no-print/.test(args.className); } });
修改参数
printOfDom("body", { handler(originalNode, clonedNode, args){ args.cssText += "color: red;"; args.className += " link"; } });
options.wrap
是否需要将打印节点包含在父元素中
主要是为了解决一些伪类元素的设置是依赖于父元素的类名设置的,比如通过类名设置字体图标时。
options.regExcludeAttr
遍历 originalNode 时,获取原始节点的computedStyle
转换为cssText之前需要排除的样式属性
主要是排除一些完全不会影响打印结果,或者导致打印结果与预期不符的样式
- 默认值为
/^(transition|scroll|overscroll|cursor|animation|inline-size|pointer-events)/
options.debug
是否开启调试模式
- 开启后会保留并且显示用于打印而创建的iframe标签
- 这个iframe是被添加在body的最后
- 这个iframe标签有一个固定的类名 "print-of-dom__iframe"