dom事件——下面两个JavaScript语句中发生了什么
dom events - What is happening in the below two JavaScript statements?
imgMonsterRun.onload = handleImageLoad;
imgMonsterRUn.onerror = handleImageError;
handleImageLoad
和handleImageError
是什么?
它们是变量、方法还是对象?
如果它们是对象,当调用该对象时,该对象的哪个方法将运行?
一些背景
imgMonsterRun
是(我们假设)一个图像对象。在某些时候,它指定了一个src
,它指向要从哪里加载图像。当您指定src
时,浏览器开始加载图像,但允许您继续执行程序的其余部分。
然而,有些程序可能希望在加载完图像后执行某些操作,或者在加载图像时出现错误。
要做到这一点,您可以使用事件处理程序。"事件"描述发生的事情,例如正在加载图像或发生错误。事件处理程序是一个函数,当事件触发 ("happens")时被调用。代码将事件处理程序附加到图像(以
imgMonsterRun
为例)的load
事件的一种方法是使用:
imgMonsterRun.onload = handleImageLoad;
handleImageLoad
应该是一个函数。例如,您可以定义:
function handleImageLoad() {
console.log("Image loaded!");
}
当onload
事件触发时(大概是当图像imgMonsterRun
加载完成时),将记录"图像加载!"
更详细
在JavaScript中,函数是一等对象。这意味着它们可以像"普通"对象一样传递和处理。
所以,当你把handleImageLoad
赋值给imgMonsterRun.onload
时,imgMonsterRun.onload()
就等于handleImageLoad()
了。
试一试!
为了更好地理解这个概念,可以尝试这样做:
function foo() {
alert("Hi! I'm foo.");
}
var bar = foo; // The "reference" to the `foo` function is now assigned to `bar`.
// `bar` is now a function, too.
bar(); // This will alert "Hi! I'm foo."
它们是什么
它们是函数。它们被称为处理程序,因为它们处理特定的事件,如load
或change
。请注意,有些浏览器使用onload
或onchange
而不是更简单的表单。
它们的特殊之处
根据定义,事件处理程序是异步的。换句话说,它们可能"随时发生"。例如,如果图像加载速度很快,则几乎立即调用load
事件处理程序。或者,如果有网络错误,load
事件可能永远不会发生。
而且,这是非常重要的,事件处理程序将接收一个event
对象作为它们的第一个参数。这个对象有很多关于事件的有价值的信息。我已经更新了小提琴,所以你可以看到它。
它们的作用
我们通常不希望某件事在其他动作发生之前发生。例如,我们不希望将图像的位图复制到画布中,直到它被加载,或者直到点击链接之后才显示图像。
为什么这个例子是错误的
一般不推荐使用这种形式。经验丰富的JavaScript开发人员通常更喜欢为这些事件附加侦听器,而不是分配单个处理程序。这提供了更大的灵活性,并防止'load', 'click', 'change'或其他处理程序在代码的其他地方被意外地破坏(例如替换)。
试一试!
下面是一个演示如何执行此操作的示例:http://jsfiddle.net/2em7T/14/
下面是如何将多个处理程序附加到事件这是来自小提琴的代码:
// BEGIN x-browser utility /addListener/
// Supports IE8 with alternate function name
//
var addListener = (function () {
var add_fn_str, prefix_str, add_listener;
add_listener = function ( dom_el, event_type, func ) {
if ( ! add_fn_str ) {
if ( dom_el.addEventListener ) {
prefix_str = '';
add_fn_str = 'addEventListener';
}
else if ( dom_el.attachEvent ) {
prefix_str = 'on';
add_fn_str = 'attachEvent';
}
else {
console.warn( '_error_', '_no_means_to_add_listeners_' );
return false;
}
}
dom_el[ add_fn_str ]( prefix_str + event_type, func );
return true;
};
return add_listener;
}());
// END x-browser utility /addListener/
var imgMonsterRun = new Image();
var handleImageLoad = function ( event) {
console.log( 'foo', event );
};
var handleImageLoad2 = function ( event ) {
document.body.appendChild( imgMonsterRun );
console.log( event );
};
addListener( imgMonsterRun, 'load', handleImageLoad );
addListener( imgMonsterRun, 'load', handleImageLoad2 );
imgMonsterRun.src = 'http://www.tmlcustomgifts.com/1TML_Logo_2_12.jpg';
工作原理
一旦ImgMonsterRun图像元素源被加载,'foo'被一个处理程序记录到控制台,第二个处理程序将图像附加到主体。请注意,您可以使用这种方法在图像负载中添加任意数量的侦听器,这非常方便。
总结所以这就是你:一个解释,以及首选的实现方法:)
- 为复选框javascript指定两个值
- 我可以'我似乎不知道如何修复javascript中的两个lint.有人能帮我理解吗
- 组合两个javascript函数
- Javascript两个日期选择器冲突
- JavaScript:两个相同的函数,一个不起作用
- JavaScript两个对象-互相覆盖
- Javascript:两个元素之间的垂直间距
- 如何合并javascript两个对象,但只更新更改的属性
- HighChart JavaSCript两个样条在同一图形中更新
- Javascript两个奇怪的问题:POST不工作,window.location.href不工作
- Javascript:两个if类型的未定义语句给出不同的结果
- Javascript - 两个参数和返回对象
- Javascript:两个Div ID's中的元素
- 从TypeScript到Javascript.两个文件在同一位置
- Javascript两个日期时间比较问题
- javascript两个按钮使用单个函数互相更改
- Javascript-两个日期之间的差异
- javascript:两个 AJAX 调用
- Javascript两个函数调用时为空文本,然后在执行时停止
- Javascript两个窗口.点击功能冲突