Ошибка JQuery: не может вызывать методы в диалоге до инициализации; попытался вызвать метод "закрыть" - программирование
Подтвердить что ты не робот

Ошибка JQuery: не может вызывать методы в диалоге до инициализации; попытался вызвать метод "закрыть"

Я неожиданно получаю эту ошибку от jQuery:

Ошибка: невозможно вызвать методы в диалоговом окне до инициализации; попытался вызвать метод "закрыть"

Плагины

 <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
 <script src="http://code.jquery.com/ui/1.9.1/jquery-ui.js"></script> 

Код jQuery

Я получаю эти сообщения в следующей функции:

$(document).ready(function() {
  if ($('#results').html().length != 0) {
    alert('has information');

    $('#dialog').dialog({
      modal: true,
      buttons: {
        Ok: function() {
          // If I use $(this).dialog($(this)).dialog('close'), the UI is displayed,
          // however I do not see the OK button and no errors 
          $(this).dialog('close');
        }
      }
    });
  } else {
    alert('has no data');
  }
});

HTML

<div id="dialog" title="Server Response">
  <p><span class="${icon}" style="float: left; margin: 0 7px 50px 0;"></span>
    <label id="results">${results}</label>
  </p>      
</div>
4b9b3361

Ответ 1

Похоже, что ваши кнопки не объявлены правильно (в соответствии с последней версией jQuery UI).

попробуйте следующее:

$( ".selector" ).dialog({ 
   buttons: [{ 
      text: "Ok", 
      click: function() { 
         $( this ).dialog( "close" ); 
      }
   }]
});

Ответ 2

У меня была аналогичная проблема при открытии диалога с частичной компоновкой в ​​asp.net MVC. Я загружал библиотеку jquery на частичной странице, а также на главную страницу, которая вызывала эту ошибку.

Ответ 3

Попробуйте это - это работает для меня:

$(".editDialog").on("click", function (e) {
    var url = $(this).attr('href');
    $("#dialog-edit").dialog({
        title: 'Edit Office',
        autoOpen: false,
        resizable: false,
        height: 450,
        width: 380,
        show: { effect: 'drop', direction: "up" },
        modal: true,
        draggable: true,
        open: function (event, ui) {
            $(this).load(url);
        },
        close: function (event, ui) {
            $("#dialog-edit").dialog().dialog('close');
        }
    });

    $("#dialog-edit").dialog('open');
    return false;
});

Надеюсь, это поможет вам.

Ответ 4

Является ли ваш $(this).dialog("close") случайным вызовом из-за обратного вызова "успех" Ajax? Если да, попробуйте добавить context: this в качестве одного из вариантов вашего вызова $.ajax(), например:

$("#dialog").dialog({
    modal: true,
    buttons: {
        Ok: function() {
            $.ajax({
                url: '/path/to/request/url',
                context: this,
                success: function(data)
                {
                    /* Calls involving $(this) will now reference 
                       your "#dialog" element. */
                    $(this).dialog( "close" );
                }
            });
        }
    }
});

Ответ 5

Я также получил ту же ошибку: не могу вызывать методы в диалоге до инициализации; попытался вызвать метод "закрыть"

что я сделал, я вызвал событие кнопки закрытия, которое находится в заголовке диалога как

это отлично работает для закрытия диалогового окна

function btnClose() {
$(".ui-dialog-titlebar-close").trigger('click');
}

Ответ 6

По какой-то причине пользовательский интерфейс jQuery попытается запустить весь код, определенный в кнопках во время определения. Это сумасшествие, но у меня была такая же проблема, и она остановилась, как только я сделал это изменение.

if ($(this).dialog.isOpen === true) { 
    $(this).dialog("close");
}

Ответ 7

Я получил ту же ошибку в 1.10.2. В моем случае я хотел сделать щелчок по фону наложения скрытым видимым в данный момент диалогом, независимо от того, на каком элементе он был основан. Поэтому я имел это:

$('body').on("click", ".ui-widget-overlay", function () {
    $(".ui-dialog").dialog('destroy');
});

Это работало, поэтому я думаю, что они должны были удалить поддержку в JQUI для вызова .dialog() во всплывающем окне в какой-то момент.

Мое обходное решение выглядит так:

$('body').on("click", ".ui-widget-overlay", function () {
    $('#' + $(".ui-dialog").attr('aria-describedby')).dialog('destroy');
});

Ответ 8

Я наткнулся на то же самое и хотел поделиться своим решением:

<script type="text/javascript">
    $( "#dialog-confirm" ).dialog("option","buttons",
                {
                    "delete": function() {
                        $.ajax({
                            url: "delete.php"
                        }).done(function(msg) {
                         //here "this" is the ajax object                                       
                            $(this).dialog( "close" );
                        });

                    },
                    "cancel": function() {
                        //here, "this" is correctly the dialog object
                        $(this).dialog( "close" );
                    }
                });
</script>

потому что "this" ссылается на объект без диалога, я получил упомянутую ошибку.

Решение:

<script type="text/javascript">
    var theDialog = $( "#dialog-confirm" ).dialog("option","buttons",
                {
                    "delete": function() {
                        $.ajax({
                            url: "delete.php"
                        }).done(function(msg) {
                            $(theDialog).dialog( "close" );
                        });

                    },
                    "cancel": function() {
                        $(this).dialog( "close" );
                    }
                });
</script>

Ответ 9

