在编写网页时,我们经常会使用 iframe 元素来嵌入其他网页。但是,如果我们想要对嵌入的网页进行截图,就会遇到一些问题。本文将介绍如何使用 JavaScript 对 iframe 进行截图,并给出了相关示例代码。
首先,我们需要在页面中引入两个 JavaScript 库:html2canvas 和 jQuery。其中,html2canvas 是一个用于将网页内容转换为 canvas 元素的库,而 jQuery 则是一个常用的 JavaScript 库,用于简化 DOM 操作。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/0.4.1/html2canvas.min.js"></script> <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script> <style> .demo { display: flex; } .html-content { width: 400px; height: 300px; background: #000; position: relative; font-size: 20px; } h1 { color: #666; } p { color: #fff; } #btn { margin: 20px; } .result { min-width: 500px; min-height: 300px; background: #ccc; position: relative; font-size: 20px; } .result > canvas { margin: 10px; } </style> </head> <body> <!-- <iframe src="http://www.likuso.com/city21/2422152.html" id="iframe"></iframe> --> <div class="demo"> <div class="html-content"> <div class="content"> <h1>截图区域</h1> <p>文本内容</p> <!-- 图片内容 --> <img src="http://www.jq22.com/img/logo.png" width="60%" style="padding-top:10px" alt="jQuery插件"> </div> </div> <div> <button id="btn">截图</button> </div> <!-- 结果存储区域 --> <div class="result"></div> </div> <div> <p>1> 截取 iframe 失败,跨域原因, 无法解决iframe 引入的网站需要外部容器跨越获取内容</p> <p>2> 截取自己网页内容 部分成功,原因是加载了外部图片,也是跨域了</p> <p>参考网站:https://cloud.tencent.com/developer/article/1768053?from=information.detail.js</p> </div> <script> function download(base64) { var date = new Date(); if (!base64) { return; } var aLink = document.createElement("a"); // 创建一个a标签 var blob = base64ToBlob(base64); var event = document.createEvent("HTMLEvents"); event.initEvent("click", true, true); aLink.download = date.getTime() + "." + blob.type.split("/")[1]; // 使用时间戳给文件命名 aLink.href = URL.createObjectURL(blob); aLink.click(); } // base64转Blob对象 function base64ToBlob(code) { var parts = code.split(";base64,"); var contentType = parts[0].split(":")[1]; var raw = window.atob(parts[1]); var rawLength = raw.length; var uint8Array = new Uint8Array(rawLength); for (var i = 0; i < rawLength; i++) { uint8Array[i] = raw.charCodeAt(i); } return new Blob([uint8Array], { type: contentType }); } // 点击按钮 document.getElementById('btn').onclick = function () { // const dom = document.querySelector('#iframe') const dom = document.querySelector('.html-content') html2canvas(dom, { onrendered: function (canvas) { var img = canvas.toDataURL('image/png'); console.log(img); // download(img) // 下载 document.querySelector('.result').appendChild(canvas); } }); } </script> </body> </html>
在上述示例代码中,我们通过注释掉的 iframe 元素展示了两种情况下的问题。首先,如果 iframe 的 src 属性指向了外部网页,由于跨域原因,我们无法对其进行截图。其次,即使是对自己的网页进行截图,如果加载了外部图片,同样会因为跨域问题而导致部分截图失败。
为了解决这个问题,我们使用了 html2canvas 库来将指定元素的内容转换为 canvas 元素。在上述代码中,我们通过选择器获取了一个具有特定类名的元素,并将其传递给 html2canvas 函数。在函数的回调函数中,我们将生成的 canvas 元素添加到了指定的存储区域中,并在控制台上打印了 base64 格式的图片数据。
如果你想要将截图下载到本地,可以调用 download 函数,并将 base64 数据传递给它。该函数会创建一个 a 标签,并使用 URL.createObjectURL 方法将 canvas 转换为一个可下载的 Blob 对象。
总结:
本文介绍了如何使用 JavaScript 对 iframe 进行截图。尽管在跨域情况下无法对 iframe 进行截图,但我们可以使用 html2canvas 库对自己的网页内容进行截图。同时,我们也解决了加载外部图片导致截图部分失败的问题。希望本文对你有所帮助!