Saya mencoba menggunakan event.stopPropagation () dalam komponen ReactJS untuk menghentikan event klik menggelembung dan memicu event klik yang dilampirkan dengan JQuery dalam kode lama, tetapi sepertinya stopPropagation () React hanya menghentikan propagasi ke event juga terpasang di React, dan stopPropagation () JQuery tidak menghentikan propagasi ke kejadian yang dilampirkan dengan React.
Apakah ada cara untuk membuat stopPropagation () berfungsi di seluruh peristiwa ini? Saya menulis JSFiddle sederhana untuk menunjukkan perilaku ini:
/** @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
pendengar acara klaim akan dipanggil sesuai urutan mereka terikat. Jika React JS Anda diinisialisasi sebelum jQuery Anda (seperti yang ada di biola Anda), menghentikan propagasi langsung akan berhasil.
componentDidMount
, tetapi itu mungkin mengganggu penangan kejadian React lainnya dengan cara yang tidak terduga.
.stop-propagation
tentu tidak akan berhasil. Contoh Anda menggunakan delegasi acara tetapi mencoba menghentikan propagasi di elemen tersebut. Pendengar perlu terikat pada elemen itu sendiri: $('.stop-propagation').on('click', function(e) { e.stopPropagation(); });
. Biola ini mencegah semua propagasi seperti yang Anda coba: jsfiddle.net/7LEDT/6
event.nativeEvent.stopImmediatePropagation
untuk mencegah event listener lain diaktifkan, tetapi urutan eksekusi tidak dijamin.