| 赞 | 7 |
| VIP | |
| 好人卡 | |
| 积分 | 24 |
| 经验 | |
| 最后登录 | 2025-10-22 |
| 在线时间 | 169 小时 |
- 梦石
- 0
- 星屑
- 2381
- 在线时间
- 169 小时
- 注册时间
- 2017-4-25
- 回帖
- 185
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有账号?注册会员
×
本帖最后由 rexuegg123 于 2021-5-16 08:59 编辑
很久没来论坛了,向大神请教两个问题:
一、如何向MV中引入Proxy(代理)机制?
二、在mv中,利用canvas操作图片后(比如几张图片拼合在一起),如何下载canvas中的图像内容(下载保存为图片)?
问题已解决,感谢zths大神指导!解决办法:原来我用的1.5.1版的MV,改用1.6.1后两个问题“不药而愈”
问题一
先上代码:
[pre lang="javascript"]function soul () {};
soul.prototype.create = function (target) {
window[target.name+'s'] = new Proxy (target, this.action);
};
soul.prototype.action = {
set: function (target, prop, value) {
if (target[prop] !== value) {
console.log(target.name+':',prop,target[prop],'=>',value);
target[prop] = value;
}
}
};
soul = new soul ();
var obj={
name:'obj', arr:[1,2,3,4,5], mo:'456', xx:{y:12}, fn:function(){delete window[this.name+'s']}
}
soul.create(obj);[/pre]
以上代码是利用Proxy的代理机制为后面的 obj 对象新建一个镜像objs(也是一个对象,其属性与方法与obj一致)。建立镜像后,obj的任何操作都在objs上进行。而objs的任何属性变化都可以通过增加方法的方式来提供反馈,如上面的代码就提供了属性变化时的console.log()的提示功能。比如:
重新设定obj的name属性
objs.name='objs';
obj: name obj => objs //控制台提示的内容
以上是在浏览器中运行上述代码后的得到的结果gif
笔者的目利用Proxy的拦截反馈机制,建立游戏NPC的AI,也可以为其他角色通过监视自身属性的变化来建立自行行动的能力。但在mv中使用时,mv表示不认识Proxy:Uncaught ReferenceError: Proxy is not defined……
所以有大神知道在怎么在mv中引入Proxy吗?
问题二:
老规矩,先上代码
[pre lang="javascript"]function CanvasDemo () {};
CanvasDemo.Create = function () {
var z = '<div>\
<p onclick="CanvasDemo.getimg()">导出图片到div元素</p><img id="outimg" src="">\
<p>myCanvas中的合成图内容----</p><a id="downloadPic">点击下载合成图</a>\
<canvas id="myCanvas" width="200" height="auto" style="border:1px solid #d3d3d3;">\
</div>'
$('#StandingDiv').append(z);
var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d");
var min = 7,max=12;
this.num = max-min+1;
for (var i=min;i<=max;i++) {
this.img(ctx,'cjng',i);
}
console.log(c.width);
this.WH_Re (c,min,max);
setTimeout(function(){
this.downLoad(c,'下载测试img');
//this.getimg();
}.bind(this),30);
};
CanvasDemo.WH_Re = function (canvas) {
canvas.width = 50*this.num;
canvas.height = 50;
};
CanvasDemo.img = function (ctx,str,i) {
var s = i+'';
var num = s.length==1 ? '0'+i : i;
var img = new Image();
img.src = FT_url.itemic (str+num);
img.onload = function() {
ctx.drawImage(img,(i-7)*50,0);
};
};
CanvasDemo.getimg = function(canvas) {// 单击“生成图片”按钮,导出图片
var c=document.getElementById("myCanvas");
var newImg = document.getElementById("outimg")
var imgSrc = c.toDataURL('image/png'); //获取图片的DataURL
newImg.src = imgSrc; //将图片路径赋值给src
console.log('导出图片')
}
CanvasDemo.downLoad = function(canvas,name) {
document.getElementById('downloadPic').addEventListener('click', function() {
downloadCanvas(this, 'myCanvas', 'test.png');//下载myCanvas中的图像,命名为‘test.png’
}, false);
}
function downloadCanvas(link, canvasId, filename) {
link.href = document.getElementById(canvasId).toDataURL();
link.download = filename;
console.log('下载图片');
}[/pre]
依然先在浏览器上运行,canvas的操作在引用 ‘.toDataURL()’ 时,表现出了跨域问题……即无法引用canvas画布中的内容,无法导出、下载等……笔者无法解决这个问题
mv上canvas操作
以上是在mv上操作canvas的gif
所以又在mv上,结果mv上可以导出画布中的图像内容到div元素中。在下载画布内容保存为图片时虽没有报错,但却没有任何反应。
到底是mv并没有重内存中下载画布的内容呢,还是下载了没有通知?
|
|