jquery ui Діалог: не вдається викликати методи діалогового вікна до ініціалізації


101

У мене додаток на jquery 1.5 з діалогами добре працював. У той час як у мене є багато живих обробників, я змінив це на .on. Для цього мені доведеться оновити jquery (зараз 1.8.3 jquerui 1.9.1).

Тепер я отримав: Error: cannot call methods on dialog prior to initialization; attempted to call method 'close'

Далі йде код:

Javascript

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

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

html-код

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

Будь-яка ідея, чому це може статися?

Відповіді:


136

Спробуйте це замість цього

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

Ви також можете зробити:

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

Це тому, що діалогове вікно зберігається не $('#divDialog')в новій діві, яка створюється на ходу і повертається .dialog(opt)функцією.


5
Це працювало для мене. Чи потрібно мені ініціалізувати діалогове вікно кожного разу, коли я хочу відкрити його так чи тільки в перший раз? існує багато діалогів. Чи немає способу встановити параметри ініціалізації, а потім відкрити діалогові вікна за допомогою кнопок?
core-chain.io

6
Я виявив, що це рішення також вирішило помилку "Неможливо викликати методи діалогу до ініціалізації; намагалася викликати помилку методу" відкрити ", яка виникає при успішному відкритті, закритті діалогового вікна, а потім користувачі намагаються відкрити діалог вдруге . Спасибі @ZOD
spadelives

Я дав вам +1, це також вирішило мою проблему, але ви можете пояснити, чому це працює?
Ігор Л.

2
@IgorLacik Я припускаю, що .dialog () повертає екземпляр себе, щоб ви могли виконувати ланцюжок. Тому .dialog (opt) .dialog ('open') створює об'єкт діалогу (перший виклик), а потім виконує на ньому "відкрити". Тоді я припускаю, що виклик $ (obj) .dialog (opt), а потім $ (obj) .dialog ('open') буде інстанціювати окремі об'єкти діалогу на об'єкт jquery, тому 2-й не отримує бачити перший параметри конфігурації. Не заглиблюючись далі у діалоговий код, важко сказати напевно, і у мене немає часу на це: D
nealio82

У мене є оновлення питання, щоб пояснити, що ви намагалися пояснити.
JotaBe

23

Якщо ви не можете оновити jQuery, і ви отримуєте:

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

Ви можете працювати навколо цього так:

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

Або якщо ви керуєте переглядом і не знаєте, що жоден інший діалог не повинен використовуватись на всій сторінці, ви можете:

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

Я б рекомендував це робити, лише якщо використання closestвикликає проблеми з продуктивністю. Вірогідні й інші способи обійти це питання, не роблячи глобального закриття у всіх діалогах.


10

Цю помилку я отримав, коли лише оновив бібліотеку jquery, не оновлюючи бібліотеку jqueryui паралельно. Я використовував jquery 1.8.3 з jqueryui 1.9.0. Однак, коли я оновив jquery 1.8.3 до 1.9.1, я отримав вищевказану помилку. Коли я прокоментував образливих.close рядки методів, які , то він видав помилку про те, що не знаходив.browserу бібліотеці jquery, яка була застаріла у jquery 1.8.3 та була видалена з jquery 1.9.1. Таким чином, бібліотека jquery 1.9.1 не була сумісною з бібліотекою jquery ui 1.9.0, незважаючи на сторінку завантаження jquery ui, кажучи, що вона працює з jquery 1.6+. По суті, існують неповідомлені помилки при спробі використання різних версій обох. Якщо ви використовуєте версію jquery, яка постачається в комплекті з завантаженням jqueryui, я впевнений, що ви будете в порядку, але коли ви почнете використовувати різні версії, ви вийдете з прокладеного шляху та отримаєте подібні помилки. Отже, підсумовуючи, ця помилка походить від невідповідних версій (у моєму випадку все одно).


4
Я вирішив цю проблему, також оновивши свою версію jquery ui до 1.9.2, а потім вона працювала. Отже, jquery 1.9.1 з jquery ui 1.9.2 позбавляється від помилки вище.
Johnt предприниматель

4

Отже, ви використовуєте це:

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

і якщо ви відкриєте частковий перегляд MVC у діалоговому вікні, ви можете створити в індексі приховану кнопку та натиснути подію JQUERY:

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

тоді всередині часткового перегляду html ви натискаєте кнопку тригера, як:

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

побачимось.


2

Якщо ви хочете негайно відкрити діалог , коли діалог не започатковано або сторінка буде готова, ви можете також встановити параметр , autoOpenщоб trueв опції об'єкта діалогу:

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

Таким чином, вам не потрібно викликати діалог `$ (" # divDialog "). (" Відкрити ");

Коли ініціалізується об'єкт діалогу, діалогове вікно відкривається автоматично.


2

Нова версія інтерфейсу jQuery не дозволить викликати методи інтерфейсу в діалоговому вікні, яке не ініціалізовано. Як вирішення, ви можете скористатися нижченаведеною перевіркою, щоб побачити, чи діалогове вікно активне.

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


0

Мені просто довелося додати на сторінку ScriptManager. Проблема вирішена.


0

У моєму випадку проблема полягала в тому, що я зателефонував $("#divDialog").removeData();у рамках скидання даних форм у діалоговому вікні.

Це призвело до того, що я стерв структуру даних з назвою, uiDialogщо означало, що діалогове вікно потрібно повторно ініціалізувати.

Я замінив .removeData()на більш конкретні делети і все почало працювати знову.


0

Мій випадок інший, він не вдається через сферу " цього ":

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

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

-1

Я отримав це повідомлення про помилку, оскільки в частковому перегляді замість батьківського перегляду був тег div


1
І що це означає саме?
AaA

1
Це погано пояснено, але справедливо. У MVC я мав містити тег div для діалогового вікна мого часткового перегляду. Коли я перемістив містить тег div на батьківську сторінку, діалогове вікно функціонувало належним чином.
Paulj
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.