У меня была эта проблема раньше, когда одно диалоговое окно выдавало эту ошибку, а все остальные работали отлично. Ответ был потому, что у меня был другой элемент с тем же id="dialogBox" else ware на странице. Я нашел эту нить во время поиска, так что, надеюсь, это поможет кому-то еще.

Ответ 10

Итак, вы используете это:

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

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

и если вы откроете Partial View MVC в диалоге, вы можете создать в индексе скрытую кнопку и событие JQUERY click:

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

затем внутри частичного вида html вы вызываете кнопку триггера, например:

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

см. ya.

Ответ 11

Это произошло для меня, когда мой аякс заменил содержимое на странице и в итоге появился два элемента того же класса для диалога, что означало, что когда моя строка закрывает диалог, выполненный на основе селектора классов CSS, он обнаружил два элемента: один и второй никогда не были инициализированы.

$(".dialogClass").dialog("close"); //This line was expecting to find one element but found two where the second had not been initialised.

Для любого из ASP.NET MVC это произошло из-за того, что действие моего контроллера возвращало полный вид, включая страницу общего размещения, в которой был элемент, когда он должен был возвращать частичный вид, поскольку javascript заменял только основную область содержимого.

Ответ 12

У меня была аналогичная проблема, которую я разрешил, определяя мой массив кнопок вне объявления диалога.

var buttonArray = {};
buttonArray["Ok"] = function() { $( this ).dialog( "close" );}

Ваши варианты:

modal: true,
autoOpen: false,
buttons: buttonArray

Ответ 13

Через час я нашел лучший подход. мы должны сохранить результат диалога в переменной, после этого метод закрытия вызова переменной.

Вот так:

var dd= $("#divDialog")
.dialog({
   height: 600,
   width: 600,
   modal: true,
   draggable: false,
   resizable: false
});

// . . .

dd.dialog('close');

Ответ 14

Я получал это сообщение об ошибке при попытке закрыть диалоговое окно с помощью кнопки внутри тела диалога. Я пытался использовать $('#myDialog').dialog('close');, который не работал.

В результате я нажал кнопку "x" в заголовке, используя:

$('.modal-header:first').find('button:first').click();  

Ответ 15

Senguttuvan: ваше решение было единственным, что сработало для меня.

Функция btnClose() {
  $( "UI-диалог-Titlebar-близко." ) Триггер ('click').
}

Ответ 16

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

var dialog = $("#dummy-1");

    dialog.html('<div style="position:absolute; top:15px; left:0px; right:0px; bottom:0px; text-align:center;"><img align="middle" src="cargando.gif"></div>');
    dialog.html(mensaje);
    dialog.dialog(
    {
        title:'Ventana de Confirmacion',
        width:400, 
        height:200, 
        modal:true,
        resizable: false,
        draggable:false,
        position: { my: "center center", at: "center center", of: window },
        buttons:
        [
            {
                text: "Eliminar",
                click: function() {
                    functionCall(dialog,var1,var2);
                }
            },
            {
                text: "Cerrar",
                click: function() {
                    dialog.dialog("close");
                }
            }
        ],
        close: function(event, ui)
        {
            dialog.dialog("close").dialog("destroy").remove();
        }
    });

и диалог передается как параметр функции для выполнения действия:

    function functionCall(dialogFormulario,var1,var2)
{
    //same action 
        dialogFormulario.dialog("close");

}

Здесь нужно только использовать .dialog( "закрыть" ) и нет .dialog( "destroy" ), потому что диалог вызовет его функцию close: и элемент не будет существовать

Ответ 17

У меня была аналогичная проблема, и в моем случае проблема была другой (я использую шаблоны Django).

Порядок JS был другим (я знаю, что первое, что вы проверяете, но я почти уверен, что это не так, но это было). Js, вызывающий диалог, вызывается до того, как была вызвана библиотека jqueryUI.

Я использую Django, поэтому наследовал шаблон и использовал {{super.block}} для наследования кода из блока и шаблона. Мне пришлось переместить {{super.block}} в конце блока, который решил проблему. Js, вызывающий диалог, был объявлен в классе Media в Django admin.py. Я потратил больше часа, чтобы понять это. Надеюсь, это поможет кому-то.

Ответ 18

Создайте отдельную функцию JavaScript, которую можно вызывать, чтобы закрыть диалоговое окно с помощью определенного идентификатора объекта, и поместите функцию за пределы $(document).ready() следующим образом:

function closeDialogWindow() { 
$('#dialogWindow').dialog('close');
}

ПРИМЕЧАНИЕ. Функция должна быть объявлена вне $(document).ready() поэтому jQuery не пытается вызвать событие закрытия в диалоговом окне перед его созданием в DOM.

Ответ 19

Вы можете объявить содержимое кнопки вне диалога, это работает для меня.

var closeFunction = function() {
    $(#dialog).dialog( "close" );
};

$('#dialog').dialog({
    modal: true,
    buttons: {
        Ok: closeFunction
    }
});

Ответ 20

Я знаю, что это очень старая проблема, но у меня возникла та же проблема, когда при навигации по угловому маршруту и при открытом диалоговом окне оно оставалось открытым. Итак, я нашел способ вызвать метод close в деструкторе контроллера маршрута. Но получил эту вышеупомянутую ошибку, если диалог не был открыт. Так что ответ таков: если вы закрываете диалоговое окно перед инициализацией, это произойдет из-за этой ошибки. Чтобы проверить, открыто ли диалоговое окно, закройте его, обернув ваше состояние закрытия в этом состоянии.

if($('#mydialog').dialog('isOpen')) { //close dialog code}