how to capture screenshot in html using js or jquery

84,935

Solution 1

Web pages are not the best things to be "screenshoted", because of their nature; they can include async elements, frames or something like that, they are usually responsive etc...

For your purpose the best way is to use external api or an external service, I think is not a good idea to try doing that with JS.

You should try url2png

Solution 2

Look at the html2canvas project. Their approach is that they create a representation of the page inside a canvas. They don't make an actual screenshot, but builds it based on the content on the page and the loaded stylesheet. It could be used on the entire body or just a specific element.

It is also really easy to use. Here is an example:

html2canvas(document.body, {
  onrendered: function(canvas) {
    document.body.appendChild(canvas);
  }
}); 

You can adapt it to your code relatively easy.

Take a look at their demo. Click on any of the buttons and then scroll to the bottom of the page.


Solution 3

you can use HTML5 and JavaScript this is a sample code that worked for me.

(function (exports) {
    function urlsToAbsolute(nodeList) {
        if (!nodeList.length) {
            return [];
        }
        var attrName = 'href';
        if (nodeList[0].__proto__ === HTMLImageElement.prototype
        || nodeList[0].__proto__ === HTMLScriptElement.prototype) {
            attrName = 'src';
        }
        nodeList = [].map.call(nodeList, function (el, i) {
            var attr = el.getAttribute(attrName);
            if (!attr) {
                return;
            }
            var absURL = /^(https?|data):/i.test(attr);
            if (absURL) {
                return el;
            } else {
                return el;
            }
        });
        return nodeList;
    }

    function screenshotPage() {
        urlsToAbsolute(document.images);
        urlsToAbsolute(document.querySelectorAll("link[rel='stylesheet']"));
        var screenshot = document.documentElement.cloneNode(true);
        var b = document.createElement('base');
        b.href = document.location.protocol + '//' + location.host;
        var head = screenshot.querySelector('head');
        head.insertBefore(b, head.firstChild);
        screenshot.style.pointerEvents = 'none';
        screenshot.style.overflow = 'hidden';
        screenshot.style.webkitUserSelect = 'none';
        screenshot.style.mozUserSelect = 'none';
        screenshot.style.msUserSelect = 'none';
        screenshot.style.oUserSelect = 'none';
        screenshot.style.userSelect = 'none';
        screenshot.dataset.scrollX = window.scrollX;
        screenshot.dataset.scrollY = window.scrollY;
        var script = document.createElement('script');
        script.textContent = '(' + addOnPageLoad_.toString() + ')();';
        screenshot.querySelector('body').appendChild(script);
        var blob = new Blob([screenshot.outerHTML], {
            type: 'text/html'
        });
        return blob;
    }

    function addOnPageLoad_() {
        window.addEventListener('DOMContentLoaded', function (e) {
            var scrollX = document.documentElement.dataset.scrollX || 0;
            var scrollY = document.documentElement.dataset.scrollY || 0;
            window.scrollTo(scrollX, scrollY);
        });
    }

    function generate() {
        window.URL = window.URL || window.webkitURL;
        window.open(window.URL.createObjectURL(screenshotPage()));
    }
    exports.screenshotPage = screenshotPage;
    exports.generate = generate;
})(window);

you can find a demo here

Share:
84,935
divelner
Author by

divelner

Updated on July 16, 2022

Comments

  • divelner
    divelner almost 2 years

    I'm need my clients be able to capture screenshot of any page of my website using button like this:

    <button>Take screenshot</button>

    I tried to use html2canvas but it's doesn't work properly for me because i have iframe's in my website and it's cause some session problems.

    someone have solution for this?

    i looked all over google and didn't found something that's helps me much.

  • jinyong lee
    jinyong lee over 7 years
    What exactly does this code accomplish? You do not get an image of the web page, do you?
  • Eray
    Eray over 6 years
    @JānisElmeris , I didn't try but this code can help you to download generated blob : gist.github.com/nolanlawson/0eac306e4dac2114c752
  • Med Abida
    Med Abida over 6 years
    the code did work for me, you can check the demo if ur not willing to test it, @Eray thanks, that might be helpful
  • BurninLeo
    BurninLeo almost 5 years
    Please note that uBlock (and maybe other ad blockers) blocks the demo for some reason. If disabled, the button "generate screenshot" will copy the page's content, create an URL from it, and display the content in a new browser window/tab. It's not actually a screenshot but rather an option to express the content of the page as URL. Let's call it a fake ;)
  • kunal verma
    kunal verma almost 5 years
    @MedAbida this is nothing near to screen shot ... no image output.....
  • Diego Favero
    Diego Favero about 4 years
    Does not works on websites that requires login ....
  • Puspam
    Puspam almost 4 years
    This should have been the accepted answer. :)
  • Itay Grudev
    Itay Grudev almost 4 years
    @Puspam But that wouldn't get me the Populist badge. I want that badge!
  • samjco
    samjco over 2 years
    demo is broken!