В сотрудничестве с Энди E это темная сторона силы:
var _old = jQuery.Event.prototype.stopPropagation;
jQuery.Event.prototype.stopPropagation = function() {
this.target.nodeName !== 'SPAN' && _old.apply( this, arguments );
};
Пример : http://jsfiddle.net/M4teA/2/
Помните, что если все события были связаны с помощью jQuery, вы можете обработать эти случаи только здесь.В этом примере мы просто называем оригинал .stopPropagation()
, если мы не имеем дело с <span>
.
Вы не можете предотвратить предотвращение, нет.
Что вы можете сделатьэто переписать эти обработчики событий вручную в коде.Это сложная задача, но если вы знаете, как получить доступ к хранимым методам обработчика, вы можете обойти это.Я немного поиграл с этим, и вот мой результат:
$( document.body ).click(function() {
alert('Hi I am bound to the body!');
});
$( '#bar' ).click(function(e) {
alert('I am the span and I do prevent propagation');
e.stopPropagation();
});
$( '#yay' ).click(function() {
$('span').each(function(i, elem) {
var events = jQuery._data(elem).events,
oldHandler = [ ],
$elem = $( elem );
if( 'click' in events ) {
[].forEach.call( events.click, function( click ) {
oldHandler.push( click.handler );
});
$elem.off( 'click' );
}
if( oldHandler.length ) {
oldHandler.forEach(function( handler ) {
$elem.bind( 'click', (function( h ) {
return function() {
h.apply( this, [{stopPropagation: $.noop}] );
};
}( handler )));
});
}
});
this.disabled = 1;
return false;
});
Пример : http://jsfiddle.net/M4teA/
Обратите внимание, приведенный выше код будет работать только с jQuery1.7.Если эти события щелчка были связаны с более ранней версией jQuery или «встроенным», вы все равно можете использовать код, но вам нужно будет по-разному обращаться к «старому обработчику».
Я знаю, я предполагаю,Сценарий «совершенного мира», например, здесь описывается тем, что эти дескрипторы явно вызывают .stopPropagation()
вместо возврата false
.Так что это все еще может быть бесполезный академический пример, но я чувствую, что могу предложить его: -)
edit : эй, return false;
будет работать просто отлично, объекты событий доступнытаким же образом.