Jquery 捕获包含内联svg的div并将其作为图像下载
我编写了代码,用html5捕捉页面的截图。除了页面包含svg之外,一切都很好。当我在屏幕截图之后将svg转换为内联svg时,并没有捕获内联svg 请查收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标记,忽略其
斯克伦肖特
$(函数(){
$('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);