4

我在将 jQuery Mobile 弹出窗口居中时遇到了一个令人困惑的问题。当我第一次单击它时,它没有居中并出现在我页面的角落。关闭并再次打开后,它突然居中。

这是我的代码:

$(document).on("pageshow",function(){
  $('.image_link').on('click', function(event){
    var id = $(this).children('img').attr("id");
    $("#show_image_img").attr("src",sPath + "/view/images/" + id);
    $("#show_image").popup('open');
    $("#show_image" ).popup({ positionTo: "window" });
  });
});

这是我的html代码

<div data-role="popup" id="show_image" data-theme="c" class="ui-corner-all">
  <div style="padding:20px 30px;">
    <img id="show_image_img" src="" />
  </div>
</div>

有人知道如何解决这个问题吗?我已经尝试了各种事情,比如将pageshow事件更改为 apagebeforeshow等等。

4

5 回答 5

8

我相信在图像完全下载之前第一次单击弹出窗口正在加载,因此它不知道用于定位的大小。因此,左上角居中。

如果您提前知道图像大小,您可以通过 CSS 在弹出窗口中预先设置 IMG 标签的大小

如果页面上没有太多图像,可以尝试预加载它们

您还可以在弹出窗口中添加一个小的 setTimeout 延迟,以完成图像下载:

$(document).on("pageshow", function () {
    $('.image_link').on('click', function (event) {
        $("#show_image_img").attr("src", "http://www.aai.ee/planets/nineplanets/gif/SmallWorlds.jpg");

        setTimeout(OpenPopup, 50);
    });
});

function OpenPopup(){
    $("#show_image").popup({ positionTo: "window" }).popup('open');
}
于 2014-01-23T15:24:20.113 回答
7

您可以在加载图像后重新定位弹出窗口:

$(document).on("pageshow", function () {
    $('.image_link').on('click', function (event) {
        var $img=$("#show_image_img").attr("src", "http://www.thinkstockphotos.com/CMS/StaticContent/WhyThinkstockImages/Best_Images.jpg");
        var $popup=$("#show_image").popup("open", {
            "positionTo": "window"
        });
        $img.one('load',function(){
            $popup.popup("reposition", {
                "positionTo": "window"
            });
        });
    });
});

编辑:在弹出窗口打开时添加了 positionto 窗口,因为如果未加载图像(例如死链接),则弹出窗口未居中。

于 2014-01-23T17:25:13.703 回答
1

更新

打开弹出窗口后正在加载图像,导致错误计算弹出窗口的尺寸。

要解决此问题,请在事件上重新定位弹出窗口。popupafteropen

$("#show_image")
    .popup("open")
    .on("popupafteropen", function () {
    $(this)
        .popup("reposition", {
        "positionTo": "window"
    });
});

positionTo在打开弹出窗口后进行更新,您应该在之前进行更新,或者将其作为open.

$("#show_image")
    .popup('open', {
    positionTo: "window"
});

演示

于 2014-01-23T10:25:38.807 回答
0

我认为超时也不是永久解决方案。因为您不确定加载数据需要多长时间。我认为如果它是一个图像加载,那么可能给出图像高度会更好。如果数据来自 ajax 调用,那么最好的办法是在将数据填充到弹出 div 之后,在 ajax 成功案例中打开弹出窗口。这就是我的情况。

于 2014-10-24T22:39:22.320 回答
0

在您的 $(document).ready 函数中等到弹出窗口上的“afteropen”,然后重新定位弹出窗口。还要注意“公差”。我将其设置为“0,0,0,0”,这将让您在 iPhone 4 上填充整个屏幕,而弹出窗口周围没有任何边框 - 如果您的弹出窗口需要填充整个屏幕:

$(document).ready(function()
{
  // Init the jqm popup
  $("#popup_modal").popup({
              positionTo: "window", history: false, tolerance: "0,0,0,0"});

  // Wait until the popup finishes opening and reposition it
  $("#popup_modal").popup({
              afteropen: function (event, ui)
              {
                  $('#popup_modal').popup('reposition', 'positionTo: window');
              }
 });

 // Show the popup initially
 $("popup_modal").popup('open');
});
于 2015-12-11T19:03:39.813 回答