0

jQuery Mobile 1.3.1 と Ajax を使用してフォト ギャラリー ページを作成し、PHP サーバーから JSON 形式で写真を取得しています。初めてページに移動すると、#album_loader div が表示され、#album_message div には何も表示されません (はい、ローカル ストレージ変数が入力されます)。私のコードによると、 #album_mesage div にはコンテンツが含まれている必要があり、 #album_loader div は Ajax リクエストが送信されたときにのみ表示されるはずです。jQM には、ページが表示されるたびに何かをレンダリングするためのトリッキーな方法があることは知っていますが、これと同じアプローチが私の他のページでも機能しています。何か案は?以下は私のコードです:

<!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>

また、画像を更新した後、最終的に画像が表示され、ページから離れてからページに戻ると、画像が2回表示されます。何故ですか?divに追加しているためですか?どうすればそれを回避できますか?

4

2 に答える 2

0

綿密な調査の結果、コードが実行されなかった理由は、body タグの外側に 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>
于 2013-07-31T19:03:31.177 に答える
0

(キーボードがおかしくなりましたが、私は本当に助けたいです。大文字に気付かないでください)。

少し前に同じ問題がありました。要素は、ページの初期化または読み込み時に初期化されません。

ただし、jQuery ソリューションを使用できます。

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

異なるページの要素で 2 回使用すると jq mobile のバグが発生したことに注意してください。

jQuery モバイル メソッドがありましたが、それは for リストであり、動的に作成された html 要素で正しく動作しませんでした:

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

何らかの理由で pageinit でのみ機能します。

jq モバイルで動的オブジェクトを作成するための詳細検索については、http://jsfiddle.Net/elenj/101/ にも例があります

または、力ずくで物を曲げたりブレーキをかけたりしない場合。

jq mobile の class 要素と span 要素はいつでも独自に追加できます。

たぶん、そのような修正関数を作成して、プラグインとして追加しますか?

ああ、「なぜそれが起こるのか」については、jq mobileが初期化で魔法をかけた後に要素をページに動的に追加し、ページがロードされたときにすべてのクラスとスパンを追加します。

あなたがしたことは、その後にそれを追加することであり、ミリ秒ごとにすべての要素を更新する機能があることを望んでいました.

前に言ったように、更新リストを処理する機能があります。両方の解決策を試してみて、うまくいかない場合は別の解決策を見つけてください。

于 2013-07-11T23:15:20.720 に答える