Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Some links on this page are affiliate links: if you buy through them we may earn a commission, at no extra cost to you.

There is no universal html2canvas fix for Internet Explorer 11. First identify the html2canvas build and exact symptom, then separate four different failure classes: a missing JavaScript API such as Promise, CSS that html2canvas cannot reproduce, cross-origin images or a tainted canvas, and blank or clipped output caused by capture dimensions. A Promise polyfill can help an older build, but it does not make a current release IE11-compatible.

IE11 was officially retired and went out of support on June 15, 2022. Move the capture workflow to a supported browser when you can. If IE11 is mandatory, qualify the exact library version, page and deployment environment with tests instead of relying on a blanket compatibility claim.

What “IE11 support” means for html2canvas today

html2canvas does not take a native screenshot. It walks the document, reads the CSS and other properties it understands, and paints a new canvas. The result can therefore differ from what IE11 displays, even when the call succeeds. The project’s current getting-started documentation lists modern evergreen browsers rather than Internet Explorer. Older README guidance said IE9 and newer could work when a Promise polyfill was present; treat that as historical guidance for older builds, not a promise for the current line.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Evidence or version What you can reasonably conclude
Current project documentation Modern Chrome/Chromium, Firefox and Safari are documented; IE11 is not listed.
Older README IE9+ was described as possible with a Promise polyfill. This applies to the compatibility context of those older builds.
Version 1.0.0-alpha.11 changelog entry dated 2018-04-01 A narrow “IE11 member not found” fix existed, but the entry does not identify every page or code path that can produce that error.
Version 1.4.1, released 2022-01-22 Record this or your actual installed version when reproducing a problem; compatibility is version-specific.
Microsoft retirement announcement IE11 support ended on 2022-06-15, so migration is the durable option where your application allows it.

Fix html2canvas in IE11 step by step

1. Record the actual library version and error

Read your package lockfile, bundled asset manifest or the script URL loaded by IE11. Do not assume that a CDN URL or an old forum answer refers to the same build. Capture the complete console message, the target element, its dimensions and whether the failure occurs on every page or only on pages with remote images or advanced CSS.

For a reproducible report, record:

  • html2canvas version (for example, 1.4.1 or an older pinned build);
  • the exact IE11 document mode and Windows environment required by your users;
  • the exception text and line number;
  • the element selector and its scrollWidth and scrollHeight;
  • whether images, web fonts, embedded canvases or third-party widgets are present.

2. Load a Promise polyfill before html2canvas when the build needs it

IE11 does not provide the native Promise API expected by older html2canvas builds. Put a vetted, locally hosted Promise polyfill before the html2canvas script. The order matters:

<script src='/js/es6-promise.min.js'></script>
<script src='/js/html2canvas-legacy-build.js'></script>

Replace those paths with the files you have approved and tested. This supplies the missing API only. It does not implement unsupported CSS, fix cross-origin policy, or establish that a newer html2canvas release supports IE11. If the exception remains after the polyfill loads, inspect the next diagnostic branches instead of adding more polyfills blindly.

3. Reduce the capture to identify a CSS rendering gap

Because html2canvas reconstructs the image from the DOM, every CSS feature must be implemented by the library. The project FAQ explicitly says it will never have full CSS support. Start with a small, plain element and add content or styles back one group at a time:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
var target = document.getElementById('invoice');
html2canvas(target, {
  backgroundColor: '#ffffff',
  logging: true
}).then(function (canvas) {
  document.getElementById('preview').appendChild(canvas);
}).catch(function (error) {
  if (window.console) {
    console.error('html2canvas failed:', error);
  }
});

Temporarily remove effects that are commonly difficult for a legacy renderer to reproduce, such as complex filters, blend modes, unusual clipping, generated content and deeply nested transforms. If the reduced element works, add those rules back individually and provide an IE-specific fallback style for the rule that changes the output. A successful Promise chain does not prove pixel-for-pixel fidelity.

4. Handle remote images and tainted canvases separately

Cross-origin images are a browser security issue, not a Promise issue. An image from another origin must return suitable CORS headers, and the request must be made in a way that allows CORS. You can ask html2canvas to use CORS-enabled images:

html2canvas(document.getElementById('gallery'), {
  useCORS: true,
  allowTaint: false
}).then(function (canvas) {
  var png = canvas.toDataURL('image/png');
  document.getElementById('output').src = png;
});

The image server must send an appropriate Access-Control-Allow-Origin response for your page. If you cannot change that server, use a correctly configured same-origin proxy that fetches the assets and returns them from your own origin; replace the example path below with your real proxy:

html2canvas(document.getElementById('gallery'), {
  useCORS: true,
  proxy: '/html2canvas-proxy',
  allowTaint: false
});

A canvas that was already tainted by cross-origin content cannot be read with toDataURL or similar APIs. html2canvas cannot bypass IE11’s content-security rules. Check image response headers, redirects, credentials and mixed-content warnings, and test with one known same-origin image before changing other options.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

5. Correct blank or clipped output dimensions

A blank canvas can be a size problem rather than a browser-API problem. The element may be larger than the viewport, or the requested bitmap may exceed the canvas limits of that IE11 system. Match the rendering window to the element’s scroll dimensions and inspect the values before capturing:

var element = document.getElementById('report');
var width = element.scrollWidth;
var height = element.scrollHeight;

if (!width || !height) {
  throw new Error('Target has no measurable scroll dimensions');
}

html2canvas(element, {
  windowWidth: width,
  windowHeight: height,
  width: width,
  height: height,
  scrollX: 0,
  scrollY: 0
}).then(function (canvas) {
  document.body.appendChild(canvas);
});

