2013-07-11 89 views
0

我正在使用jQuery Mobile 1.3.1和Ajax構建照片庫頁面以從JSON格式的PHP服務器中檢索照片。當我第一次導航到該頁面時,#album_loader div顯示在#album_message div中沒有​​任何內容(是,本地存儲變量已填充)。根據我的代碼,#album_mesage div應該包含內容,並且#album_loader div只應在發送Ajax請求時顯示。我知道jQM有一些棘手的方法,每次瀏覽頁面時都會渲染,但這種方法適用於其他頁面。有任何想法嗎?下面是我的代碼:jQuery Mobile頁面呈現不正確,除非刷新

<!DOCTYPE html> 
<html> 
<head> 
    <meta charset="utf-8"> 
    <meta name="viewport" content="width=device-width, initial-scale=1"> 
    <title>Wedding</title> 
    <link href="css/jquery-mobile.css" rel="stylesheet" /> 
    <link href="css/application.css" rel="stylesheet" /> 
    <script src="js/jquery.js"></script> 
    <script src="js/global.js"></script> 
    <script src="js/jquery-mobile.js"></script> 
    <script src="phonegap.js"></script> 
    <script src="js/connection.js"></script> 
</head> 
<body> 
    <div data-role="page" id="album"> 
     <div id="header" data-role="header"><p align="center">Wedding</p></div> 
     <div id="content" data-role="content"> 
      <div id="album_message" class="message" style="margin-bottom:20px;"></div> 
      <div id="album_loader" class="message"><p align="center"><strong>Please Wait, Loading Album Data...</strong><br /><img src="images/loading.gif" /></p></div> 
      <div id="album_photos"></div> 
     </div> 
     <div id="footer" data-role="footer" data-position="fixed"> 
      <nav data-role="navbar"> 
       <ul> 
        <li><a href="index.html" data-icon="home">Home</a></li> 
        <li><a href="instructions.html" data-icon="info">Instructions</a></li> 
       </ul> 
      </nav> 
     </div> 
    </div> 
    <script scr="js/fancybox.js"></script> 
    <script> 
    $(document).on('pagebeforeshow', '#album', function() { 
     $('#album_loader').hide(); 
     var album_id = localStorage.getItem('album_id'); 
     var album_title = localStorage.getItem('album_title'); 
     var album_bride = localStorage.getItem('album_bride'); 
     var album_groom = localStorage.getItem('album_groom'); 
     var album_user = localStorage.getItem('album_user'); 
     $('#album_message').html('<p align="center"><strong>Album:</strong> ' + album_title + ' <br /><strong>By:</strong> ' + album_bride + ' & ' + album_groom + '</p>'); 
     $.ajax({ 
      url: server_url + "get-photos", 
      type: "post", 
      data: 'album_id=' + album_id, 
      dataType: 'json', 
      crossDomain: true, 
      beforeSend : function(){ 
       $('#album_loader').show(); 
      }, 
      error: function() { 
       $("#album_loader").hide(); 
       $('#album_message').removeClass("message").html('<p align="center">Server communication error while trying to retrieve album photos.</p>').addClass("errorm"); 
      }, 
      success: function(data) { 
       $("#album_loader").hide(); 
       if (data.response === "true") { 
        $("#album_photos").append('<div id="grid" class="ui-grid-b"></div>'); 
        var photos = data.photos.length; 
        $.each(data.photos, function(i, object) { 
          $("#grid").append('<div class="ui-block-b"><img src="' + photo_url + album_user + '/thumbnail/' + object.photo_thumbnail + '" class="img-border" /></div>'); 
        }); 
       } else { 
        $('#album_message').removeClass("message").html('<p align="center">Error retrieving photos.</p>').addClass("errorm"); 
       } 
      } 
     }); 
    }); 
    </script> 
</body> 
</html> 

而且,刷新圖像也終於露出後,當我瀏覽離開該頁面,然後返回到它的圖像顯示的兩倍。這是爲什麼?是因爲我追加到div嗎?我將如何解決這個問題?

+0

對於重複的圖像,使用'$( '#album_photos')空();'插入新的圖像前。嘗試'pageshow'來檢查它們是否可見而不刷新。 – Omar

+0

。empty()修正了追加的問題,我將pagebeforeshow切換到了頁面展示,但我仍然得到相同的行爲。當我第一次進入頁面時,#album_message div是空的,並顯示#album_loader div。 – WebDev84

+0

嗯,嘗試'$('[數據角色=內容]')。觸發('pagecreate')'或'updatelayout',一旦你完成插入照片。 – Omar

回答

0

經過一番仔細的檢查後,我發現我的代碼沒有執行的原因是因爲我在身體標記之外有JS。這是我的網頁的工作版本。

