Ich versuche, event.stopPropagation () in einer ReactJS-Komponente zu verwenden, um zu verhindern, dass ein Klickereignis in die Luft sprudelt und ein Klickereignis auslöst, das mit JQuery im Legacy-Code angehängt wurde. Es scheint jedoch, dass stopPropagation () von React nur die Weitergabe an Ereignisse stoppt wird auch in React angehängt, und stopQropagation () von JQuery stoppt die Weitergabe an mit React angehängte Ereignisse nicht.
Gibt es eine Möglichkeit, stopPropagation () für diese Ereignisse funktionsfähig zu machen? Ich habe eine einfache JSFiddle geschrieben , um diese Verhaltensweisen zu demonstrieren:
/** @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();
});
});
stopImmediatePropagationListener von Anspruchsereignissen in der Reihenfolge aufgerufen, in der sie gebunden waren. Wenn Ihr React JS vor Ihrer jQuery initialisiert wird (wie in Ihrer Geige), funktioniert das Stoppen der sofortigen Weitergabe.
componentDidMount, der jedoch andere React-Ereignishandler auf unerwartete Weise beeinträchtigen kann.
.stop-propagationunbedingt nicht funktionieren wird. In Ihrem Beispiel wird die Ereignisdelegierung verwendet, es wird jedoch versucht, die Weitergabe am Element zu stoppen. Der Listener muss an das Element selbst gebunden sein : $('.stop-propagation').on('click', function(e) { e.stopPropagation(); });. Diese Geige verhindert jede Ausbreitung, wie Sie es versucht haben: jsfiddle.net/7LEDT/6
event.nativeEvent.stopImmediatePropagationdamit verhindern, dass andere Ereignis-Listener ausgelöst werden, die Ausführungsreihenfolge kann jedoch nicht garantiert werden.