繁体   English   中英

jQuery ONE函数PURE JS

[英]Jquery ONE function PURE js

那里! 我在创建oneJQUERY一样的函数时遇到问题。

这是动作: https : //jsfiddle.net/77yzLt6v/

一次执行事件

HTML:

<div id="justOnce">click me!</div>

function one(dom, event, callback) {
    dom.addEventListener(event, function(e) { // add event
        this.removeEventListener(event, callback); // remove it
    }); 

}    
one(document.getElementById("justOnce"), "click", function() {

    alert("this alert only show once time");

});

我的代码有什么问题?

提前致谢...

您的代码绑定了一个事件处理程序,该事件处理程序将callback删除为事件处理程序。

唯一的问题是……首先,您永远不会将callback绑定为事件处理程序。

您想要更多类似这样的东西:

function one(dom, event, callback) {
    function handler(e) {
        callback.call(this, e);
        this.removeEventListener(event, handler);
    }
    dom.addEventListener(event, handler); 
}    

  • 您需要调用callback
  • 您需要删除实际绑定的事件处理程序

新标准支持此功能,但尚不能在任何浏览器中使用( caniuse.com

window.addEventListener('resize', console.log, {once: true})

polyfill:

;(function(){
    let p = document.createElement('p')
    let count = 0
    let event = new CustomEvent('x')

    p.addEventListener('x', () => {i++})
    p.dispatchEvent(event)
    p.dispatchEvent(event)

    if (i != 2) return

    for (let obj of [Window, Element]) {
        let orig = obj.prototype.addEventListener
        function addEventListener(type, callback, opts) {
            let args = Array.from(arguments)
            if(opts && opts.once) {
                function handler(e) {
                    callback.call(this, e)
                    this.removeEventListener(type, handler)
                }
                args[1] = handler
            }
            orig.apply(this, args)
        }

        obj.prototype.addEventListener = addEventListener
    }
}())

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM