Sto provando a utilizzare event.stopPropagation () all'interno di un componente ReactJS per impedire a un evento click di ribollire e innescare un evento click che era allegato a JQuery nel codice legacy, ma sembra che stopPropagation () di React interrompa solo la propagazione agli eventi anche allegato in React, e stopPropagation () di JQuery non interrompe la propagazione agli eventi allegati con React.
C'è un modo per far funzionare stopPropagation () in questi eventi? Ho scritto un semplice JSFiddle per dimostrare questi comportamenti:
/** @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
listener di eventi attestazioni verranno chiamati nell'ordine in cui sono stati associati. Se il tuo React JS viene inizializzato prima di jQuery (come nel tuo violino), l'arresto della propagazione immediata funzionerà.
componentDidMount
, ma potrebbe interferire con altri gestori di eventi React in modi inaspettati.
.stop-propagation
necessariamente non funzionerà. Il tuo esempio utilizza la delega degli eventi ma sta tentando di interrompere la propagazione nell'elemento. L'ascoltatore ha bisogno di essere vincolato all'elemento stesso: $('.stop-propagation').on('click', function(e) { e.stopPropagation(); });
. Questo violino impedisce tutta la propagazione come stavi provando: jsfiddle.net/7LEDT/6
event.nativeEvent.stopImmediatePropagation
per impedire l'attivazione di altri listener di eventi, ma l'ordine di esecuzione non è garantito.