Запуск функции после загрузки диалогового окна jQuery

Это может быть простой вопрос, но я не могу заставить его работать. Я использую диалог jQuery для отображения формы, загруженной с другой страницы на моем веб-сайте. Пользователь нажимает на ссылку, которая запускает диалоговое окно. Что я пытаюсь сделать, это запустить функцию после загрузки HTML в диалоговом окне. Вот мой код для загрузки диалога:

$(document).ready(function () {
    $(".openDialog").live("click", function (e) {
        e.preventDefault();

        $("#dialogBox").dialog({
            title: $(this).attr("data-dialog-title"),
            close: function() { $(this).remove() },
            modal: true
        })
        .load(this.href);
    });

    $(".close").live("click", function (e) {
        e.preventDefault();
        $(this).closest(".dialog").dialog("close");
    });
});

у меня есть функция myFunction (), которую я хочу вызвать, когда HTML будет загружен в диалоговое окно. Осмотревшись вокруг, я попробовал: с указанием функции .загрузить, вот так:

.load(this.href, myFunction());

Я также попытался использовать событие open, например:

open: myFunction(),

что я делаю не так?

5 ответов


Решение #1:

.load(this.href, myFunction);

решение #2:

.load(this.href, function(){
  myFunction();
});

решение #3 (желаемый):

open: myFunction,

решение № 4:

open: function(){
  myFunction();
}

почему это?

var foo = myFunction(); // `foo` becomes your function return value
var bar  = myFunction; // `bar` becomes your function
bar();

ваш код должен выглядеть так:

$("#dialogBox").load('http://example.com').dialog({
  title: $(this).attr("data-dialog-title"),
  close: function() { $(this).remove() },
  modal: true,
  open : myFunction // this should work...
})

ни одно из решений работал для меня. Я думаю, это потому, что open обратного вызова не вызывается, когда диалог завершен открытый. Мне пришлось использовать setTimeout чтобы заставить его работать.

$('#dialogBox').dialog('open');

setTimeout(function(){
    // myFunction();
},100);

это, очевидно, зависит от того, что находится внутри myFunction.


для jQuery UI-v1.11.4, "complete" в фрагменте кода ниже больше не работает:

show: {
    effect: 'clip',
    complete: function() {
        console.log('done');
    }
},

решение, которое работает для jQuery UI-v1.11.4. :

как прикрепить обратный вызов к эффекту jquery в диалоговом окне?

Как было предложено losnir, используйте $(this).родитель.)(обещать.)(сделано:

$("#dialog").dialog({
show: {
    effect: "drop",
    direction: "up",
    duration: 1000
},
hide: {
    effect: "drop",
    direction: "down",
    duration: 1000
},
open: function () {
    $(this).parent().promise().done(function () {
        console.log("[#Dialog] Opened");
    });
},
close: function () {
    $(this).parent().promise().done(function () {
        console.log("[#Dialog] Closed");
    });
}
});

надеюсь, что это помогает.


У меня была проблема, когда я загрузил внешнюю страницу, и я также хотел запустить функцию на загруженной странице. По-видимому, использование open: не работает в методе dialog.

jQuery("#pop-sav").load('/external/page', my_function_name );

jQuery("#pop-sav").dialog({
      resizable: false,
      width:'90%',
      autoReposition: true,
      center: true,
      position: 'top',
      dialogClass: 'pop-dialog pop-sort'
});

на my_function_name должно быть без скобок и только имя самой функции, чтобы заставить ее работать. Я не совсем уверен, как это работает, но если вы это выясните, дайте мне знать в комментариях.


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

Кликните здесь для документации