Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/88.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 捕获包含内联svg的div并将其作为图像下载_Jquery_Angularjs_Reactjs_Ember.js_Aurelia - Fatal编程技术网

Jquery 捕获包含内联svg的div并将其作为图像下载

Jquery 捕获包含内联svg的div并将其作为图像下载,jquery,angularjs,reactjs,ember.js,aurelia,Jquery,Angularjs,Reactjs,Ember.js,Aurelia,我编写了代码,用html5捕捉页面的截图。除了页面包含svg之外,一切都很好。当我在屏幕截图之后将svg转换为内联svg时,并没有捕获内联svg 请查收 斯克伦肖特 $(函数(){ $('img')。每个(函数(){ var$img=jQuery(本); var imgID=$img.attr('id'); var imgClass=$img.attr('class'); var imgURL=$img.attr('src'); get(imgURL,函数(数据){ //获取SVG标记,忽略其

我编写了代码,用html5捕捉页面的截图。除了页面包含svg之外,一切都很好。当我在屏幕截图之后将svg转换为内联svg时,并没有捕获内联svg

请查收


斯克伦肖特
$(函数(){
$('img')。每个(函数(){
var$img=jQuery(本);
var imgID=$img.attr('id');
var imgClass=$img.attr('class');
var imgURL=$img.attr('src');
get(imgURL,函数(数据){
//获取SVG标记,忽略其余部分
var$svg=jQuery(data.find('svg');
//将替换图像的ID添加到新SVG
如果(imgID的类型!==‘未定义’){
$svg=$svg.attr('id',imgID);
}
//将替换的图像类添加到新的SVG
if(imgClass的类型!==“未定义”){
$svg=$svg.attr('class',imgClass+'replaced svg');
}
//根据删除所有无效的XML标记http://validator.w3.org
$svg=$svg.removeAttr('xmlns:a');
//用新SVG替换图像
$img.replaceWith($svg);
}“xml”);
});
});
(职能(出口){
函数urlsToAbsolute(节点列表){
如果(!节点列表长度){
返回[];
}
var attrName='href';
if(nodeList[0]。uuu proto_uuu==HTMLImageElement.prototype | | nodeList[0]。uu proto_u==HTMLScriptElement.prototype){
attrName='src';
}
nodeList=[].map.call(nodeList,function(el,i){
var attr=el.getAttribute(attrName);
如果(!attr){
返回;
}
var absURL=/^(https?|数据):/i.test(attr);
if(absURL){
返回el;
}否则{
返回el;
}
});
返回节点列表;
}
函数screenshotPage(){
var wrapper=document.getElementById('wrapper');
html2canvas(包装器{
onrendered:函数(画布){
canvas.toBlob(函数(blob){
saveAs(blob,'myScreenshot.png');
});
}
});
}
函数addOnPageLoad_u382;(){
window.addEventListener('DOMContentLoaded',函数(e){
var scrollX=document.documentElement.dataset.scrollX | | 0;
var scrollY=document.documentElement.dataset.scrollY | | 0;
scrollTo(scrollX,scrollY);
});
}
函数生成(){
屏幕快照页();
}
exports.screenshotPage=屏幕快照页面;
exports.generate=generate;
})(窗口);
对于这个特殊的svg没有问题,但是对于某些svg,捕获的图像与原始图像不同

有没有什么方法可以在不使用html画布的情况下捕获屏幕截图?如果没有,如何更改代码以正确捕获svg元素

我想现在每个人都熟悉了很棒的屏幕截图扩展。他们是怎么做这个屏幕截图的


Angular 1(不是2或更高版本)、React JS、Vue.JS、Aurelia JS或任何现代JavaScript库中是否有用于截图的方法?

您可以使用名为的JavaScript库(用于在画布上正确呈现SVG)以及

ᴡᴏʀᴋɪɴɢ ᴇxᴀᴍᴘʟᴇ

$(函数(){
$('img')。每个(函数(){
var$img=jQuery(本);
var imgID=$img.attr('id');
var imgClass=$img.attr('class');
var imgURL=$img.attr('src');
get(imgURL,函数(数据){
//获取SVG标记,忽略其余部分
var$svg=jQuery(data.find('svg');
//将替换图像的ID添加到新SVG
如果(imgID的类型!==‘未定义’){
$svg=$svg.attr('id',imgID);
}
//将替换的图像类添加到新的SVG
if(imgClass的类型!==“未定义”){
$svg=$svg.attr('class',imgClass+'replaced svg');
}
//根据删除所有无效的XML标记http://validator.w3.org
$svg=$svg.removeAttr('xmlns:a');
//用新SVG替换图像
$img.replaceWith($svg);
}“xml”);
});
});
(职能(出口){
函数urlsToAbsolute(节点列表){
如果(!节点列表长度){
返回[];
}
var attrName='href';
if(nodeList[0]。uuu proto_uuu==HTMLImageElement.prototype | | nodeList[0]。uu proto_u==HTMLScriptElement.prototype){
attrName='src';
}
nodeList=[].map.call(nodeList,function(el,i){
var attr=el.getAttribute(attrName);
如果(!attr){
返回;
}
var absURL=/^(https?|数据):/i.test(attr);
if(absURL){
返回el;
}否则{
返回el;
}
});
返回节点列表;
}
函数screenshotPage(){
var wrapper=document.getElementById('wrapper');
html2canvas(包装器{
onrendered:函数(画布){
函数getOffset(el){
el=el.getBoundingClientRect();
返回{
左:el.left+window.scrollX,
顶部:el.top+window.scrollY
}
}
var cachedCanvas=画布;
var ctx=canvas.getContext('2d');
var svgs=document.querySelectorAll('svg');
forEach(函数(svg){
var svgWidth=svg.width.baseVal.value;
var svgHeight=svg.height.baseVal.value;
var svgLeft=getOffset(svg).left-40;
var svgTop=getOffset(svg).top-62;
var offScreenCanvas=document.createElement('canvas');
offScreenCanvas.width=svgWidth;
offScreenCanvas.height=svghight;
canvg(offScreenCanvas,svg.outerHTML);
ctx.drawImage(cachedCanvas,0,0);
ctx.提取图像(取款)
<script src="https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/1.3.3/FileSaver.min.js"></script>
<script src="https://github.com/niklasvh/html2canvas/releases/download/0.5.0-alpha1/html2canvas.svg.js"></script>
<script src="https://github.com/niklasvh/html2canvas/releases/download/0.5.0-alpha1/html2canvas.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<div id="wrapper">
   <h1>Scrrenshot</h1>
   <div class="img-div"><img src='https://istack.000webhostapp.com/1tf.svg'></div>
   <form class="cf">
      <div class="half left cf">
         <input type="text" id="input-name" placeholder="Name">
         <input type="email" id="input-email" placeholder="Email address">
         <input type="text" id="input-subject" placeholder="Subject">
      </div>
      <div class="half right cf">
         <textarea name="message" type="text" id="input-message" placeholder="Message"></textarea>
      </div>
      <input type="submit" value="Submit" id="input-submit">
   </form>
</div>
<a class="btn btn-success" href="javascript:void(0);" onclick="generate();">Generate Screenshot »</a>

$(function() {

   $('img').each(function() {

      var $img = jQuery(this);
      var imgID = $img.attr('id');
      var imgClass = $img.attr('class');
      var imgURL = $img.attr('src');

      jQuery.get(imgURL, function(data) {
         // Get the SVG tag, ignore the rest
         var $svg = jQuery(data).find('svg');

         // Add replaced image's ID to the new SVG
         if (typeof imgID !== 'undefined') {
            $svg = $svg.attr('id', imgID);
         }
         // Add replaced image's classes to the new SVG
         if (typeof imgClass !== 'undefined') {
            $svg = $svg.attr('class', imgClass + ' replaced-svg');
         }
         // Remove any invalid XML tags as per http://validator.w3.org
         $svg = $svg.removeAttr('xmlns:a');

         // Replace image with new SVG
         $img.replaceWith($svg);

      }, 'xml');

   });
});

(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() {
      var wrapper = document.getElementById('wrapper');
      html2canvas(wrapper, {
         onrendered: function(canvas) {
            canvas.toBlob(function(blob) {
               saveAs(blob, 'myScreenshot.png');
            });
         }
      });
   }

   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() {
      screenshotPage();
   }
   exports.screenshotPage = screenshotPage;
   exports.generate = generate;
})(window);