2016-05-29 28 views
2

我正在寻找一种方法来实现以下功能。我可以建立一些机制来做到这一点,我正在寻求一些内置的或者非常简单的方法,如果它存在并且我错过了它。jQuery中的默认事件处理程序

编辑: 请注意,我正在讨论随机对象中的事件,而不是DOM元素。根据可能的副本中的建议,无法使用父级等来管理事件顺序。

编辑2: 也许所有的处理程序,被称为回调?还是一个总是最后执行的处理程序?

考虑:

var someObject={}; 
$(someObject).on("event",function() { console.log('Default handler'); }); 
... 
$(someObject).on("event",function() { console.log('Other handler'); }); 

做当:

$(someObject).triggerHandler("event"); 

输出是:

Default handler 
Other handler 

我们都知道这一点。问题是:如果我想将第一个事件设置为“默认”处理程序,如果没有其他事件处理程序(在那里没有问题)要执行,或者其他处理程序没有停止事件传播这是问题)。

我正在寻找一种方法能够像做:

$(someObject).on("event",function(ev) { ev.preventDefault(); }); 

,并防止第一事件处理程序的执行。在这个例子中没有给出执行顺序。反转执行顺序不是正确的方法。

TL; DR

是否可以设置一个默认的处理器,一个被称为万一有没有其他的处理程序和事件没有被取消?

编辑3:为了给你一个更好的主意,目前的做法是以下(名称是由这个例子):

var eventCanceled=false; 
function doTheEvent() { 
    $(someObject).triggerHandler("event"); 
    if(!eventCanceled) defaultEventHandler(); 
} 
//To be called inside the handlers to stop the default handler 
function cancelTheEvent() { 
    eventCanceled=true; 
} 

我只是想摆脱这一点,并能直接使用triggerHandler

+0

[优先级当多于一个的事件处理程序被绑定到一个元素(的可能的复制http://stackoverflow.com/questions/8779657/priority-when-more-than-一个事件处理程序是绑定到元素) –

+0

不完全是,请注意,我正在讨论随机对象,而不是DOM元素。 – Gabriel

+0

而不是有两个相同名称的事件名称“”事件“''”事件“'你有没有想过改成''默认值''和'”事件“' –

回答

0

虽然有a way to detect如果调用preventDefault(),则不存在“默认处理程序”这样的事情。事件处理程序按照它们注册的顺序执行。所以第一个注册的是第一个被执行的。

如果您的“默认处理程序”不需要同步执行,您可以延迟“默认处理程序”在所有其他处理程序完成后执行,并在任何其他处理程序恢复,如果有必要:

var defaultHandlerTimeout; 
$element.on('event', function() { 
    defaultHandlerTimeout = setTimeout(function() { 
    // your actual handler 
    }); 
}); 

$element.on('event', function() { 
    // prevent the "default handler" from being executed 
    clearTimeout(defaultHandlerTimeout); 
}); 
0

jQuery确实在内部存储了所有的事件,您可以使用$._data(elem,'events')访问特定的元素事件。

这是否会帮助您的情况我不知道,但值得深入挖掘。我个人从来没有发现需要使用它。

https://stackoverflow.com/a/2518441/1175966

1

希望这是你在找什么。这被称为观察者模式。

var someObj = {}; 
 
someObj.eventCallbackList = {}; 
 
someObj.createEventObject = function(name) { 
 
    return { 
 
    type: name, 
 
    preventDefault: function() { 
 
     this.callDefault = false; 
 
    }, 
 
    callDefault: true 
 
    } 
 
} 
 
someObj.on = function(eventName, callback, defaultFlag) { 
 
    if (!this.eventCallbackList[eventName]) { 
 
    // there can be multiple other handlers 
 
    this.eventCallbackList[eventName] = { 
 
     other: [], 
 
     default: null 
 
    }; 
 
    } 
 

 
    if (defaultFlag) { 
 
    this.eventCallbackList[eventName]['default'] = callback; 
 
    } else { 
 
    this.eventCallbackList[eventName]['other'].push(callback); 
 

 
    } 
 
} 
 

 
someObj.triggerHandler = function(eventName) { 
 
    var event = this.createEventObject(eventName); 
 
    var callbacks = this.eventCallbackList[eventName]; 
 

 
    if (callbacks) { 
 
    if (callbacks['other']) { 
 
     for (var i = 0; i < callbacks['other'].length; i++) { 
 
     callbacks['other'][i](event); 
 
     } 
 
    } 
 

 
    if (event.callDefault && callbacks['default']) { 
 
     callbacks['default'](event); 
 

 
    } 
 
    } 
 

 

 
} 
 

 

 

 

 
// Test 
 

 
someObj.on('myCustomEvent', function(event) { 
 
    console.log('OtherHandler'); 
 
    event.preventDefault(); 
 
}); 
 

 
someObj.on('myCustomEvent', function(event) { 
 
    console.log('default'); 
 
}, true); 
 

 
$(document).on('click', function() { 
 
    someObj.triggerHandler('myCustomEvent'); 
 
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

+0

虽然你没有使用jQuery的方法,但它是一个非常好的选择,谢谢。 – Gabriel

+0

这里没有办法使用jquery。 jquery不提供对象的事件处理。他们只是为了dom。 –

+0

jQuery的确提供对象的事件处理。但这不重要,我没有抱怨这只是一个评论,很好的工作,谢谢。 – Gabriel

相关问题