<!DOCTYPE html> 
<html> 
<head> 
<meta charset="utf-8"> 
<meta name="viewport" content="width=device-width, initial-scale=1"> 
<title>Wedding</title> 
<link href="css/jquery-mobile.css" rel="stylesheet" /> 
<link href="css/application.css" rel="stylesheet" /> 
     <link href="css/fancybox.css" rel="stylesheet" /> 
<script src="js/jquery.js"></script> 
<script src="js/global.js"></script> 
<script src="js/jquery-mobile.js"></script> 
<script src="phonegap.js"></script> 
<script src="js/connection.js"></script> 
</head> 
<body> 
<div data-role="page" id="album"> 
<div id="header" data-role="header"><p align="center">Wedding</p></div> 
<div id="content" data-role="content"> 
<div id="album_message" class="message" style="margin-bottom:20px;"></div> 
<div id="album_loader" class="message"> 
<p align="center"> 
<strong>Please Wait, Loading Photos...</strong><br /><img src="images/loading.gif" /> 
</p> 
</div> 
<div id="album_photos"></div> 
</div> 
<div id="footer" data-role="footer" data-position="fixed"> 
<nav data-role="navbar"> 
<ul> 
<li><a href="index.html" data-icon="home">Home</a></li> 
<li><a href="instructions.html" data-icon="info">Instructions</a></li> 
</ul> 
</nav> 
</div> 
<script> 
$(document).on('pagebeforeshow', '#album', function() { 
var album_id = localStorage.getItem('album_id'); 
var album_title = localStorage.getItem('album_title'); 
var album_bride = localStorage.getItem('album_bride'); 
var album_groom = localStorage.getItem('album_groom'); 
var album_user = localStorage.getItem('album_user'); 
$('#album_message').html('<p align="center"><strong>Album:</strong> ' + album_title + ' <br /><strong>By:</strong> ' + album_bride + ' & ' + album_groom + '</p>'); 
$.ajax({ 
url: server_url + "get-photos", 
type: "post", 
data: 'album_id=' + album_id, 
dataType: 'json', 
crossDomain: true, 
beforeSend : function(){ 
       $('#album_loader').show(); 
      }, 
error: function() { 
$("#album_loader").hide(); 
$('#album_message').removeClass("message").html('<p align="center">Server communication error while trying to retrieve album photos.</p>').addClass("errorm"); 
}, 
success: function(data) { 
$("#album_loader").hide(); 
if (data.response === "true") { 
$('#album_photos').empty(); 
$("#album_photos").append('<div id="grid" class="ui-grid-a"></div>'); 
var html = ''; 
for (i = 0; i < data.photos.length; i++) { 
html += '<div class="ui-block-b"><a class="fancybox" rel="gallery" href="' + photo_url + album_user + '/resized/' + data.photos[i].photo_resized + '"><img src="' + photo_url + album_user + '/thumbnail/' + data.photos[i].photo_thumbnail + '" class="img-border" /></a></div>'; 
} 
$("#grid").append(html); 
$('#album_photos').trigger('create'); 
} else { 
$('#album_message').removeClass("message").html('<p align="center">Error retrieving photos.</p>').addClass("errorm"); 
} 
} 
}); 
}); 
</script> 
    <script src="js/fancybox.js"></script> 
      <script> 
$('.fancybox').fancybox({ 

}); 
</script> 
</div> 
</body> 
</html> 
0

(鍵盤發瘋了,但我真的很想幫忙,不要注意大寫字母)。

我以前有同樣的問題。這些元素在頁面初始化或加載時不會被初始化。

但是你可以使用jQuery解決方案。

$("your element holder selector here").Trigger ("create"); 

請注意,當我在不同頁面的元素上使用它兩次時,出現了一個jq手機錯誤。

有一個jQuery Mobile的方法,但其名單,我沒有得到它的正常工作,在動態創建的HTML元素:

$('your element holder selector here').Listview('refresh'); 

只pageinit出於某種原因工作。

欲瞭解更多信息搜索在移動JQ創建動態對象,有也http://jsfiddle.Net/elenj/101/

爲例另外,如果你不蠻力彎曲和剎車的東西。

您可以隨時添加類和JQ移動對自己的span元素。

也許創建一個像這樣的修復功能並將其添加爲插件?

哦,對於「爲什麼要這麼做」,您可以在jq mobile在init中添加元素之後動態地將元素添加到頁面中,並在分頁加載時添加所有類和範圍。

你所做的是在此之後添加它,並希望他們有一個功能,每毫秒更新所有元素。

他們有一個func處理刷新列表,正如我之前所說的。試試我的解決方案,如果它不工作,找不到另一種解決方案。

+0

這沒有奏效。我試着把$(#album_photos).trigger('create');在$ .each循環之後,它做了同樣的事情。 – WebDev84

+0

如果你做到這一點,它就會工作,它會在下一條線上創造它。 加上我添加了一些JSFIDDLE鏈接把它們移出去,即使是一個敏捷的例子,它更好地有一些解決方案,但沒有。 – rolen

+0

呃,仍然沒有工作。 – WebDev84