2011-01-28 26 views
5

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

11

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ị.

+0

gọn gàng và đơn giản – Hussein

+4

Đ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

3
$('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?

+0

Đ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. –

+0

Ah .. đã đọc sai câu hỏi. – ThiefMaster

1

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

4

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/

+0

Thực hiện tốt, tuy nhiên cách @lonesomeday sạch hơn. – Hussein

0

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; 
} 
+0

Sử dụng tốt hơn 'e.stopPropagation()' thay vì 'return false;'. – ThiefMaster

0

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(); 
       } 
      } 
     }); 
    }