¿Cómo eliminar el botón de cierre en el cuadro de diálogo jQuery UI?

775

¿Cómo elimino el botón de cierre (la X en la esquina superior derecha) en un cuadro de diálogo creado por jQuery UI?

Robert MacLean
fuente
11
Consulte la documentación, primer subtítulo: api.jqueryui.com/dialog
Mike Cole
1
@MikeCole La documentación es para 1.10: creo que si desea ocultar el botón de cierre en cualquier versión anterior, deberá hacer algo como las respuestas a continuación.
Jarrett
1
Use "ui-dialog-titlebar-close": "display: none;" cuando configuramos el diálogo modal
jqueryui

Respuestas:

711

He encontrado que esto funcionó al final (tenga en cuenta que la tercera línea anula la función de abrir que encuentra el botón y lo oculta):

$("#div2").dialog({
    closeOnEscape: false,
    open: function(event, ui) {
        $(".ui-dialog-titlebar-close", ui.dialog || ui).hide();
    }
});

Para ocultar el botón de cierre en todos los cuadros de diálogo, también puede usar el siguiente CSS:

.ui-dialog-titlebar-close {
    visibility: hidden;
}
Robert MacLean
fuente
121
$(".ui-dialog-titlebar-close", ui).hide();para ocultar el botón solo para este diálogo.
Anthony Serdyukov
67
Tampoco pude hacerlo funcionar desde el parámetro ui. Terminé usando: $ (". Ui-dialog-titlebar-close", $ (this) .parent ()). Hide ();
Nigel
70
@Anton Solo quiero señalar que solo especificar 'ui' no funciona. tienes que usar 'ui.dialog'. entonces la línea correcta sería $ (". ui-dialog-titlebar-close", ui.dialog) .hide ();
Bradley Mountford
22
@Bradley. ui no funcionó para mí, ui.dialog lo hizo pero se aplicó en cada instancia. Para que el trabajo se aplicara solo a la función definida para abrir, tuve que hacer esto: $ (". Ui-dialog-titlebar-close", this.parentNode) .hide ();
Nabab
12
open: function(event, ui) { $(".ui-dialog-titlebar-close").hide(); }
opengrid
361

Aquí hay otra opción simplemente usando CSS que no anula todos los diálogos en la página.

El CSS

.no-close .ui-dialog-titlebar-close {display: none }

El HTML

<div class="selector" title="No close button">
    This is a test without a close button
</div>

El Javascript

$( ".selector" ).dialog({ dialogClass: 'no-close' });

Ejemplo de trabajo

David
fuente
66
Me gusta este enfoque porque puedo usarlo junto con cosas como: .noTitleDlg .ui-dialog-titlebar {display: none} en CSS para construir la forma en que quiero que mi diálogo aparezca y se comporte y luego simplemente configure dialogClass en consecuencia.
A. Murray
11
solución muy limpia ... +1 para no involucrar funcionalidad js adicional para eliminar el botón.
Bongs
2
Gran idea. Resulta útil para apuntar a un cuadro de diálogo específico en situaciones en las que utiliza el mismo método abierto para todos los cuadros de diálogo, y no es muy práctico cambiarlo para una instancia específica.
ZolaKt
3
Mi solución favorita Estaba pensando que algo así sería el mejor enfoque. Gracias por tenerlo ya codificado aquí. Sobre la base de esto, me gusta usar esta variación que tomará el atributo de clase de la división de contenido del diálogo, en el que puedo poner la clase "no cerrar":dialogClass : $("#my-dialog-id").attr("class"),
LS
Esta solución permite cerrar con escape, si desea evitar el cierre con el uso de escape:$( ".selector" ).dialog({ dialogClass: 'no-close' , closeOnEscape: false,});
Mladen Adamovic
124

la "mejor" respuesta no será buena para múltiples diálogos. Aquí hay una mejor solución.

open: function(event, ui) { 
    //hide close button.
    $(this).parent().children().children('.ui-dialog-titlebar-close').hide();
},
Conde
fuente
23
Esto es más complicado de lo que necesitas. $(".ui-dialog-titlebar-close", $(this).parent()).hide();
Kevin Panko
@KevinPanko su sugerencia funciona bien cuando utiliza el ejemplo proporcionado por el sitio de demostración de jquery ui con ASP.NET v2.0 en una página .aspx. jqueryui.com/demos/dialog/modal-form.html
Matthew Dally
66
.closest ('. ui-dialog') es mejor que asumir un padre.
Technomage
86

