Tôi muốn tạo sự kiện một lần được kích hoạt bằng cách nhấp vào bất kỳ đâu. Sự kiện này được tạo bằng cách nhấp vào nút. Tôi không muốn sự kiện kích hoạt khi nhấp vào nút, chỉ bất kỳ lần nhấp tiếp theo nào ở bất kỳ đâu (bao gồm cả nút).setTimeout và tuyên truyền sự kiện
Vì vậy, nói rằng tôi đã có một số html như sau:
<body>
<div id="someparent">
<div id="btn"></div>
</div>
</body>
Và javascript sau (jquery):
$('#btn').click(function() {
$(document).one('click', function() {
console.log('triggered');
});
});
$('#someparent').click(function() {
// this must always be triggered
});
Tôi muốn tránh dừng lan truyền sự kiện, nhưng ở trên ví dụ, sự kiện bị ràng buộc vào tài liệu, sự kiện sau đó phát tán và sự kiện được kích hoạt.
Một cách để khắc phục điều này có vẻ là để quấn tạo sự kiện trong một thời gian chờ:
$('#btn').click(function() {
setTimeout(function() {
$(document).one('click', function() {
console.log('triggered');
});
}, 1);
});
$('#someparent').click(function() {
// this must always be triggered
});
Bây giờ, làm việc này tốt, nhưng tôi đang tự hỏi liệu điều này là an toàn. Có một số khái niệm về trật tự thực hiện đảm bảo rằng điều này sẽ luôn luôn làm việc, hoặc là nó chỉ làm việc một cách tình cờ? Tôi biết có những giải pháp khác (ví dụ như một sự kiện lồng nhau .one()
), nhưng tôi đang tìm kiếm một câu trả lời cụ thể cho cách setTimeout và tuyên truyền sự kiện tương tác.
Fiddle sau hiển thị hai div. Người đầu tiên có hành vi sai (sự kiện tài liệu được kích hoạt ngay lập tức). Nhấp vào div thứ hai, và sau đó bất cứ nơi nào trên tài liệu (vùng trắng) minh họa các hành vi truy nã:
https://jsfiddle.net/Lwocuuf8/7/
bạn không thể dây lên sự kiện nhấn và chỉ cần loại bỏ các xử lý sau khi sự kiện có được kích hoạt (trừ khi nguồn là nút)? –
Tôi không chắc mình hiểu ý của bạn là gì? – jkgeyti
chỉ cần trả về false để ngăn chặn bong bóng – TecHunter