jquery ui Dialog: başlatmadan önce iletişim kutusunda yöntemler çağırılamaz


102

Jquery 1.5 üzerinde diyaloglar iyi çalıştı. Birçok .live işleyicim varken, bunu .on olarak değiştirdim. Bunun için jquery'yi güncellemem gerekiyor (şimdi 1.8.3 ve jquerui 1.9.1).

Şimdi anladım: Error: cannot call methods on dialog prior to initialization; attempted to call method 'close'

Kod aşağıdadır:

Javascript

var opt = {
        autoOpen: false,
        modal: true,
        width: 550,
        height:650,
        title: 'Details'
};

$(document).ready(function() {
$("#divDialog").dialog(opt);
    $("#divDialog").dialog("open");
...    

HTML Kodu

<div id="divDialog">
<div id="divInDialog"></div>
</div>

Bunun neden olabileceğine dair bir fikriniz var mı?

Yanıtlar:


137

Onun yerine bunu dene

$(document).ready(function() {
  $("#divDialog").dialog(opt).dialog("open");
});

Şunları da yapabilirsiniz:

var theDialog = $("#divDialog").dialog(opt);
theDialog.dialog("open");

Bunun nedeni, iletişim kutusunun içinde değil $('#divDialog'), anında oluşturulan ve .dialog(opt)işlev tarafından döndürülen yeni bir div'de depolanmasıdır .


5
Bu benim için çalıştı. Bu şekilde mi yoksa sadece ilk seferde mi açmak istediğim her seferinde diyaloğu başlatmak zorunda mıyım? birçok diyalog var. İlk seçenekleri ayarlamanın ve ardından diyalogları düğmelerle açmanın bir yolu yok mu?
core-chain.io

6
Bu çözümün, bir iletişim kutusu başarıyla açıldığında, kapatıldığında ve ardından kullanıcılar iletişim kutusunu ikinci kez açmaya çalıştığında ortaya çıkan "başlatmadan önce iletişim kutusunda yöntemler çağrılamıyor; yöntem 'açık' olarak çağrılmaya çalışıldı" hatasını da çözdüğünü buldum. . Teşekkürler @ZOD
spadelives

Size +1 verdim, çünkü bu benim de sorunumu çözdü, ancak neden işe yaradığını açıklar mısınız?
Igor

2
@IgorLacik .dialog () 'un zincirleme gerçekleştirebilmeniz için kendisinin bir örneğini döndürdüğünü varsayıyorum. Bu nedenle .dialog (opt) .dialog ('open') bir diyalog nesnesini (ilk çağrı) somutlaştırır ve ardından üzerinde 'open' gerçekleştirir. Daha sonra $ (obj) .dialog (opt) ve ardından $ (obj) .dialog ('open') çağrısının jquery nesnesi üzerinde ayrı diyalog nesnelerini başlatacağını, böylece 2.'nin ilkini görmediğini varsayıyorum. yapılandırma seçenekleri. Diyalog kodunu daha fazla araştırmadan kesin olarak söylemek zor ve bunun için zamanım yok: D
nealio82

Açıklamaya çalıştığınız şeyi açıklamak için soruyu güncelledim.
JotaBe

23

JQuery'yi yükseltemiyorsanız ve alıyorsanız:

Uncaught Error: cannot call methods on dialog prior to initialization; attempted to call method 'close'

Bunun etrafında şu şekilde çalışabilirsiniz:

$(selector).closest('.ui-dialog-content').dialog('close');

Veya görünümü kontrol ediyorsanız ve tüm sayfada başka hiçbir iletişim kutusunun kullanılmaması gerektiğini biliyorsanız, şunları yapabilirsiniz:

$('.ui-dialog-content').dialog('close');

Bunu yalnızca kullanmak closestbir performans sorununa neden oluyorsa yapmanızı öneririm . Tüm diyaloglarda genel bir kapanış yapmadan bunun etrafında çalışmanın başka yolları da vardır.


10

Bu hatayı, jqueryui kitaplığını paralel olarak güncellemeden yalnızca jquery kitaplığını güncellediğimde aldım. Jqueryui 1.9.0 ile jquery 1.8.3 kullanıyordum. Ancak jquery 1.8.3'ü 1.9.1'e güncellediğimde yukarıdaki hatayı aldım. Sorunlu .closeyöntem satırlarını yorumladığımda , daha sonra bulamama konusunda bir hata verdi.browserjquery 1.8.3'te kullanımdan kaldırılan ve jquery 1.9.1'den kaldırılan jquery kitaplığında. Yani temelde, jquery 1.9.1 kitaplığı jquery ui 1.9.0 kitaplığı ile uyumlu değildi, ancak jquery ui indirme sayfası jquery 1.6+ ile çalıştığını söylüyordu. Esasen, ikisinin farklı sürümlerini kullanmaya çalışırken bildirilmemiş hatalar var. Jqueryui indirmesiyle birlikte gelen jquery sürümünü kullanırsanız, eminim iyi olacaksınız, ancak farklı sürümleri kullanmaya başladığınızda, alışılmış yoldan çıkıp bunun gibi hatalar alırsınız. Özetle, bu hata yanlış eşleşen sürümlerden (benim durumumda zaten).


4
Bu sorunu jquery ui sürümümü 1.9.2'ye yükselterek çözdüm ve sonra çalıştı. Dolayısıyla, jquery ui 1.9.2 ile jquery 1.9.1 yukarıdaki hatayı ortadan kaldırır.
johntrepreneur

4

Yani bunu kullanıyorsun:

var theDialog = $("#divDialog").dialog(opt);
theDialog.dialog("open");

ve Dialog'da bir MVC Kısmi Görünümü açarsanız, dizinde gizli bir düğme ve JQUERY tıklama olayı oluşturabilirsiniz:

$("#YourButton").click(function()
{
   theDialog.dialog("open");
   OR
   theDialog.dialog("close");
});

sonra kısmi görünüm html içinde düğme tetikleyicisini çağırırsınız gibi tıklayın:

$("#YouButton").trigger("click")

görüşürüz.


2

Diyalog başlatılır veya sayfa hazır olduğunda hemen Dialog açmak istiyorsanız, ayrıca parametreyi ayarlayabilirsiniz autoOpeniçin trueseçenekler iletişim kutusunun nesne içinde:

var opt = {
        autoOpen: true,
        modal: true,
        width: 550,
        height:650,
        title: 'Details'
};

Böylece, $ ("# divDialog"). Dialog ("open");

Diyalog nesnesi başlatıldığında, diyalog otomatik olarak açılır.


2

Yeni jQuery UI sürümü, başlatılmamış iletişim kutusunda UI yöntemlerini çağırmanıza izin vermeyecektir. Çözüm olarak, iletişim kutusunun canlı olup olmadığını görmek için aşağıdaki kontrolü kullanabilirsiniz.

if (modalDialogObj.hasClass('ui-dialog-content')) {
    // call UI methods like modalDialogObj.dialog('isOpen')
} else {
    // it is not initialized yet
}

0

Bu aynı zamanda etrafta bazı çalışmalardır:

$("div[aria-describedby='divDialog'] .ui-button.ui-widget.ui-state-default.ui-corner-all.ui-button-icon-only.ui-dialog-titlebar-close").click();

0

Sadece ScriptManager'ı sayfaya eklemem gerekiyordu. Sorun çözüldü.


0

Benim durumumda sorun aramış olmamdı $("#divDialog").removeData(); iletişim kutusundaki form verilerimi sıfırlamanın bir parçası olarak aramamdı.

Bu uiDialog, iletişim kutusunun yeniden başlatılması gerektiği anlamına gelen adlı bir veri yapısını silmeme neden oldu.

.removeData()Daha spesifik silmelerle değiştirdim ve her şey yeniden çalışmaya başladı.


0

Benim durumum farklı, ' bu ' kapsamından dolayı başarısız oluyor :

//this fails:
$("#My-Dialog").dialog({
  ...
  close: ()=>{
    $(this).dialog("close");
  }
});

//this works:
$("#My-Dialog").dialog({
  ...
  close: function(){
    $(this).dialog("close");
  }
});

-1

Bu hata mesajını aldım çünkü div etiketi üst görünüm yerine kısmi görünümde vardı


1
Ve bu tam olarak ne anlama geliyor?
AaA

1
Bu yeterince açıklanmadı, ancak geçerli. MVC'de, kısmi görünümümde diyalog için içeren div etiketi vardı. İçeren div etiketini üst sayfaya taşıdığımda, iletişim kutusu düzgün çalıştı.
Paulj
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.