2009-11-04 53 views
49

Có tùy chọn mặc định để đóng hộp thoại jQuery bằng cách nhấp vào một nơi nào đó trên màn hình thay vì biểu tượng đóng không?Đóng hộp thoại khi nhấp chuột (ở bất kỳ đâu)

+0

bài này có thể giúp http://stackoverflow.com/questions/8384067/how -to-dismiss-the-dialog-với-click-on-outside-of-the-dialog –

Trả lời

17

Khi tạo cửa sổ Hộp thoại JQuery, JQuery chèn lớp phủ ui-widget-overlay. Nếu bạn liên kết một hàm nhấp chuột với lớp đó để đóng hộp thoại, nó sẽ cung cấp chức năng bạn đang tìm kiếm.

Mã sẽ được cái gì như thế này (chưa được kiểm tra):

$('.ui-widget-overlay').click(function() { $("#dialog").dialog("close"); }); 

Edit: Sau đây đã được thử nghiệm cho Kendo cũng như:

$('.k-overlay').click(function() { 
      var popup = $("#dialogId").data("kendoWindow"); 
      if (popup) 
       popup.close(); 
     }); 
+0

Điều đáng nói là bạn nên thêm 'nội dung' vào khai báo sự kiện nhấp chuột lớp phủ, như thể lớp phủ không tồn tại khi tạo sự kiện, nó sẽ không được áp dụng. $ ('body'). On ('click', '.ui-widget-overlay', hàm() {$ ("# dialog"). Dialog ("close");}); – Matt

122

Edit: Đây là một plugin Tôi là tác giả mà mở rộng jQuery UI Dialog để bao gồm đóng cửa khi nhấp bên ngoài cộng với các tính năng khác: https://github.com/jasonday/jQuery-UI-Dialog-extended

Dưới đây là 3 phương pháp để đóng hộp thoại jquery UI khi nhấp ngoài popin:

Nếu hộp thoại là phương thức/có lớp phủ nền: http://jsfiddle.net/jasonday/6FGqN/

jQuery(document).ready(function() { 
    jQuery("#dialog").dialog({ 
     bgiframe: true, 
     autoOpen: false, 
     height: 100, 
     modal: true, 
     open: function() { 
      jQuery('.ui-widget-overlay').bind('click', function() { 
       jQuery('#dialog').dialog('close'); 
      }) 
     } 
    }); 
}); 

Nếu hộp thoại là phi phương thức Phương pháp 1: http://jsfiddle.net/jasonday/xpkFf/

// Close Pop-in If the user clicks anywhere else on the page 
jQuery('body') 
    .bind('click', function(e) { 
     if(jQuery('#dialog').dialog('isOpen') 
      && !jQuery(e.target).is('.ui-dialog, a') 
      && !jQuery(e.target).closest('.ui-dialog').length 
     ) { 
      jQuery('#dialog').dialog('close'); 
     } 
    }); 

Non-Modal thoại Cách 2: http://jsfiddle.net/jasonday/eccKr/

$(function() { 
    $('#dialog').dialog({ 
     autoOpen: false, 
     minHeight: 100, 
     width: 342, 
     draggable: true, 
     resizable: false, 
     modal: false, 
     closeText: 'Close', 
     open: function() { 
      closedialog = 1; 
      $(document).bind('click', overlayclickclose); }, 
     focus: function() { 
      closedialog = 0; }, 
     close: function() { 
      $(document).unbind('click'); } 
    }); 

    $('#linkID').click(function() { 
     $('#dialog').dialog('open'); 
     closedialog = 0; 
    }); 

    var closedialog; 

    function overlayclickclose() { 
     if (closedialog) { 
      $('#dialog').dialog('close'); 
     } 
     //set to one because click on dialog box sets to zero 
     closedialog = 1; 
    } 
}); 
+2

Câu trả lời hay! Người duy nhất tôi thấy rằng giao dịch với việc sử dụng không có phương thức của hộp thoại. – Stuart

