zoukankan      html  css  js  c++  java
  • 关于事件委托和时间冒泡(以及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方法,完美解决。

  • 相关阅读:
    新闻资讯APP开发流程(一)需求分析
    药品查询APP开发流程(九)开发—yao_company.js
    药品查询APP开发流程(十一)开发—company_specs.js
    开发demo药品查询
    药品查询APP开发流程(十)开发—company.js
    药品查询APP开发流程(八)开发—yao_specs.js
    开发demo新闻资讯
    新闻资讯APP开发流程(三) app.js
    新闻资讯APP开发流程(二) APP模型设计
    药品查询APP开发流程(七)开发—yao.js
  • 原文地址:https://www.cnblogs.com/yunzhexiaye/p/6362212.html
Copyright © 2011-2022 走看看