If the result is still blank or truncated, capture a smaller element or split a long document into sections. Large widths, tall pages, high device-pixel ratios and multiple large images consume memory quickly in IE11. Log the measured dimensions and try a small fixed test area to distinguish a size limit from a content problem.

6. Treat “member not found” as a clue, not a complete diagnosis

The 1.0.0-alpha.11 changelog records a fix for an IE11 “member not found” error. It does not say which page, browser build or code path caused it. Confirm that your loaded file actually contains that fix, compare it with the version in your lockfile, and reproduce with the smallest possible target. A different missing member may come from your application code, a Promise implementation, or a browser-specific CSS or DOM path.

7. Decide whether to keep the legacy path

Use a legacy html2canvas build only when you can test the exact page and IE11 environment that must be supported. Pin the tested files, keep the Promise polyfill in the documented order, and maintain fallbacks for unsupported CSS and remote assets. Otherwise, move screenshot generation to a supported browser or to a server-side capture service. IE11’s retirement means that a workaround that happens to function today is not a current support commitment.

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Symptom-to-fix checklist

Symptom Likely class of problem First corrective action
Promise is undefined or an immediate Promise exception Missing API in IE11 Load a tested Promise polyfill before the legacy html2canvas file.
“Member not found” Version-specific IE11 code path or another dependency Verify the loaded version, compare the narrow historical fix, and reduce the target.
Text or effects look different but a canvas is returned Unsupported or partially supported CSS Capture a minimal element and remove styles one group at a time.
Security error when exporting, missing remote images Cross-origin image or tainted canvas Use CORS headers with useCORS, or a correctly configured proxy.
Blank, tiny or clipped canvas Viewport dimensions or browser canvas limits Measure scroll dimensions, set window dimensions, then reduce or split the capture.
Works in Chrome but not IE11 Unsupported browser path or CSS difference Test the exact pinned build and plan migration rather than assuming parity.

Testing and operational safeguards

Test the deployment, not just a local file

Run the page from the same protocol, host, authentication state, headers and asset origins used in production. A local test can hide CORS failures, redirects and conditional CSS. Include pages with long content, lazy images, remote fonts, embedded canvases and the largest capture your users request.

Keep captures bounded

Measure dimensions before calling html2canvas, set an explicit maximum, and split oversized documents. Lowering the capture scale or removing unnecessary images can prevent memory exhaustion, but it cannot make unsupported CSS render correctly. Record the browser console and resulting canvas dimensions for each failure.

Prefer a supported capture environment for new work

Modern evergreen browsers are the project’s documented target. If your product still has an IE11 requirement, isolate that path, document the exact tested versions and give users a migration route. Do not describe the current html2canvas line as generally IE11-compatible when the current documentation does not list IE11.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Or skip the browser setup

If the goal is a reliable website image or PDF rather than an IE11 canvas, ScreenshotNeo performs the capture outside the user’s browser. It accepts consent banners before capture and removes more than 60 known consent platforms, newsletter popups and chat widgets; each cleanup step can be disabled. Bot checks, CAPTCHAs, blank pages, timeouts, failed loads and cache hits are not billed, and each response identifies the page verdict and billing status in X-Page-Verdict and X-Billed headers.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Use one GET request. The API returns PNG, JPEG or WebP, and can also return a PDF:

curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp

See the ScreenshotNeo API documentation for parameters and response handling. Equivalent Python and Node.js requests are:

import requests
r = requests.get("https://api.screenshotneo.com/v1/shot", params={"access_key": "YOUR_API_KEY", "url": "https://stripe.com"}, timeout=90)
r.raise_for_status()
open("shot.webp", "wb").write(r.content)
const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://stripe.com' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);
if (!res.ok) throw new Error(`Screenshot failed: ${res.status}`);
const image = Buffer.from(await res.arrayBuffer());
require('fs').writeFileSync('shot.webp', image);

Options for production captures

ScreenshotNeo provides 63 options, including full-page capture with lazy images loaded, CSS-selector element capture, dark mode, 12 device presets or any viewport, retina scale, PDF paper size/margins/landscape/page ranges, HTML/CSS-to-image, custom CSS and JavaScript, pre-capture clicks, hidden selectors, waits for a selector, delay or network idle, ad/tracker/request/resource blocking, custom headers, cookies, user agent and Authorization, timezone and geolocation, transparent backgrounds, image resizing, configurable cache TTL, signed links, asynchronous jobs with signed webhooks, bulk capture of up to 100 URLs per call, a usage API and an OpenAPI specification. Parameter names used by other screenshot APIs also work, which reduces migration effort. Every feature is included on every plan.

Reliability, performance and cost

For repeat jobs, choose an appropriate cache TTL and inspect the verdict headers so your application can distinguish a clean billed capture from a failed or cached response. Use asynchronous jobs and signed webhooks for long pages or batches. A single request can submit up to 100 URLs for bulk capture. These server-side controls avoid depending on an IE11 tab’s memory, canvas limits or CSS implementation.

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Plan Included screenshots Price
Free 1,000 per month No card required
Starter 3,000 $5
Growth 15,000 $15
Pro 60,000 $39
Scale 250,000 $99
Business 1,000,000 $249

Yearly billing gives two months free. The free plan includes 1,000 screenshots each month with no card, and paid plans start at $5 for 3,000. An MCP server exposes take_screenshot, get_page_info and capture_pdf to Claude, Cursor and other MCP clients, so AI agents can perform the same workflow.

Create a free ScreenshotNeo account to try 1,000 screenshots a month without adding a card.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.