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();
});
});
javascript
jquery
reactjs
lofiinterstate
la source
la source
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.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 faisiezRéponses:
React utilise la délégation d'événement avec un seul écouteur d'événement activé
document
pour les événements qui apparaissent, comme «clic» dans cet exemple, ce qui signifie que l'arrêt de la propagation n'est pas possible; l'événement réel s'est déjà propagé au moment où vous interagissez avec lui dans React.stopPropagation
sur l'événement synthétique de React est possible car React gère la propagation des événements synthétiques en interne.Travailler JSFiddle avec les correctifs ci-dessous.
Réagir la propagation d'arrêt sur l'événement jQuery
Utilisez
Event.stopImmediatePropagation
pour empêcher vos autres écouteurs (jQuery dans ce cas) sur la racine d'être appelés. Il est pris en charge dans IE9 + et les navigateurs modernes.Propagation d'arrêt jQuery sur l'événement React
Votre code jQuery utilise également la délégation d'événements, ce qui signifie que l'appel
stopPropagation
du gestionnaire n'interrompt rien; l'événement s'est déjà propagé versdocument
, et l'écouteur de React sera déclenché.Pour empêcher la propagation au-delà de l'élément, l'auditeur doit être lié à l'élément lui-même:
Edit (2016/01/14): Clarification du fait que la délégation n'est nécessairement utilisée que pour les événements qui bouillonnent. Pour plus de détails sur la gestion des événements, la source de React contient des commentaires descriptifs: ReactBrowserEventEmitter.js .
la source
document
ou le composant racine React? La page liée dit simplement "au niveau supérieur", ce qui signifie que ce n'est pas le casdocument
(mais je ne peux pas savoir si cela est même pertinent).window
place dedocument
: stackoverflow.com/a/52879137/438273Il convient de noter (à partir de ce numéro ) que si vous attachez des événements à
document
, celae.stopPropagation()
ne vous aidera pas. Comme solution de contournement, vous pouvez utiliser à lawindow.addEventListener()
place dedocument.addEventListener
, puisevent.stopPropagation()
arrêtera l'événement de se propager à la fenêtre.la source
C'est encore un moment intéressant:
Utilisez cette construction, si votre fonction est enveloppée par une balise
la source
event.nativeEvent
est la bonne réponse; J'ai pu utilisercomposedPath()
par le biais de celui-ci:event.nativeEvent.composedPath()
wrapped by tag
? pourriez-vous pls fournir un exemple?<div onClick=(firstHandler)> <div onClick=(secHandler)>active text</div> </div>
J'ai pu résoudre ce problème en ajoutant ce qui suit à mon composant:
la source
J'ai rencontré ce problème hier, j'ai donc créé une solution compatible React.
Découvrez react-native-listener . Cela fonctionne très bien jusqu'à présent. Commentaires appréciés.
la source
react-native-listener
utilisationsfindDomNode
qui seront obsolètes github.com/yannickcr/eslint-plugin-react/issues/…Depuis la documentation React : Les gestionnaires d'événements ci-dessous sont déclenchés par un événement en phase de bullage . Pour enregistrer un gestionnaire d'événements pour la phase de capture, ajoutez Capture . (italiques ajoutés)
Si vous avez un écouteur d'événement de clic dans votre code React et que vous ne voulez pas qu'il bouillonne, je pense que ce que vous voulez faire est d'utiliser à la
onClickCapture
place deonClick
. Ensuite, vous passeriez l'événement au gestionnaire et le feriezevent.nativeEvent.stopPropagation()
pour empêcher l'événement natif de bouillonner jusqu'à un écouteur d'événement JS vanilla (ou tout ce qui ne réagit pas).la source
Mise à jour: vous pouvez maintenant
<Elem onClick={ proxy => proxy.stopPropagation() } />
la source
Une solution de contournement rapide consiste à utiliser
window.addEventListener
au lieu dedocument.addEventListener
.la source