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();
});
});
javascript
jquery
reactjs
lofiinterstate
sumber
sumber
event.nativeEvent.stopImmediatePropagation
untuk mencegah event listener lain diaktifkan, tetapi urutan eksekusi tidak dijamin.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/6Jawaban:
React menggunakan event delegation dengan satu event listener
document
untuk event yang menggelembung, seperti 'click' dalam contoh ini, yang berarti menghentikan propagasi tidak dimungkinkan; acara nyata telah disebarkan pada saat Anda berinteraksi dengannya di React.stopPropagation
tentang peristiwa sintetis React dimungkinkan karena React menangani penyebaran peristiwa sintetis secara internal.Bekerja JSFiddle dengan perbaikan dari bawah.
React Stop Propagation di jQuery Event
Gunakan
Event.stopImmediatePropagation
untuk mencegah pendengar Anda yang lain (dalam kasus ini) di root dipanggil. Ini didukung di IE9 + dan browser modern.jQuery Hentikan Propagasi pada React Event
Kode jQuery Anda juga menggunakan delegasi peristiwa, yang berarti memanggil
stopPropagation
penangan tidak menghentikan apa pun; acara telah disebarkan kedocument
, dan pendengar React akan dipicu.Untuk mencegah penyebaran di luar elemen, pemroses harus terikat ke elemen itu sendiri:
Sunting (2016/01/14): Memperjelas bahwa delegasi hanya digunakan untuk acara yang menggelembung. Untuk detail lebih lanjut tentang penanganan acara, sumber React memiliki komentar deskriptif: ReactBrowserEventEmitter.js .
sumber
document
, atau root komponen React? The halaman terkait hanya mengatakan "di tingkat atas", yang saya ambil untuk berarti bahwa itu tidak dalamdocument
(tapi aku tidak bisa mencari tahu apakah ini bahkan relevan).window
alih-alihdocument
: stackoverflow.com/a/52879137/438273Perlu dicatat (dari masalah ini ) bahwa jika Anda melampirkan acara
document
,e.stopPropagation()
tidak akan membantu. Sebagai solusinya, Anda dapat menggunakanwindow.addEventListener()
sebagai gantidocument.addEventListener
, laluevent.stopPropagation()
akan menghentikan penyebaran acara ke jendela.sumber
Ini masih satu momen yang menarik:
Gunakan konstruksi ini, jika fungsi Anda dibungkus oleh tag
sumber
event.nativeEvent
adalah jawaban yang benar; Saya dapat menggunakannyacomposedPath()
dengan cara:event.nativeEvent.composedPath()
wrapped by tag
? bisakah Anda memberikan contoh?<div onClick=(firstHandler)> <div onClick=(secHandler)>active text</div> </div>
Saya dapat menyelesaikan ini dengan menambahkan yang berikut ini ke komponen saya:
sumber
Saya mengalami masalah ini kemarin, jadi saya membuat solusi yang ramah Bereaksi.
Lihat react-native-listener . Ini bekerja dengan sangat baik sejauh ini. Umpan balik dihargai.
sumber
react-native-listener
penggunaanfindDomNode
yang tidak akan berlaku lagi github.com/yannickcr/eslint-plugin-react/issues/…Dari dokumentasi React : Event handler di bawah ini dipicu oleh event dalam fase gelembung . Untuk mendaftarkan event handler untuk fase pengambilan, tambahkan Capture . (penekanan ditambahkan)
Jika Anda memiliki klik pendengar acara dalam kode Bereaksi Anda dan Anda tidak ingin meluap, saya pikir apa yang ingin Anda lakukan adalah menggunakan
onClickCapture
bukanonClick
. Kemudian Anda akan meneruskan acara ke penangan dan melakukanevent.nativeEvent.stopPropagation()
untuk menjaga acara asli agar tidak menggelembung ke pendengar acara vanilla JS (atau apa pun yang tidak bereaksi).sumber
Pembaruan: Anda sekarang bisa
<Elem onClick={ proxy => proxy.stopPropagation() } />
sumber
Solusi cepat digunakan
window.addEventListener
alih-alihdocument.addEventListener
.sumber