+0

câu trả lời hay nhất +1 –

+0

@ masato-san: Định dạng là gì? – qwertymk

5

Trong một số trường hợp, câu trả lời của Jason là quá mức cần thiết. Và $('.ui-widget-overlay').click(function(){ $("#dialog").dialog("close"); }); không phải lúc nào cũng hoạt động với nội dung động.

Các giải pháp mà tôi tìm thấy tác phẩm trong mọi trường hợp là:

$('body').on('click','.ui-widget-overlay',function(){ $('#dialog').dialog('close'); }); 
+0

trong những trường hợp nào mà giải pháp của tôi không hoạt động? (ngoài tò mò) vì hầu hết sự phát triển của tôi là dành cho nội dung động - các phương pháp lớp phủ và phi lớp phủ của tôi đã hoạt động mọi lúc. Ví dụ: – Jason

+0

sau khi sử dụng xajax để cập nhật DOM. – neokio

+0

Tôi đã không tìm thấy nó là một vấn đề, nhưng ở trên của bạn là một bình luận hơn câu trả lời - bổ sung, '.on' là gần đây hơn và đại biểu có thể là một lựa chọn an toàn hơn. – Jason

8

Nếu bạn có một vài hộp thoại mà có thể được mở trên một trang, điều này sẽ cho phép bất kỳ người trong số họ được đóng lại bằng cách nhấp vào nền:

$('body').on('click','.ui-widget-overlay', function() { 
    $('.ui-dialog').filter(function() { 
    return $(this).css("display") === "block"; 
    }).find('.ui-dialog-content').dialog('close'); 
}); 

(Chỉ làm việc cho các hộp thoại modal, vì nó phụ thuộc vào '.ui-widget overlay'. Và nó gần tất cả hộp thoại mở bất kỳ thời điểm nền tảng của một trong số họ được nhấp.)

7

Nếu bạn muốn làm điều đó cho tất cả các hộp thoại trong toàn bộ trang, hãy thử mã sau ...

$.extend($.ui.dialog.prototype.options, { 
    open: function() { 
     var dialog = this; 
     $('.ui-widget-overlay').bind('click', function() { 
      $(dialog).dialog('close'); 
     }); 
    } 

}); 
0

Hãy thử điều này:

$(".ui-widget-overlay").click(function() { 
    $(".ui-icon.ui-icon-closethick").trigger("click"); 
}); 
+0

Chào mừng bạn đến với SO và cảm ơn câu trả lời của bạn. Tôi đang xem xét câu trả lời của bạn vì câu trả lời đó đã bị gắn cờ để đánh giá chất lượng do tính dễ bị tổn thương của nó. Trong trường hợp này câu trả lời của bạn có vẻ hữu ích và có thể đúng, vì vậy tôi sẽ không xóa nó. Tuy nhiên, nó sẽ thực sự hữu ích nếu bạn có thể thêm một số văn bản xung quanh nó giải thích những gì nó làm, làm thế nào nó hoạt động, và làm thế nào nó giải quyết vấn đề của OP. Cảm ơn. –

1

Nếu mã của bài viết trước đó không hoạt động, cung cấp cho một thử này:

$("a.ui-dialog-titlebar-close")[0].click(); 
0

Một chút trễ nhưng đây là giải pháp phù hợp với tôi. Hoàn hảo nếu phương thức của bạn nằm trong thẻ lớp phủ. Vì vậy, phương thức sẽ đóng khi bạn nhấp vào bất kỳ đâu bên ngoài nội dung phương thức.

HTML

<div class="modal"> 
    <div class="overlay"> 
    <div class="modal-content"> 
     <p>HELLO WORLD!</p> 
    </div> 
    </div> 
</div> 

JS

$(document).on("click", function(event) { 
    if ($(event.target).has(".modal-content").length) { 
    $(".modal").hide(); 
    } 
}); 

Đây là một working example

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