2013-08-21 33 views
13

Vấn đề là tôi cần một "onClickOut" -Event.onClickOut (nhấp sau khi rời khỏi phần tử)

Ví dụ: Bạn có chế độ xem DIV khi di chuột qua (onMouseOver) một số Nút hoặc bao giờ.

Nếu bạn bấm vào bên ngoài phần tử cần ẩn, nhưng nếu bạn nói $ ("nội dung"), hãy bấm nó cũng sẽ bị ẩn khi bạn bấm vào chính phần tử đó. :/

Bây giờ tôi lắng nghe vị trí chuột và khi mouseleave() Tôi đặt var khi nhấp vào phần tử của mình. Trong bước tiếp theo, tôi nghe một sự kiện nhấp chuột (cơ thể) nhưng tôi hỏi nếu var đã được thiết lập. Nếu nó không phải là một nhấp chuột bên ngoài phần tử của tôi, vì vậy tôi có thể ẩn phần tử của mình.

Tôi hy vọng bạn có thể sử dụng nó:

$("#schnellsuche_box").mouseleave(function() { 
    var inside; 
    $("#schnellsuche_box").click(function() { 
     inside = true; 
    }); 
    $("body").click(function() { 
     if(!inside) { 
      $("#schnellsuche_box").hide(); 
     } 
    }); 
    delete inside; 
}); 
+0

Lưu ý: bạn không thể 'xóa' biến cục bộ. (Nhưng ngay cả khi bạn có thể, nó sẽ không có ý nghĩa ở đây bởi vì các trình xử lý nhấn của bạn cố sử dụng biến đó.) – nnnnnn

Trả lời

3

Bạn làm điều đó bằng cách lắng nghe một nhấp chuột vào mức độ tài liệu, và bên trong xử lý sự kiện bạn kiểm tra nếu các yếu tố nhấp là #schnellsuche_box hoặc bất kỳ yếu tố bên trong #schnellsuche_box bằng cách sử dụng closest(), như vậy:

$(document).on('click', function(e) { 
    if (! $(e.target).closest('#schnellsuche_box').length) 
     $('#schnellsuche_box').hide(); 
}); 

FIDDLE

1

Bạn cần phải dừng sự kiện #schnellsuche_box nhấp chuột từ bọt lên đến sự kiện click body (đó là công tác tuyên truyền sự kiện mặc định) bằng cách làm return false:

$("#schnellsuche_box").click(function() { 
    inside = true; 

    return false; 
}); 
+1

'event.stopPropogation();' cũng sẽ hoạt động, tôi đã được thông báo rằng 'return false' dừng bọt chỉ khi được sử dụng trong các cuộc gọi lại jquery – rps

+0

@rps Vâng, điều đó sẽ hiệu quả, nhưng đó không phải là độc quyền đối với jQuery, nó cũng hoạt động chỉ trong JavaScript. – mattytommo

+1

Tôi không chắc "nó" đề cập đến gì trong bình luận của bạn * "nó cũng chỉ hoạt động trong JavaScript" *, nhưng nếu nó là 'return false;', thì nó sẽ chỉ ngăn sự kiện mặc định trong "non-jQuery "trình xử lý sự kiện, chứ không phải sự kiện tuyên truyền. –

0

Hãy thử cách này:

$("body").click(function(e) { 
    var $target = $(e.target); 
    if (!$target.is('#schnellsuche_box') && 
     !$target.parents('#schnellsuche_box').length) { 
     alert('outside'); 
    } 
}); 
0
$("#schnellsuche_box").on("click",function(event) { 
    event.preventDefault(); 
    event.stopPropagation(); 
}); 
+0

@ F4r-20 Bạn không cần phải biết, 'sự kiện' đề cập đến sự kiện JavaScript hiện tại. – mattytommo

+0

Tôi không biết, cảm ơn. – George

+0

@mattytommo - ít nhất là nếu bạn đang sử dụng IE và một số phiên bản Chrome. Nó phải được định nghĩa như một tham số. – adeneo

Các vấn đề liên quan