2011-10-28 12 views
11

Tıklanan jQuery UI Dialogunun (x) kapama düğmesini algılayabilmeyi, ancak dialogclose/dialogbeforeclose olaylarını kullanmak istemediğimi (bunların iletişim kutusundan bağımsız olarak bunların çalışacağına inanıyorum) kapatıldı).Bir jQuery UI İletişim kutusunun (X) kapat düğmesinin, dialogclose/dialogbeforeclose olaylarından ayrı olarak tıklandığını nasıl anlayabilirim?

$(".ui-dialog-titlebar-close").live("click")'u denedim, ancak bu işe yaramıyor.

Bunu nasıl yapabilirim?

Örnek kod: (diyalog kapatıldığında hata ayıklayıcı tetiklenmez).

<!DOCTYPE html> 
<html> 
<head> 
    <link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css" rel="stylesheet" type="text/css"/> 
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.js"></script> 
    <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.js"></script> 

    <script> 
    $(document).ready(function() { 
    $("#dialog").dialog(); 

    $(".ui-dialog-titlebar-close").live("click", function() { 
     debugger; // ** clicking the close button doesn't get to here.** 
     }); 
    }); 
    </script> 
</head> 

<div id="dialog" title="Dialog Title">I'm in a dialog</div> 

</body> 
</html> 
+0

istediğim bu için mükemmel senin işlevselliğini –

cevap

21

Eğer JAAulde önerdi tam olarak ne yapmak ya da bağlama izleme kaçınarak ve create olay kullanabilirsiniz: Bu eski bir soru olacak ve

$(document).ready(function() { 
    $('#dialog').dialog({ 
     create: function() { 
      $(this).closest('div.ui-dialog') 
        .find('.ui-dialog-titlebar-close') 
        .click(function(e) { 
         alert('hi'); 
         e.preventDefault(); 
        }); 
     } 
    }); 
}); 
+0

Ah, eski sürüme hala yararlı bilgiler vermedi görmedim. +1 ve benim için kabul edilmiş bir cevap almalısın! Sadece merak – JAAulde

+0

, sen '$ (" ui-iletişim-başlık çubuğu-close "). (" Click") canlı niçin bir fikrin var mı' ateş etmiyor? sevmeye olayı değiştirdiyse, ateş yapar 'Bu konuda tamamen emin değilim ama' live' o Widget zaten bu eleman üzerinde yürütme değil kabarcık kadar tetikler gelmez çünkü click' 'durumunda, DOM kökünde bağlanan – Quincy

+0

mouseover' ve zincir devam edilmez, (iletişim kutusunu kapatmak için) ben UI ile bağlı tıklama işleyicisi şüpheli nedeni –

2

Gerçekten iyi bir soru

Tıklamanın

$(".ui-dialog-titlebar-close").click(function() { 
     debugger; 
     }); 

kullanmak Ama canlı bir nedeni olduğuna eminim eğer çalışıyor?

Ben

çalışmaya devam ederiz Ve neden bu kullanmak istemiyor musunuz? Oluşturduğunuz her iletişim kutusunun X'e bağlanması bitireceğiz olarak

$('.selector').bind('dialogclose', function(event, ui) { 
    debugger; 
}); 
+0

bağlamak için 'create' olayını kullanın. Teşekkürler! – hynsey

+0

GregM ile aynı fikirdeyim - neden bu sayfadaki tüm cevapların basit bir 'bağlanma' olduğunu benim için işe yarayan tek kişi bu değildi. Diyaloğumun dinamik olarak yaratıldığı gerçeğiyle ilgisi olabilir. Sadece 'yerine create' olayını kullanmak, bağlama izlemek için – TrueBlue

1

Sen .live vb ile bunu istemiyoruz. Sen okumaya devam etmeden önce, bu mükemmel çalışıyor ama aşırı karmaşık olduğuna dikkat

Not ... belirli bir amaç için belirli bir iletişim'ın X bağlamak istiyoruz, bu yüzden. Kris Ivanov daha doğru, daha özlü, daha uygun bir yanıt yayınladı. iletişim'ın açık yöntemde End Note

, zaten 'X' için tıklayın bağlı ettik olmadığını görmek için kontrol edin. Değilse, ve daha sonra da örneğinin 'X' bulmak ve bayrak bağlamak: Bu open çünkü çalışır iletişim her açtığında bağlı olup olmadığını için

$(function() 
{ 
    $('#dialog').dialog({ 
     open: function() //runs every time this dialog is opened 
     { 
      var $dialog = $(this); 

      if(! $dialog.data('titleCloseBound')) 
      { 
       $dialog 
        .data('titleCloseBound', true) //flag as already bound 
        .closest('div.ui-dialog') //traverse up to the outer dialog wrapper 
         .find('a.ui-dialog-titlebar-close') //search within it for the X 
          .bind('click', function(e) //bind it 
          { 
           alert('hi'); 
           e.preventDefault(); 
          }); 
      } 
     } 
    }); 
}); 

Çok birden rebind olur açar, onay istiyorum aynı işlevsellik olmadan tekrar tekrar.

Demo:http://jsfiddle.net/XM2FH/

+0

çok verimli değil' –

+0

@KrisIvanov open' lol, evet, cevabınıza yorumumu ve benim benim katma nota bakın. – JAAulde

+0

evet, orada tanıdığım bir 'create' benzeri yöntemi/olay olması gerekiyordu, ama bunu ararken rahatsız etmedi, bu sry, –

1

OP, daha önce kullanmak istemediğini söyledi, ama sebebi, her zaman X'ten başka şeyler için bile her zaman kovulduğu. Ancak, buradaki tekniklerin, bir iletişim kutusunun kapanmasını engellememe izin vermediğini fark ettim. teyit Kaydedilmemiş değişiklikler varsa açmak için m penceresi. Buradaki tekniklerse, önce kullanınKapat, istenilen sonucu elde edebiliriz, ancak bunu iptal edilebilir hale getirebiliriz.Ben kullandım:

beforeClose: function (e, ui) { 
    if ($(e.currentTarget).hasClass('ui-dialog-titlebar-close') && whateverMyConditionIs) 
     e.preventDefault(); 
} 

Başka birine yardımcı olabileceğini düşündüm! bağlama yaklaşımı -

İlgili konular