Cách dễ nhất để thực hiện một lần nhấp trong jquery là nơi mà một hộp div ẩn nếu được nhấp vào bất kỳ đâu bên ngoài nó.Clickout trong jquery
Trả lời
Tôi không thích các giải pháp sử dụng stopPropagation
vì thường tôi đang sử dụng sự kiện để quản lý các liên kết khác nhau. Tôi không muốn phải lo lắng rằng họ có thể ngừng làm việc nếu hộp tồn tại. lựa chọn của tôi sẽ giống như thế này:
var $box = $('#box');
$(document.body).click(function(){
if (!$box.has(this).length) { // if the click was not within $box
$box.hide();
}
});
Chức năng has
lọc lựa chọn và trả về các yếu tố duy nhất nếu chúng chứa các yếu tố truyền như tham số (bạn cũng có thể sử dụng một chuỗi selector, nhưng đó không phải là liên quan ở đây). Nếu nhấp chuột nằm ngoài hộp, length
sẽ là 0
để điều kiện sẽ chuyển và hộp sẽ bị ẩn.
Điều này sẽ được tối ưu hóa bằng cách đặt giá trị boolean cho dù hộp hiện có hiển thị và chỉ thực hiện cuộc gọi has
nếu hiện tại đang hiển thị.
$('body').click(function() {
$('#box').fadeOut();
});
$('#box').click(function(e) {
e.stopPropagation();
});
Điều này hoạt động vì #box sẽ nhận sự kiện nhấp trước nếu bạn nhấp vào bên trong. Kể từ khi tuyên truyền được dừng lại, xử lý gắn liền với cơ thể sẽ không nhận được nó để hộp sẽ không được đóng trừ khi bạn nhấp vào bên ngoài của hộp.
Nếu bạn muốn nó để ẩn ngay lập tức, sử dụng .hide()
tôi đã có stopPropagation() lừa từ How do I detect a click outside an element?
Điều này sẽ ẩn nó nếu bạn nhấp vào bên trong div chứ không phải bên ngoài. –
Ah .. đã đọc sai câu hỏi. – ThiefMaster
Tôi biết rằng jQuery có sự kiện "focusout" cho các yếu tố hình thức, không chắc chắn nếu nó có thể có lẽ được sử dụng cho một
như thế này:
$("#thediv").show(0, function() {
var that = $(this);
$(document).bind("click", function(e) {
if($(e.target).attr("id") != that.attr("id")) {
that.hide();
$(this).unbind("click");
}
});
});
fiddle đây: http://jsfiddle.net/XYbmE/3/
Thực hiện tốt, tuy nhiên cách @lonesomeday sạch hơn. – Hussein
Bind một chức năng nhấp chuột vào tài liệu riêng của mình:
$(document).click(function(){
alert('doc');
});
Sau đó ràng buộc một chức năng để cùng một sự kiện trên div chính nó và trả về false vì vậy sự kiện sẽ không bong bóng lên đến tài liệu .
$('#mydiv').click(function(e){
alert('mydiv click');
return false;
}
Sử dụng tốt hơn 'e.stopPropagation()' thay vì 'return false;'. – ThiefMaster
Heres giải pháp của tôi
var ClickOut = {};
ClickOut.list = [];
ClickOut.Add = function(jqel, callback) {
var i = ClickOut.list.push({jqel:jqel, callback:callback});
return (i-1);
}
ClickOut.Remove = function(i) {
ClickOut.list.splice(i, 1);
}
ClickOut.Init = function() {
$('body').click(function(e) {
for(var x = 0; x < ClickOut.list.length; x++) {
if (!ClickOut.list[x].jqel.has(e.target).length) {
ClickOut.list[x].callback();
}
}
});
}
tôi khuyên bạn nên sử dụng lib này https://github.com/gsantiago/jquery-clickout. Thật tuyệt vời!
$('button').on('clickout', function (e) {
console.log('click outside button')
})
- 1. Chaining selectors trong jQuery
- 2. Object.values () trong jQuery
- 3. jQuery trong tiện ích
- 4. .datepicker ('setdate'), trong jQuery
- 5. jquery unwrap Bên trong
- 6. hủy gửi trong jquery?
- 7. addID trong jQuery?
- 8. như Chứa trong jquery
- 9. Nhiều selectors trong jQuery
- 10. JQuery (..). Html() có lỗi trong jQuery 1.3.2 không?
- 11. Nhiều chuỗi chọn trong jQuery?
- 12. jQuery trong Chrome Console (8.0.552.237)
- 13. touchstart jquery trong trình duyệt
- 14. jQuery Mouse Flicker trong IE
- 15. jquery như lib trong java
- 16. Xử lý F5 trong JQuery
- 17. Sử dụng jQuery trong HTML
- 18. jquery biến trong chức năng
- 19. ... (ba dấu chấm) trong jQuery?
- 20. jQuery: xóa hàng trong datatables
- 21. các cộng (+) trong jquery selector
- 22. Lưới Menu trong jQuery Mobile
- 23. javascript bên trong mẫu jquery
- 24. Thao tác chuỗi trong jQuery
- 25. Tạo chức năng trong jquery
- 26. Ajax và Jquery trong Symfony
- 27. Chọn hàng bảng trong jQuery
- 28. jQuery CRUD trong ASP.NET MVC
- 29. Sử dụng jQuery trong ASP.NET
- 30. JQuery Ajax POST trong Codeigniter
gọn gàng và đơn giản – Hussein
Điều này không hiệu quả đối với tôi, nhưng sau khi nhìn vào câu trả lời của Caspar tôi đã làm nó bằng cách thay đổi 'this' thành' e.target' và thêm 'e' làm đối số cho hàm gọi lại. – meustrus