`
chairmanMao
  • 浏览: 16898 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

canvas绘图引起的闭包问题

 
阅读更多
在stackflow上有一个关于js闭包的问题,可以通过该链接查看:http://stackoverflow.com/questions/7880168/not-showing-images-in-a-html5-canvas-javascript
可是我在试验提问者提问的问题时,发现结果和提问者描述的不一样
提问者原代码:
for (var i=1;i<9;i++){
    for (var j=1;j<9;j++){
        var img=new Image();
        img.onload=function(){
                ctx.drawImage(img,p+sqs*(i-1)+(sqs-32)/2,p+bds-sqs*j+(sqs-32)/2,32,32);
        };
        img.src="img/"+squares[i][j]+".png";
        //alert(img.src);
    }
}

依提问者描述,他加上那个alert语句后就可以正常显示图片,可是我测试的时候,加上alert语句后依然没有显示图片
PS:因为作者代码不全,所以在测试的时候,我将ctx.drawImage(img,p+sqs*(i-1)+(sqs-32)/2,p+bds-sqs*j+(sqs-32)/2,32,32);修改为ctx.drawImage(img,i*5,j*5);
另:ITeye的论坛规则真变态啊
补充我的测试结果:
  使用chrome浏览器,发现进入循环后,首先执行img.src的赋值语句,执行8*8后,进入img.onload函数,图片展示不全
  加上那条alert语句后,结果同上,没有出现原提问者所说的图片可以展示的情况
分享到:
评论
2 楼 chairmanMao 2012-06-13  
simplemx 写道
感觉加和不加不会有影响,这个是闭包的问题。
img.onload=(function(i){
return function(){  
                ctx.drawImage(img,p+sqs*(i-1)+(sqs-32)/2,p+bds-sqs*j+(sqs-32)/2,32,32);  
        };
})(i);

确实是闭包问题,我google过,是比较曲型的问题:在闭包中使用循环,可是依提问者说只要加个一个alert,就可以正常工作,我加了没反应啊
1 楼 simplemx 2012-06-12  
感觉加和不加不会有影响,这个是闭包的问题。
img.onload=(function(i){
return function(){  
                ctx.drawImage(img,p+sqs*(i-1)+(sqs-32)/2,p+bds-sqs*j+(sqs-32)/2,32,32);  
        };
})(i);

相关推荐

    Canvas 小游戏 消灭方块

    通过JavaScript的`canvas.getContext('2d')`方法,我们可以获取到2D渲染上下文,从而调用一系列的绘图方法,如`fillRect()`、`strokeRect()`、`clearRect()`等,来绘制矩形、线条和其他形状。 在这个“消灭方块”...

    canvas相框+字体样式.zip

    9. **JavaScript编程**: 项目中的JavaScript代码负责处理canvas的绘图逻辑、事件响应和用户交互。可能使用了闭包、变量作用域、函数调用来实现复杂的功能。 10. **样式设计**: CSS用于定义界面的视觉样式,包括相框...

    H5 Canvas粒子爆炸动画特效.zip

    虽然大多数现代浏览器都已经支持Canvas API,但在开发时仍需考虑老版本浏览器的兼容性问题,可能需要引入polyfill库或采用渐进增强策略。 总之,"H5 Canvas粒子爆炸动画特效"展示了HTML5 Canvas的潜力,通过...

    HTML5 Canvas酷炫分形星系动画特效

    JavaScript文件则是整个特效的灵魂,它包含了处理Canvas绘图、计算星系动态行为、以及响应鼠标事件的逻辑。开发者可能使用了闭包、定时器(如`setInterval()`或`requestAnimationFrame()`)来实现动画的流畅更新,...

    HTML5 Canvas绘制沙丁鱼群特效.zip

    9. **性能优化**:由于Canvas绘图涉及到大量的计算,因此性能优化很重要。可以使用批处理技术减少渲染次数,或者只重绘需要改变的部分,避免不必要的计算。 通过学习这个项目,开发者可以深入理解HTML5 Canvas的...

    html5 canvas碎片3D环绕地球天体运动动画特效.zip

    1. **HTML5 Canvas API**:Canvas是一个基于矢量图形的HTML元素,通过JavaScript来控制其绘图行为。开发者可以通过API提供的方法如`fillRect()`, `strokeRect()`, `beginPath()`, `arc()`, `moveTo()`, `lineTo()`等...

    HTML5 Canvas核心技术 图形、动画与游戏开发.zip

    总的来说,"HTML5 Canvas核心技术 图形、动画与游戏开发.zip"包含的内容将帮助开发者掌握Canvas的各个方面,从基础的绘图操作到高级的游戏开发技巧,涵盖了一整套完整的知识体系。通过深入学习这本书,开发者不仅...

    HTML5 Canvas火焰光标跟随动画特效源码.zip

    HTML5 Canvas是Web开发中...通过学习和分析这个源码,开发者可以了解Canvas的基本绘图方法,以及如何结合JavaScript实现复杂的动画效果。这将有助于提升Web开发者的技能,使他们能够创造出更多吸引人的交互式网页元素。

    HTML5 Canvas圆形旋转加载动画特效

    HTML5 Canvas是一个二维绘图上下文,通过JavaScript语言控制。它由一个`&lt;canvas&gt;`元素和与其关联的JavaScript API组成。开发者可以使用这个API在画布上绘制线条、形状、图像等,甚至实现复杂的动画效果。 在描述中...

    html5基于canvas实现的打碎图片玻璃碎片特效源码.zip

    在JavaScript中,我们可以获取到Canvas的2D渲染上下文,通过`context = canvas.getContext('2d')`,然后调用这个上下文对象的方法来进行绘图,如绘制线条、填充形状、绘制图像等。 接下来,要实现玻璃碎片特效,...

    3D无限圆柱体Canvas特效

    综上所述,3D无限圆柱体Canvas特效是一个集JavaScript编程、Canvas绘图和3D变换于一体的创新技术,它展示了HTML5和JavaScript在现代网页设计中的强大能力。学习并掌握这种特效的实现,不仅可以提升你的前端开发技能...

    Canvas连接粒子分解动画特效.zip

    Canvas是一个二维的图形上下文,通过JavaScript的API可以对其进行绘图操作,包括画线、填充形状、绘制图像等。例如,`ctx.beginPath()`用于开始一个新的路径,`ctx.fillStyle = 'color'`设置填充颜色,`ctx.fillRect...

    Android应用源码之三国杀版连连看(使用html5的canvas特性,纯javascript开发).rar

    首先,Canvas是HTML5的一个核心元素,它提供了一个二维绘图环境,允许开发者通过JavaScript进行图形绘制。在这款连连看游戏中,Canvas被用于绘制游戏棋盘、棋子以及各种动画效果,如消除匹配对的棋子。开发者利用...

    Canvas雷雨闪电动画特效

    Canvas是一个矩形区域,通过JavaScript API来控制其上的绘图操作。开发者可以调用Canvas的draw方法,比如`fillRect()`、`strokeRect()`等,来绘制各种形状;也可以使用`beginPath()`、`moveTo()`、`lineTo()`等方法...

    色彩条纹旋涡Canvas特效

    然后,我们就可以使用各种绘图方法,如`fillRect`, `strokeRect`, `beginPath`, `moveTo`, `lineTo`, `arc`等来绘制图形。 在“色彩条纹旋涡”特效中,关键在于三角形的绘制。我们可以使用Canvas的`moveTo`和`line...

    Javascript实现疯狂坦克大战网页版游戏源代码.rar

    总的来说,【疯狂坦克大战网页版游戏源代码】涵盖了JavaScript基础语法、HTML5 Canvas绘图、事件处理、游戏逻辑设计、性能优化等多个方面的知识点。通过学习这个项目的源代码,开发者不仅可以深入理解JavaScript在...

    HTML5 Canvas发光微生物动画特效

    HTML5 Canvas技术是现代网页开发中的一个重要组成部分,它允许开发者在网页上进行动态图形绘制,提供了丰富...通过研究这个项目,你可以深入理解Canvas绘图原理,学习如何实现动态效果,并掌握更多JavaScript编程技巧。

    JavaScript+html5 canvas绘制的小人效果

    `cache`对象用于在不同的函数间共享变量,例如在`cache.context`中存储canvas绘图上下文。同时,代码中通过`save`和`restore`方法来管理绘图上下文的状态,这样可以在绘制图形后撤销状态或者恢复到某个特定状态。 6...

    植物大战僵尸htm5源码

    三、Canvas绘图 HTML5的Canvas元素提供了动态图形绘制的能力,"植物大战僵尸"中的所有视觉元素,如背景、植物、僵尸,都是通过Canvas API进行绘制的。开发者可以控制每一帧的画布内容,实现流畅的动画效果。 1. ...

    微信HTML5在线朋友圈游戏源码带安装部署教程-英雄难过美人关.zip

    3. Canvas绘图:游戏中的视觉效果通常由Canvas元素实现,通过JavaScript操作Canvas的绘图API,可以创建动态图形、动画和游戏场景。开发者需要理解如何绘制图像、线条、形状,以及如何进行帧动画。 4. JavaScript...

Global site tag (gtag.js) - Google Analytics