Puede usar CSS para ocultar el botón de cierre en lugar de JavaScript:

.ui-dialog-titlebar-close{
    display: none;
}

Si no desea afectar a todos los modales, puede usar una regla como

.hide-close-btn .ui-dialog-titlebar-close{
    display: none;
}

Y aplicar .hide-close-btnal nodo superior del diálogo

Gordian Yuan
fuente
3
Esta respuesta fue fácil y directa. Sin embargo, se aplica solo si desea deshabilitar el botón para todos los cuadros de diálogo.
Mark Brittingham el
@MarkBrittingham Puede simplemente aplicar una clase CSS personalizada a su modal y al selector, luego esto se aplicará a quien quiera
Juan Mendes
48

Como se muestra en la página oficial y sugerido por David:

Crea un estilo:

.no-close .ui-dialog-titlebar-close {
    display: none;
}

Luego, simplemente puede agregar la clase de no cerrar a cualquier cuadro de diálogo para ocultar su botón de cerrar:

$( "#dialog" ).dialog({
    dialogClass: "no-close",
    buttons: [{
        text: "OK",
        click: function() {
            $( this ).dialog( "close" );
        }
    }]
});
mhu
fuente
41

Creo que esto es mejor.

open: function(event, ui) {
  $(this).closest('.ui-dialog').find('.ui-dialog-titlebar-close').hide();
}
Miguel Galante
fuente
El problema es que ocasionalmente oculta el botón de cierre para otros diálogos también. cómo prevenir eso
Zaveed Abbasi
Incluso usando open: function (event, ui) {$ (this) .closest ('. Ui-dialog'). Find ('. Ui-dialog-titlebar-close'). Show (); } no funciona.
Zaveed Abbasi
34

Una vez que haya llamado .dialog()a un elemento, puede ubicar el botón de cierre (y otras marcas de diálogo) en cualquier momento conveniente sin usar controladores de eventos:

$("#div2").dialog({                    // call .dialog method to create the dialog markup
    autoOpen: false
});
$("#div2").dialog("widget")            // get the dialog widget element
    .find(".ui-dialog-titlebar-close") // find the close button for this dialog
    .hide();                           // hide it

Metodo alternativo:

Dentro de los controladores de eventos de diálogo, se thisrefiere al elemento que se está "dialogando" y se $(this).parent()refiere al contenedor de marcado de diálogo, entonces:

$("#div3").dialog({
    open: function() {                         // open event handler
        $(this)                                // the element being dialogged
            .parent()                          // get the dialog widget element
            .find(".ui-dialog-titlebar-close") // find the close button for this dialog
            .hide();                           // hide it
    }
});

FYI, el marcado de diálogo se ve así:

<div class="ui-dialog ui-widget ui-widget-content ui-corner-all ui-draggable ui-resizable">
    <!-- ^--- this is the dialog widget -->
    <div class="ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix">
        <span class="ui-dialog-title" id="ui-dialog-title-dialog">Dialog title</span>
        <a class="ui-dialog-titlebar-close ui-corner-all" href="#"><span class="ui-icon ui-icon-closethick">close</span></a>
    </div>
    <div id="div2" style="height: 200px; min-height: 200px; width: auto;" class="ui-dialog-content ui-widget-content">
        <!-- ^--- this is the element upon which .dialog() was called -->
    </div>
</div>

Demos aquí

Salman A
fuente
25

La respuesta de Robert MacLean no funcionó para mí.

Sin embargo, esto funciona para mí:

$("#div").dialog({
   open: function() { $(".ui-dialog-titlebar-close").hide(); }
});
VOLAR
fuente
9
$("#div2").dialog({
   closeOnEscape: false,
   open: function(event, ui) { $('#div2').parent().find('a.ui-dialog-titlebar-close').hide();}
});
Alok Vad
fuente
9

Ninguno de los anteriores funciona. La solución que realmente funciona es:

$(function(){
  //this is your dialog:
  $('#mydiv').dialog({
    // Step 1. Add an extra class to our dialog to address the dialog directly. Make sure that this class is not used anywhere else:
    dialogClass: 'my-extra-class' 
  })
  // Step 2. Hide the close 'X' button on the dialog that you marked with your extra class
  $('.my-extra-class').find('.ui-dialog-titlebar-close').css('display','none');
  // Step 3. Enjoy your dialog without the 'X' link
})

