js教程(9)

一、事件委托

        事件委托是利用事件流的特征解决一些开发需求的知识技巧。

1.优点

        减少注册次数,可以提高程序性能。

2.原理

        事件委托其实就是利用事件冒泡的特点,给父元素注册事件,当我们触发子元素的时候,会冒泡到父元素身上,从而触发父元素的事件。

3.实现语法

事件对象.target.tagName

        通过上段代码获取真正触发事件的元素,用this对其属性进行操作。

示例:

    const input = document.querySelector("#four input");
    const table = document.querySelector("table");
    let evalstr = "";
    table.addEventListener("click", function(e){
        if (e.target.tagName === "TD") {
            if (e.target.innerText == "c") {
                evalstr = "";
            } else if (e.target.innerText == "=") {
                if (evalstr.length > 0 && Object.is(Number(evalstr.charAt(evalstr.length - 1)), NaN)) {
                    console.log(evalstr.charAt(evalstr.length - 1));
                    alert("请不要进行错误输入");
                    evalstr = "";
                } else {
                    evalstr = new String(eval(evalstr));
                }
            } else if ((evalstr.length == 0 || evalstr.length == 1) && (e.target.innerText == "+" || e.target.innerText == "*" || e.target.innerText == "/") && Object.is(Number(evalstr.charAt(0), NaN))) {

            } else if ((evalstr.length == 0 && Object.is(Number(e.target.innerText), NaN)) || (evalstr.length != 0 && Object.is(Number(evalstr.charAt(evalstr.length - 1)), NaN) && Object.is(Number(e.target.innerText), NaN))) {
                evalstr = evalstr.substring(0, evalstr.length - 1) + e.target.innerText;
            } else {
                evalstr += e.target.innerText;
            }
            if (evalstr == "Infinity") {
                alert("请不要进行错误输入");
                evalstr = "";
            }
            input.value = evalstr;
        }
    });

 这是计算机代码用事件委托优化后的写法。

二、其他事件

1.页面加载事件

      加载外部资源(如图片、外联CSS和JavaScript等)加载完毕时触发的事件。

      有时候需要等页面资源全部处理完了做一些事情,如果把代码写在head中,这个时候直接找dom元素会找不到。

事件名:load

举例:给window添加load事件

//页面加载事件
window.addEventListener('load',function(){
    //执行的操作
});

        注意不光可以监听整个页面资源加载完毕,也可以针对某个资源绑定load事件。

特殊用法

        当初始的HTML文档被完全加载和解析完成之后,DOMContentLoaded事件被触发,而无需等待样式表,图像等完全加载。

事件名:DOMContentLoaded

给Document添加DOMContentLoaded事件

document.addEventListener('DOMContentLoaded',function(){
    //执行的操作
});

2.页面滚动事件

        滚动条在滚动的时候持续触发的事件。很多网页需要检查用户把页面滚动到某个区域后做一些处理,比如固定导航栏,比如返回顶部。

事件名:scroll

        监听某个元素的内部滚动直接给某个元素加即可,如监听整个页面滚动,代码如下:

window.addEventListener('srcoll',function(){
    //执行的操作
});

获取页面位置

        scrollLeft和scrollTop属性可以获取被卷去的页面大小,即:获取元素内容往左、往上滚出去看不到的距离,在开发中,我们尽量在scroll事件里面获取被卷去的距离。

代码举例

div.addEventListener('scroll',function(){
    console.log(this.scrollTop);
});

滚动到指定坐标

        scrollTo()方法可以把内容滚动到指定位置,其有两个参数,第一个时x坐标,一个是y坐标,它可以让页面滚动到(x,y)位置。

3.页面尺寸事件

        会在窗口尺寸改变的时候触发的事件

事件名:resize

        其还有两个配合使用的属性clientWidth和clientHeight(没有包含边框,外边距和滚动条),可以获取元素的可见部分宽高,代码示例:

window.addEventListener('resize',function(){
    console.log(document.documentElement.clientWidth);
    console.log(document.documentElement.clientHeight);
});

其他配合属性

      offsetWidth和offsetHeight,获取元素举例父级的举例的属性,该属性为只可读属性,一般在页面大小发生改变时读取子元素到父元素的距离,来动态改变布局以防布局混乱。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乔冠宇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值