• 关于事件委托和时间冒泡(以及apply和call的事项)


    搜索事件委托和事件冒泡,网上一大堆乱七八糟的解释,当然意思都对,没毛病。

    but,真的无聊。

    事件冒泡:事件会从点击的元素开始依次向上流出,直到html,遇见事件监听则执行。

    事件委托:原因——父元素下有若干不定子元素需要添加相同监听事件。处理方法——利用事件冒泡性质给父元素加监听事件,再用e.target获取被点击的子元素,即事件源。

    然后说到事件委托就要谈到apply和call方法了。

    apply方法,网上也有一大把解释,老样子,我还是喜欢简单点的。

    1.所谓apply就是改变当前对象的this,从而达到类继承的效果。

    2.js函数存在【定义时上下文】、【运行时上下文】和【上下文可以改变】的概念,所以产生了很多诡异的事情,以上即是其一。

    3.上下文即this。

    以下得自知乎大神回答,我理解后注于此,感谢。

    首先,js中一切皆对象。而对象的方法千千万,如果一个对象存在另一个对象不存在的方法或者属性,就可以通过apply或者call方法继承过去。

    例如,通过var nodes = document.getElementsByTagName方式获取到的nodes是类array的array,即类数组。我们就可以通过

    Array.prototype.push.apply(nodes)这样的方式让nodes可以使用array的push方法。

    apply和call的作用完全相同,只是接收参数不同:

    apply(this, arg1,agr2……);

    call(this,[arg1,arg2……]);

    下面是一个例子:

    function Man() {}
    Man.prototype = {
        valet: false,
        wakeUp: function(event) {
            console.log(this.valet + "? Some breakfase, please.");
        }
    };
    
    //get "undefined? Some breakfast, please
    var button = document.getElementById('morning');
    button.addEventListener(
        "click",
        wooster.wakeUp,
        false
    );
    
    //使用apply来改变 wakeUp 的上下文环境,即 wakeUp 中的this
    var button = document.getElementById('morning2');
    button.addEventListener(
        "click",
        function() {
            Man.prototype.wakeUp.apply(wooster, arguments);
        },
        false
    );

     其实.apply和.call不过是function的两个特殊的methods而已。作用是改变函数的执行环境——即上下文——即this,来看个直观点的例子。

    function changeStyle(attr, value){
        this.style[attr] = value;
    }
    var box = document.getElementById('box');
    window.changeStyle.call(box, "height", "200px");

    我们在window下定义了个函数changeStyle,然后获取到box。box是个node,本身不存在changeStyle方法,我们通过.call来使用window下的changeStyle方法,完美解决。

  • 相关阅读:
    luogu P3804 【模板】后缀自动机 (SAM)
    莫队
    luogu P4688 [Ynoi2016]掉进兔子洞
    FZOJ 2331 LYK loves graph
    字典树
    luogu P6623 [省选联考 2020 A 卷] 树
    luogu P6018 [Ynoi2010]Fusion tree
    luogu P3264 [JLOI2015]管道连接
    最小斯坦纳树
    9. 回文数
  • 原文地址:https://www.cnblogs.com/yunzhexiaye/p/6362212.html
Copyright © 2020-2023  润新知