【问题标题】:Magnific popup closes on content click after replacing content替换内容后,点击内容会关闭大型弹出窗口
【发布时间】:2013-06-22 12:17:26
【问题描述】:

我正在使用 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,但在替换内容后单击内容时弹出窗口会立即关闭(第一次确实有效)。

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

希望作者或其他人能在这里帮忙,我不知道这里出了什么问题。

非常感谢!

【问题讨论】:

    标签: javascript jquery ajax magnific-popup


    【解决方案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();
            }
        });
    });
    

    【讨论】:

      【解决方案2】:

      您需要为popup 对象调用HandleItemFormSubmit

      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);
      }
      

      【讨论】:

      • 谢谢西蒙。同时,我发现我在回调列表中有 closeOnContentClick: false ,所以我把它移到了正确的位置,作为一个选项。但这并没有帮助。只有当我添加 closeOnBgClick: false 时它才有效。但是在第二次提交后“这个”将不起作用,所以仍然需要你的建议。你能指出我应该在哪里使用它吗...?
      猜你喜欢
      • 1970-01-01
      • 2021-09-21
      • 1970-01-01
      • 2010-12-01
      • 2018-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-24
      相关资源
      最近更新 更多