jQuery nhấp vào bất kỳ đâu trong trang ngoại trừ trên 1 div


87

Làm cách nào để kích hoạt một hàm khi tôi nhấp vào bất kỳ đâu trên trang của mình ngoại trừ trên một div ( id=menu_content)?

Câu trả lời:


141

Bạn có thể áp dụng clicktrên bodytài liệu và hủy clickxử lý nếu clicksự kiện được tạo bởi div với id menu_content, Điều này sẽ liên kết sự kiện với một phần tử duy nhất và lưu ràng buộc của clickvới mọi phần tử ngoại trừmenu_content

$('body').click(function(evt){    
       if(evt.target.id == "menu_content")
          return;
       //For descendants of menu_content being clicked, remove this check if you do not want to put constraint on descendants.
       if($(evt.target).closest('#menu_content').length)
          return;             

      //Do processing of click event here for every element except with id menu_content

});

3
con cháu trong BHTGVN thì sao?
iKamy

2
Chúng ta có thể sử dụng gần nhất để kiểm tra nguồn sự kiện có tổ tiên nào với id menu_content như if ($ (evt.target) .closest ('# menu_content'). Length) retrun; kiểm tra câu trả lời cập nhật của tôi.
Adil

Kể từ khi closestbắt đầu với phần tử hiện tại, nó xử lý việc nhấp vào menu_content, cũng như nhấp vào phần tử con. Tôi nghĩ thứ hai iflà tất cả những gì bạn cần.
goodeye

50

Xem tài liệu về Mục tiêu sự kiện jQuery . Sử dụng thuộc tính đích của đối tượng sự kiện, bạn có thể phát hiện nơi nhấp chuột bắt nguồn trong #menu_contentphần tử và nếu có, hãy kết thúc sớm trình xử lý nhấp chuột. Bạn sẽ phải sử dụng .closest()để xử lý các trường hợp mà nhấp chuột bắt nguồn từ hậu duệ của #menu_content.

$(document).click(function(e){

    // Check if click was triggered on or within #menu_content
    if( $(e.target).closest("#menu_content").length > 0 ) {
        return false;
    }

    // Otherwise
    // trigger your click function
});

42

thử đi

 $('html').click(function() {
 //your stuf
 });

 $('#menucontainer').click(function(event){
     event.stopPropagation();
 });

bạn cũng có thể sử dụng các sự kiện bên ngoài


5
Công việc này, nhưng việc sử dụng event.stopPropagation () có thể ảnh hưởng đến các tác động lên JS khác được chứa trong cha mẹ.
Edd Smith

9

Tôi biết rằng câu hỏi này đã được trả lời, Và tất cả các câu trả lời đều tốt. Nhưng tôi muốn thêm hai xu của mình vào câu hỏi này cho những người có vấn đề tương tự (nhưng không hoàn toàn giống nhau).

Nói một cách tổng quát hơn, chúng ta có thể làm như sau:

$('body').click(function(evt){    
    if(!$(evt.target).is('#menu_content')) {
        //event handling code
    }
});

Bằng cách này, chúng tôi có thể xử lý không chỉ các sự kiện được kích hoạt bởi bất kỳ thứ gì ngoại trừ phần tử có id menu_contentmà còn các sự kiện được kích hoạt bởi bất kỳ thứ gì ngoại trừ bất kỳ phần tử nào mà chúng tôi có thể chọn bằng cách sử dụng bộ chọn CSS.

Ví dụ: trong đoạn mã sau, tôi nhận được các sự kiện được kích hoạt bởi bất kỳ phần tử nào ngoại trừ tất cả các <li>phần tử là con của phần tử div có id myNavbar.

$('body').click(function(evt){    
    if(!$(evt.target).is('div#myNavbar li')) {
        //event handling code
    }
});

1
Tôi chỉ muốn nói rằng phương pháp này làm việc cho tôi tốt, tôi sử dụng .là () và cũng .closest () với một selector css mà không có ID nhưng chỉ một số lớp cảm ơn bạn
relipse

7

đây là những gì tôi đã làm. muốn đảm bảo rằng tôi có thể nhấp vào bất kỳ trẻ nào trong bộ chọn ngày của mình mà không cần đóng nó.

$('html').click(function(e){
    if (e.target.id == 'menu_content' || $(e.target).parents('#menu_content').length > 0) {
        // clicked menu content or children
    } else {
        // didnt click menu content
    }
});

mã thực tế của tôi:

$('html').click(function(e){
    if (e.target.id != 'datepicker'
        && $(e.target).parents('#datepicker').length == 0
        && !$(e.target).hasClass('datepicker')
    ) {
        $('#datepicker').remove();
    }
});

Phiên bản đẹp bao gồm cả trẻ em và lớp học nhấp chuột, nên là câu trả lời được chọn!
rAthus
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.