J'essaie d'utiliser event.stopPropagation () dans un composant ReactJS pour empêcher un événement de clic de bouillonner et de déclencher un événement de clic qui était attaché avec JQuery dans le code hérité, mais il semble que stopPropagation () de React n'arrête que la propagation aux événements également attaché dans React, et stopPropagation () de JQuery n'arrête pas la propagation aux événements attachés avec React.
Existe-t-il un moyen de faire fonctionner stopPropagation () entre ces événements? J'ai écrit un simple JSFiddle pour démontrer ces comportements:
/** @jsx React.DOM */
var Propagation = React.createClass({
alert: function(){
alert('React Alert');
},
stopPropagation: function(e){
e.stopPropagation();
},
render: function(){
return (
<div>
<div onClick={this.alert}>
<a href="#" onClick={this.stopPropagation}>React Stop Propagation on React Event</a>
</div>
<div className="alert">
<a href="#" onClick={this.stopPropagation}>React Stop Propagation on JQuery Event</a>
</div>
<div onClick={this.alert}>
<a href="#" className="stop-propagation">JQuery Stop Propagation on React Event</a>
</div>
<div className="alert">
<a href="#" className="stop-propagation">JQuery Stop Propagation on JQuery Event</a>
</div>
</div>
);
}
});
React.renderComponent(<Propagation />, document.body);
$(function(){
$(document).on('click', '.alert', function(e){
alert('Jquery Alert');
});
$(document).on('click', '.stop-propagation', function(e){
e.stopPropagation();
});
});
stopImmediatePropagation
écouteurs d'événements de revendications seront appelés dans l'ordre dans lequel ils ont été liés. Si votre React JS est initialisé avant votre jQuery (comme c'est le cas dans votre violon), l'arrêt de la propagation immédiate fonctionnera.
componentDidMount
, mais cela pourrait interférer avec d'autres gestionnaires d'événements React de manière inattendue.
.stop-propagation
ne fonctionnera pas nécessairement. Votre exemple utilise la délégation d'événements, mais tente d'arrêter la propagation au niveau de l'élément. L'auditeur doit être lié à l'élément lui - même: $('.stop-propagation').on('click', function(e) { e.stopPropagation(); });
. Ce violon empêche toute propagation comme vous le faisiez
event.nativeEvent.stopImmediatePropagation
pour empêcher le déclenchement d'autres écouteurs d'événements, mais l'ordre d'exécution n'est pas garanti.