如何删除YUI委派的事件?

时间:2014-05-25 18:19:07

标签: javascript yui

我试图为允许用户注入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,而不是我想删除的那个。

任何见解?

2 个答案:

答案 0 :(得分:1)

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

在以下情况中说: Y.one('body).delegate('click',...)

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

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

答案 1 :(得分:0)

委托事件方法似乎不会将句柄存储在任何位置,您可能会为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();
        });
    }
});