【发布时间】:2018-07-25 15:56:42
【问题描述】:
我目前正在下载带水印的图像,但发生了一些奇怪的事情。当图像被加水印时,它的 src 是 DataURL,我想替换部分 DataURL 字符串来下载它。但奇怪的是,脚本似乎只是跳过了该步骤并在没有它的情况下执行它。当我通过控制台运行相同的命令来替换部分字符串时,它突然工作得很好。我错过了什么或发生了什么?
代码:
var watermarkImage = 'https://pravdaovode.cz/wp-content/uploads/2018/07/vodoznak.png';
var afterMark = "";
function getScreen() {
html2canvas(div_box).then(function(canvas) {
console.log(canvas.toDataURL());
var blob = dataURItoBlob(canvas.toDataURL());
placeMark(blob);
if ('msToBlob' in canvas) {
blob = dataURItoBlob(afterMark);
navigator.msSaveBlob(blob, 'pravda_o_vode_cenova_mapa.jpg');
}
else {
afterMark = afterMark.replace("image/png", "image/octet-stream");
var a = document.createElement('a');
a.setAttribute('href', afterMark);
a.setAttribute('target', '_blank');
a.setAttribute('download', 'pravda_o_vode_cenova_mapa.png');
a.style.display = 'none';
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
}
});
}
function dataURItoBlob(dataURI) {
var byteString;
if (dataURI.split(',')[0].indexOf('base64') >= 0)
byteString = atob(dataURI.split(',')[1]);
else
byteString = unescape(dataURI.split(',')[1]);
var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];
var ia = new Uint8Array(byteString.length);
for (var i = 0; i < byteString.length; i++) {
ia[i] = byteString.charCodeAt(i);
}
return new Blob([ia], {type:mimeString});
}
function placeMark(blobImage) {
watermark([blobImage, watermarkImage])
.image(watermark.image.center())
.then(function (img) {
afterMark = img.src;
});
}
div_box 变量只是包含在 div 中的页面的一部分。我正在使用 html2canvas 库。
【问题讨论】:
-
为什么不添加“调试器;”一行到你的函数的开头,按F12在你的网络浏览器中打开开发者工具并逐步调试它?
-
你似乎在
placeMark中调用异步调用。 -
@HirasawaYui 在这种情况下,这将“修复”(或更好地隐藏)问题
-
上帝保佑你,我完全怀念异步。谢谢
标签: javascript string replace download str-replace