javascript的onload回调问题

正在学习javascript,看到一段代码varimg=newImage();img.onload=function(){ctx.drawImage(img,100,10... 正在学习javascript,看到一段代码
var img=new Image();
img.onload=function(){
ctx.drawImage(img,100,100);}
img.src='images/sprites.png';
书上有一段解释“在试图把图像绘制到上下文中之前,代码会先等待onload回调,然后在设置回调之后设置src。这一顺序非常重要,因为若掉转了这两行代码的顺序,图像就会被缓存”
1、没明白为什么要这么做?既然用了 new Image()不就是为了缓存图像的吗?
2、src放在后面了,为什么执行drawImage()的时候没有报错,而图像能正常显示出来?
3、img.onload回调到底是什么意思?和一些JS书中提到的回调函数是什么关系?
请高手不吝赐教!
展开
 我来答
网海1书生
科技发烧友

2019-03-18 · 擅长软件设计、WEB应用开发、小程序
网海1书生
采纳数:12311 获赞数:26228

向TA提问 私信TA
展开全部
1、 new Image()只是建立一个Image对象,在给src属性赋值之前,图像并没有加载到内存,所以是不会缓存图像的。
2、drawImage()是放在img的onload事件中执行的,也就是说它不是立即执行的,而是等待img的onload事件发生后(也就是img中的图像被加载到内存后)才执行的。这就好比埋地雷,埋完地雷后地雷是不会立刻爆炸的,埋地雷的人可以紧接着去做其他事(比如去其他地方继续埋雷),只有达到触发条件(比如敌人踩上去了)地雷才会爆炸。表面上埋地雷的动作是发生在前面的,但实际的运行结果(爆炸)却是发生在后面的。程序里也一样,表面上drawImage()是放在给src赋值之前,但它实际上是在src赋值之后才运行的。
3、img.onload严格来讲并不叫回调,而是一个事件过程,就是说当这个事件(onload)发生了,它里面的代码才会执行,而如果事件没发生,那么代码是不会主动运行的。事件过程是面向对象编程的一个主要的逻辑结构,比如说鼠标点击(onclick)就是一个很常用的事件,点了鼠标就执行某个操作,而不点鼠标的时候,代码即使放在那里它也不敢擅自运行的。
陪我_要饭
2019-03-18 · TA获得超过122个赞
知道答主
回答量:60
采纳率:54%
帮助的人:9.1万
展开全部
XMLHttpRequest 对象的 onload 回调函数是在异步请求加载完成后所执行的函数,JavaScript 监测到请求的数据全部传输完成后就会触发该函数。而 open() 函数设置异步请求的 method、URL 和同步方式等参数,执行 open() 后再执行 send() 函数才开始向服务器发送请求。另外,onload 回调函数实际上是 XHR2 中新加入的功能,部分浏览器可能不支持这个函数名。要避免不兼容的现象,可以使用传统XMLHttpRequest,如:
//省略其他代码
request.onreadystatechange=function() // 状态改变回调函数
{
  // 判断 request.readyState==4 的效果等同于 onload 
  if(request.readyState==4 && request.status==200)
  {
    // 加载且响应正常完成后执行的代码.... 
  }
}
request.open("GET",url,true); // 打开对象,也可以说是设置参数
request.send(); // 发送请求
还有一些误解需要澄清一下,window.onload 回调函数其实是在页面加载完成后(包括图片内容的显示)才会执行,并不是页面加载的等待过程中就执行。request.open() 并没有发送请求,只是设置一些参数,在 send() 时才会发送(注意不要漏写这条语句),发送后就会进入 readyState 监听状态,当 readyState 的值有改变就会执行 onreadystatechange 回调函数,当异请求的步数据接收完成(即 readyState 变为 4)后就会执行 onload 回调函数(注意仅在 XHR2 中有效)。希望可以帮到你!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
投手666
2019-03-19 · TA获得超过108个赞
知道答主
回答量:362
采纳率:44%
帮助的人:11.9万
展开全部
XMLHttpRequest 对象的 onload 回调函数是在异步请求加载完成后所执行的函数,JavaScript 监测到请求的数据全部传输完成后就会触发该函数。而 open() 函数设置异步请求的 method、URL 和同步方式等参数,执行 open() 后再执行 send() 函数才开始向服务器发送请求。另外,onload 回调函数实际上是 XHR2 中新加入的功能,部分浏览器可能不支持这个函数名。要避免不兼容的现象,可以使用传统XMLHttpRequest
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
哈哈聊聊哈

2019-03-18 · TA获得超过4222个赞
知道答主
回答量:1.6万
采纳率:22%
帮助的人:978万
展开全部
下次vvvv
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
让晚风吹送落霞wq
2019-03-18 · 贡献了超过532个回答
知道答主
回答量:532
采纳率:4%
帮助的人:38.3万
展开全部
XMLHttpRequest 对象的 onload 回调函数是在异步请求加载完成后所执行的函数,JavaScript 监测到请求的数据全部传输完成后就会触发该函数。而 open() 函数设置异步请求的 method、URL 和同步方式等参数,执行 open() 后再执行 send() 函数才开始向服务器发送请求。另外,onload 回调函数实际上是 XHR2 中新加入的功能,部分浏览器可能不支持这个函数名。要避免不兼容的现象,可以使用传统XMLHttpRequest,如:

//省略其他代码

request.onreadystatechange=function() // 状态改变回调函数
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式