Я намагаюся використовувати event.stopPropagation () в компоненті ReactJS, щоб зупинити події клацання з пухирців і викликати подію натискання, яка була приєднана до JQuery у застарілому коді, але, схоже, stopPropagation React () лише зупиняє розповсюдження подій також додається в React, і зупинка розширення JQuery () не зупиняє поширення на події, приєднані до React.
Чи є спосіб змусити stopPropagation () працювати протягом цих подій? Я написав простий JSFiddle, щоб продемонструвати таку поведінку:
/** @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
слухачі подій , які претендують на вимоги, будуть називатися в тому порядку, в якому вони були пов'язані. Якщо ваш React JS ініціалізований перед вашим jQuery (як це у вашій скрипці), зупинка негайного поширення буде працювати.
componentDidMount
, але це може заважати іншим обробникам подій React несподівано.
.stop-propagation
обов'язково не спрацює. Ваш приклад використовує делегування подій, але намагається зупинити поширення на елементі. Слухач повинен бути прив'язаний до самого елементу: $('.stop-propagation').on('click', function(e) { e.stopPropagation(); });
. Ця скрипка перешкоджає будь-якому розповсюдженню, як ви намагалися: jsfiddle.net/7LEDT/6
event.nativeEvent.stopImmediatePropagation
для запобігання запуску інших слухачів подій, але порядок виконання не гарантується.