Por favor, compruebe si funciona para usted.

Michael Zelensky
fuente
7

La mejor manera de ocultar el botón es filtrarlo con su atributo de icono de datos:

$('#dialog-id [data-icon="delete"]').hide();
ibrahimab
fuente
6

http://jsfiddle.net/marcosfromero/aWyNn/

$('#yourdiv').                 // Get your box ...
  dialog().                    // ... and turn it into dialog (autoOpen: false also works)
  prev('.ui-dialog-titlebar'). // Get title bar,...
  find('a').                   // ... then get the X close button ...
  hide();                      // ... and hide it
marcosfromero
fuente
6

Para desactivar la clase, el código corto:

$(".ui-dialog-titlebar-close").hide();

puede ser usado.

Caniko
fuente
6

El botón de cierre agregado por el widget de diálogo tiene la clase 'ui-dialog-titlebar-close', por lo que después de su llamada inicial a .dialog (), puede usar una declaración como esta para eliminar nuevamente el botón de cerrar: funciona ...

$( 'a.ui-dialog-titlebar-close' ).remove();
Sonal S.
fuente
6

Capté el evento cercano del cuadro de diálogo. Este código luego elimina el <div>( #dhx_combo_list):

open: function(event, ui) { 
  //hide close button.
  $(this).parent().children().children('.ui-dialog-titlebar-close').click(function(){
    $("#dhx_combo_list").remove();
  });
},
ruwan
fuente
5
$(".ui-button-icon-only").hide();
Cos
fuente
2
Debería poder usar CSS directo aquí en lugar de JS si solo está ocultando el icono. All .hide()does está configurado display:noneen CSS, por lo que $(".ui-button-icon-only").hide();es funcionalmente equivalente a .ui-button-icon-only { display: none; }.
KyleMit
3

También puede eliminar su línea de encabezado:

<div data-role="header">...</div>

que elimina el botón de cerrar.

amarillo suave
fuente
2
document.querySelector('.ui-dialog-titlebar-close').style.display = 'none'
Matthew Wastrodowski
fuente
2

Manera fácil de lograr: (Haz esto en tu Javascript)

$("selector").dialog({
    autoOpen: false,
    open: function(event, ui) {   // It'll hide Close button
        $(".ui-dialog-titlebar-close", ui.dialog | ui).hide();
    },
    closeOnEscape: false,        // Do not close dialog on press Esc button
    show: {
        effect: "clip",
        duration: 500
    },
    hide: {
        effect: "blind",
        duration: 200
    },
    ....
});
Arsman Ahmad
fuente
1

Como descubrí que estaba haciendo esto en varios lugares de mi aplicación, lo envolví en un complemento:

(function ($) {
   $.fn.dialogNoClose = function () {
      return this.each(function () {
         // hide the close button and prevent ESC key from closing
         $(this).closest(".ui-dialog").find(".ui-dialog-titlebar-close").hide();
         $(this).dialog("option", "closeOnEscape", false);
      });
   };
})(jQuery)

Ejemplo de uso:

$("#dialog").dialog({ /* lots of options */ }).dialogNoClose();
bmode
fuente
0

Soy fanático de las frases sencillas (¡donde trabajan!). Esto es lo que funciona para mí:

$("#dialog").siblings(".ui-dialog-titlebar").find(".ui-dialog-titlebar-close").hide();
Wordragon
fuente
0

¿Qué tal usar esta línea CSS pura? Encuentro esta la solución más limpia para un diálogo con una ID dada:

.ui-dialog[aria-describedby="IdValueOfDialog"] .ui-dialog-titlebar-close { display: none; }
Chrisman
fuente
-1

Puede eliminar el botón de cierre con el código a continuación. También hay otras opciones con las que podría luchar útil.

$('#dialog-modal').dialog({
    //To hide the Close 'X' button
    "closeX": false,
    //To disable closing the pop up on escape
    "closeOnEscape": false,
    //To allow background scrolling
    "allowScrolling": true
    })
//To remove the whole title bar
.siblings('.ui-dialog-titlebar').remove();
bpjoshi
fuente