更换内容后,Magnific弹出窗口会在内容点击时关闭

时间:2013-06-22 12:17:27

标签: javascript jquery ajax magnific-popup

我正在使用 Magnific Popup版本0.8.9。

我通过Ajax将内容加载到其中,并使用ajaxContentAdded的回调。此回调设置一个事件处理程序,用于提交已加载到弹出窗口中的表单,如下所示:

$('.add-item-btn').magnificPopup({ 
    type: 'ajax',
    closeOnContentClick: false,
    callbacks: {
        ajaxContentAdded: HandleItemFormSubmit
    }
});

这很好,表单提交正确处理。事件处理函数将其发布到服务器,该服务器(如果有错误)返回整个表单,包括错误消息。 为此,我让它用返回的表单替换弹出窗口的内容,并再次设置提交处理程序。

function HandleItemFormSubmit()
{
    var popup = this;
    // Submit form using ajax
    $('form.item-form').submit(function()
    {
        var data = $(this).serialize();
        var url = $(this).attr('action');

        $.post(url, data, function(resp)
        {
            if (resp == 'OK')
            {
                // All good, close up
                popup.close();  
            }
            else
            {
                // Show HTML from response (with errors)
                popup.closeOnContentClick = false;
                popup.content.replaceWith(resp);
                popup.updateItemHTML();
                HandleItemFormSubmit();
            }
        });

        return false;
    });
}

但是,尽管在两个不同的点将closeOnContentClick设置为false,但在替换内容后点击内容时弹出窗口会立即关闭(它确实是第一次运行)。

顺便说一下,弹出窗口中的内容只有一个根元素。

我希望作者或其他人可以在这里提供帮助,我不知道这里有什么问题。

非常感谢!

2 个答案:

答案 0 :(得分:1)

我找到了另一个解决方案:

$('html').on('submit', '#UR_FORM', function(e) {
    e.preventDefault();
    $.ajax({
        data: $(this).serialize(),
        type: $(this).attr('method'),
        url: $(this).attr('action'),
        success: function(response) {
            var magnificPopup = $.magnificPopup.instance;
            magnificPopup.items[0].type = "inline";
            magnificPopup.items[0].src = response;
            magnificPopup.updateItemHTML();
        }
    });
});

答案 1 :(得分:0)

您需要为HandleItemFormSubmit对象调用popup

HandleItemFormSubmit.call(popup);

否则,当您按照HandleItemFormSubmit();的方式调用时,this将设置为window,这将无法按预期工作。

更新

else 子句中使用它:

if (resp == 'OK')
{
    popup.close();  
}
else
{
    // Show HTML from response (with errors)
    popup.closeOnContentClick = false;
    popup.content.replaceWith(resp);
    popup.updateItemHTML();
    HandleItemFormSubmit.call(popup);
}