JavaScript权威指南读书笔记——第十七章 事件处理

注册事件处理程序

设置JavaScript对象属性为事件处理程序

window.onload=funciton(){
    //code
}

设置HTML标签属性为事件处理程序

<button onclick="alert('hello');"></button>

当指定一串JavaScript代码作为HTML事件处理程序属性时,浏览器会把代码串转换为类似如下的函数中:

funciton(event){
    with(document){
        with(this.form || {}){
            with(this){
                code...
            }
        }
    }
}

addEventListener()

参数一:要注册处理程序的时间类型(不需要前面加on)
参数二:当指定类型的事件发生时应该调用的函数。
参数三:该参数是一个布尔值,一般情况下,会给这个参数传递false。如果true,那么函数注册为捕获事件处理程序。

document.getElementById("id").addEventListener("click", handMouseMove,false);

removeEventListener()

它同样有三个参数,从对象中删除事件处理程序函数而非添加,它常用于临时注册事件处理程序。

document.getElementById("id").removeEventListener("click", handMouseMove,false);

attachEvent()

如果IE不支持addEventListener()和removeEventListener(),那么就是用attachEvent()和detachEvent()。

这两种操作的区别:

  • 因为IE不支持事件捕获,所有这两个方法只有两个参数。
  • 这两个方法的第一个参数是用带“on”前缀的时间。
  • atttachEvent允许相同的事件处理程序注册多次。
var b = document.getElementById("myButton");
var handler = function(){code...};
if (b.addEventListener){
    b.addEventListener("click",handler,false);
    b.removeEventListner("click",handler,false);
}
else{
    b.attachEvent("onclick",handler);
    b.detachEvent("onclick",handler);
}

事件处理程序的调用

时间处理程序的参数

通常调用事件处理程序时把事件对象作为它们的第一个参数。

在IE中,当调用它们事件处理函数时并未传递事件对象。取而代之,通过全局对象window.event来获取事件对象。

function(event){
    event = event || window.event;
}

事件处理程序的运行环境

当使用addEventListener()注册时,调用的处理程序使用事件目标作为他们的this值。但是,对于attachEvent()来讲这是不对的。

function addEvent(target, type, handler){
    if (target.addEventListner)
        target.addEventListner(type,handler,false);
    else
        target.attachEvent("on"+type,function(event){
            handler.call(target,event);
        });
}

事件处理程序的返回值

通常情况下,返回值false就是告诉浏览器不要执行这个事件相关的默认操作。

使用addEventListener()或attachEvent()注册事件处理程序转而必须调用preventDefault()方法或设置事件对象的returnValue属性。

调用顺序

  • 通过设置对象属性或HTML的处理程序优先调用
  • 使用addEventListener()注册处理程序按照它们的注册顺序调用
  • 使用attachEvent()注册的处理程序可能按照任何顺序调用

事件传播

大部分事件会“冒泡”到DOM树根。调用目标的父元素的事件处理程序,然后调用在目标的祖父元素上注册的事件处理程序。这会一直到Document对象,最后到达Window对象。

事件冒泡是事件传播的第三个“阶段”。目标对象本身的事件处理程序调用是第二个阶段。第一个阶段甚至发生在目标出现程序调用之前,称为“捕获”阶段。

事件取消

用属性注册的事件处理程序的返回值能用于取消事件的浏览器默认操作。在支持addEventListener()浏览器中,也能通过preventDefault()方法取消事件的默认操作。在IE9之前的IE中,可以通过设置事件对象的returnValue属性为false来达到同样的效果。

function cancelHandler(event){
    var event = event || window.event;
    if (event.preventDefault)
        event.preventDefault();
    if (event.returnValue
        event.returnValue = false;
    return false;
}

在支持addEventListener()的浏览器中,可以调用事件对象的stopProgation()方法以阻止事件的传播。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下为B站黑马JavaScript的Ajax案例代码——图书管理案例搜索事件: ```javascript /** * 搜索事件 */ function searchBook() { // 获取搜索框内容 var searchInput = document.querySelector("#searchInput"); var keywords = searchInput.value.trim(); // 如果搜索框内容为空,提示用户 if (keywords == "") { alert("请输入关键字进行搜索!"); return; } // 发送Ajax请求 var xhr = new XMLHttpRequest(); // 创建XmlHttpRequest对象 xhr.open("GET", "/api/book/search?keywords=" + keywords, true); // 配置请求 xhr.onreadystatechange = function () { if (xhr.readyState == 4 && xhr.status == 200) { // 处理响应数据 var books = JSON.parse(xhr.responseText); // 将响应数据转成JavaScript对象 renderBooks(books); // 渲染图书列表 } }; xhr.send(null); // 发送请求 } /** * 渲染图书列表 * @param {*} books 图书列表数据 */ function renderBooks(books) { // 获取图书列表容器 var bookList = document.querySelector("#bookList"); var html = ""; if (books.length > 0) { // 遍历图书列表数据,生成HTML字符串 for (var i = 0; i < books.length; i++) { html += '<tr>'; html += '<td>' + books[i].title + '</td>'; html += '<td>' + books[i].author + '</td>'; html += '<td>' + books[i].category + '</td>'; html += '<td>' + books[i].price + '</td>'; html += '<td>' + books[i].publisher + '</td>'; html += '</tr>'; } } else { // 如果没有搜索到任何图书,提示用户 html = '<tr><td colspan="5">没有搜索到任何图书!</td></tr>'; } // 将生成的HTML字符串添加进图书列表容器 bookList.innerHTML = html; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值