繁体   English   中英

如何删除YUI委托事件?

[英]How do I remove YUI delegated events?

我正在尝试为允许用户注入javascript的平台创建脚本。 他们使用的是YUI,特别是Y.one('body).delegate('click',...)将事件附加到按钮。 我想拦截此按钮,但无法弄清楚如何停止,阻止,删除或以其他方式阻止事件处理程序触发。

注意:我没有直接访问`Y.delegate()返回的处理程序的权限

到目前为止,我已经尝试过

Y.detachAll('click');
Y.unsubscribeAll('click');
Y.one('body').detachAll('click');
Y.one('body').unsubscribeAll('click');
Y.one('.the-delegated-class').detachAll('click');
Y.one('.the-delegated-class').unsubscribeAll('click');

一切都无济于事。 实际上,我唯一的成功就是完全删除并替换了HTML正文,显然它带走了所有事件处理程序,而不仅仅是我想要删除的HTML。

有什么见解吗?

原来我的尝试之一是正确的方法,但是我的用法是错误的。 我(在不知不觉中)试图在首先附加事件之前分离事件。

就是这样: Y.one('body).delegate('click',...)

这有效: Y.one('body').detach('click')

尽管理想情况下,您将直接在委托调用返回的EventHandle上调用detach。

委托Event方法似乎未将句柄存储在任何地方,您可能会为Event.delegate创建补丁替换,以存储代表委托元素的句柄。 修补YUI的基本示例: https : //gist.github.com/tivac/1424351

未经测试的代码:

var config = {
    groups : {
        patches : {
            base : "/js/patches/",
            modules : {
                "node-event-delegate-patches" : {
                    path : "node-event-delegate.js",
                    condition : {
                        name : "node-event-delegate-patches",
                        trigger : "node-event-delegate",
                        test : function() { return true; }
                    }
                }
            }
        }
    }
};

YUI.add("node-event-delegate-patches", function(Y) {
    var L = Y.Lang;

    Y.Node.prototype.delegate = function(type) {
        var args = Y.Array(arguments, 0, true),
            handle,
            index = (L.isObject(type) && !L.isArray(type)) ? 1 : 2;
        args.splice(index, 0, this._node);

        if (!L.isArray(this._node._delegate_event_handles)){
            this._node._delegate_event_handles = [];
        }
        handle = Y.delegate.apply(Y, args);
        this._node._delegate_event_handles.push( handle );
        return handle;
    };

    Y.Node.prototype.detachDelegates = function(){
        Y.Array.each(this._node._delegate_event_handles, function(handle){
            handle.detach();
        });
    }
});

暂无
暂无

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

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