npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

print-of-dom

v1.0.0

Published

单独的对一个DOM进行打印,并且可以进行修改,过滤,删除的处理

Downloads

10

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;
    • @param {String} [args.className] - 将会被设置给替代节点的 className
      • 遍历 originalNode,body ,html为原始DOM的originalNode.className
      • 设置了wrap参数,查找父节点时,为 originalNode.className + " print-of-dom__wrap"

返回值:@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"