2009-11-04 2 views

ответ

17

При создании окна JQuery Dialog JQuery вставляет класс ui-widget-overlay. Если вы привяжете функцию щелчка к этому классу, чтобы закрыть диалоговое окно, оно должно предоставить нужные функции.

код будет что-то вроде этого (непроверенные):

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

Edit: была протестирована на Кендо, а также следующее:

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

Стоит добавить, вы должны добавить 'body' к объявлению события наложения, как если бы наложение не было при создании события, оно не будет применяться. $ ('body'). On ('click', '.ui-widget-overlay', function() {$ ("# dialog"). Dialog ("close");}); – Matt

6

Это сообщение может помочь:

http://www.jensbits.com/2010/06/16/jquery-modal-dialog-close-on-overlay-click/

См. Также How to close a jQuery UI modal dialog by clicking outside the area covered by the box? для объяснения того, когда и как подать заявку. overlay нажмите или зарегистрируйтесь в зависимости от того, как вы используете диалог на странице.

122

Edit: Вот плагин, который я автором, который расширяет JQuery UI Dialog включить закрытие при нажатии снаружи плюс другие функции: https://github.com/jasonday/jQuery-UI-Dialog-extended

Вот 3 способа, чтобы закрыть диалоговое окно JQuery UI при нажатии вне POPIN:

Если диалог модальный/имеет фоновую накладку: 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'); 
      }) 
     } 
    }); 
}); 

Если диалог покадрово Метод 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'); 
     } 
    }); 

немодальные диалог Метод 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

Хороший ответ! Единственный, который я видел, касается немодального использования диалога. – Stuart

+0

отличный ответ +1 –

+0

@ masato-san: Что с форматированием? – qwertymk

5

В некоторых случаях ответ Джейсона является излишеством. И $('.ui-widget-overlay').click(function(){ $("#dialog").dialog("close"); }); не всегда работает с динамическим контентом.

Решения, которое я нахожу работу во всех случаях:

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

В каких сценариях ни одно из моих решений не работает? (из любопытства), поскольку большинство моих разработок предназначено для динамического контента - мои оверлейные и не накладываемые методы работали каждый раз. – Jason

+0

после использования xajax для обновления DOM, например. – neokio

+0

Я не нашел, что это проблема, но ваш выше - скорее комментарий, чем ответ. Кроме того, '.on' является более поздним, и делегат может быть более безопасным. – Jason

8

Если у вас есть несколько диалоговых окон, которые могут быть открыты на странице, это позволит любому из них можно закрыть, нажав на фоне:

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

(работает только для модальных диалогов, поскольку она опирается на «.ui-виджет-накладкой. И это делает близко все открывать окна в любое время на фоне одного из них щелкнул.)

7

Если вы хотите сделать это для всех диалогов по всему сайту, попробуйте следующий код ...

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

}); 
0

Столкнувшись с той же проблемой, я создал небольшой плагин, который позволяет закрыть диалоговое окно при нажатии вне его ли это модальный или покадрово диалога. Он поддерживает один или несколько диалогов на одной странице.

Более подробная информация на моем сайте здесь: http://www.coheractio.com/blog/closing-jquery-ui-dialog-widget-when-clicking-outside

Laurent

0

Попробуйте это:

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

Добро пожаловать в SO и спасибо за ваш ответ. Я просматриваю ваш ответ, потому что он был отмечен за качественный обзор из-за его терпения. В этом случае ваш ответ кажется полезным и, возможно, правильным, поэтому я его не удалю. Однако было бы очень полезно, если бы вы могли добавить в него текст, объясняющий, что он делает, как он работает и как он решает проблему OP. Благодарю. –

1

Если код предыдущих сообщений не работает, дать этому попытку:

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

Немного поздно, но это решение, которое сработало для меня. Идеально, если ваш модаль находится внутри тега overlay. Таким образом, модальный будет закрываться, когда вы нажимаете где-либо вне модального контента.

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

Вот working example

Смежные вопросы