私のjQueryモバイルアプリは、単一の_index.html
_ページで構成され、起動時にリンクが設定された1つのページのみを含みます。
_<div data-role="page">
<div data-role="content">
<a id="startPageLink" href="startPage">start</a>
</div>
</div>
_
ユーザーが開始リンクをクリックしたときに、JSON APIからstartPage
のコンテンツを非同期でロードしたいと思います。コールバックで、JavaScriptを介してstartPage
に必要なすべてのDOM要素を作成し、それにコンテンツを追加します。このためのcreateStartPage(data)
メソッドを作成しました。
そのような動的に作成されたページを実装して_index.html#startPage
_を開くことも機能するようにする正しい方法は何ですか?カスタムの読み込み/ページ作成コードを含めるために$.mobile.changePage()
にフックする方法があるはずだと思いますが、何も見つかりませんでした。または、この問題のより良い解決策はありますか?
私はこれをいじり回す時間があり、動作する(テスト済み)ソリューションを見つけました。
注意事項:
ドキュメントサンプル
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" type="text/css" href="http://code.jquery.com/mobile/1.0a4.1/jquery.mobile-1.0a4.1.min.css"/>
<script type="text/javascript" charset="utf-8" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script>
<script>
$(document).ready(function() {
//check if hash exists and that it is not for the home screen
if (window.location.hash != '' && window.location.hash != '#page_0') {
//set whatever content you want to put into the new page
var content_string = 'Some ' + window.location.hash + ' text...<br><br><a href="#page_0">go to home screen</a>';
//append the new page onto the end of the body
$('#page_body').append('<div data-role="page" id="' + window.location.hash.replace('#','') + '"><div data-role="content">' + content_string + '</div></div>');
//add a link on the home screen to navaigate to the new page (just so nav isn't broken if user goes from new page to home screen)
$('#page_0 div[data-role="content"]').append('<br><br><a href="#' + window.location.hash.replace('#','') + '">go to ' + window.location.hash.replace('#','') + ' page</a>');
}
});
function create_page(page_id) {
//set whatever content you want to put into the new page
var string = 'FOO BAR page...<br><br><a href="#page_0">return to home screen</a>';
//append the new page onto the end of the body
$('#page_body').append('<div data-role="page" id="' + page_id + '"><div data-role="content">' + string + '</div></div>');
//initialize the new page
$.mobile.initializePage();
//navigate to the new page
$.mobile.changePage("#" + page_id, "pop", false, true);
//add a link on the home screen to navaigate to the new page (just so nav isn't broken if user goes from new page to home screen)
$('#page_0 div[data-role="content"]').append('<br><br><a href="#' + page_id + '">go to ' + page_id + ' page</a>');
//refresh the home screen so new link is given proper css
$('#page_0 div[data-role="content"]').page();
}
</script>
<title>Fixed Headers Example</title>
<script src="http://code.jquery.com/mobile/1.0a4.1/jquery.mobile-1.0a4.1.min.js"></script>
</head>
<body id="page_body">
<div data-role="page" id="page_0">
<div data-role="content">Some #page_0 text...<br><br><a href="javascript: create_page('foo_bar_page');">create new page</a></div>
</div>
</body>
</html>
私にはジャスパーの解決策は機能しませんが、私は見つけました this solution それはよりきれいに見え、うまく機能します
これが、コンテンツを私のJquery Mobile Webサイトに動的に追加するための私の方法です。
最初に、「ラッパー」data-role = page divを次のように作成します。
<div data-role="page" id="my_page_id">
<div data-role="content">
<script>
$('#my_page_id').live('pageshow', function() {
my_data_loading_function('my_page_id');
});
</script>
<div id="my_page_id-content"></div>
</div><!--/content-->
</div><!--/page-->
次に、外部ソースから「ラッパー」ページにあるdivタグにデータをロードします。
function my_data_loading_function(page) {
if ($('#' + page + '-content').is(':empty')) {
$.mobile.pageLoading();
$('#' + page + '-content').load("my_external_script.php", function() {
$.mobile.pageLoading(true);
$('#' + page + '-content ul').listview();
$('#' + page + '-content ul').page();
});
}
}
いくつかのメモ:
$ .mobile.pageLoading();および$ .mobile.pageLoading(true); Jquery Mobile読み込みスピナーを(それぞれ)表示および非表示にします。
if($( '#' + page + '-content')。is( ':empty')){により、ユーザーは動的に作成されたページから移動して戻ってきて、データを再度読み込む必要がなくなります。ページ全体が更新されます。
私の動的に作成されたページにはほとんどリストが含まれていたので、listview()はjqueryモバイルフレームワークに選択されたリストを更新させて適切なcssを追加し、page()は他のページ要素にも同じことを行います。ただし、コンテンツに応じてどちらか一方のみを使用する必要がある場合があります(プレーンテキストの場合はまったく使用しません)。
「ラッパー」ページはすでにハードコーディングされているため、これはページ全体を動的に作成するのではないことに気づきますが、新しいページ全体を追加したい場合は、おそらく次のようなものを使用できます:(unested)
$(document).append('<div data-role="page" id="my_page_id"><div data-role="content">FOO BAR</div></div>');
$('#my_page_id').page();
すべてを動的に作成したい場合は、window.location.hashを確認し、idをwindow.location.hashとして設定してdata-role = page divを作成できます。
また、私はJquery 1.6とJquery Mobile 1.0a4.1を使用しています
私はそこに何かがそこにいる誰かを助けることができることを願っています:)
Jqueryのajax loadメソッドを見たことはありますか?必要なページをロードして、リクエストが返されるたびに本文を置き換えるようにするだけのようです。
このJSFiddleの例では、FlickrからAPI呼び出しを取得し、jquery tmplエンジンを介して結果を実行して、新しいページをドキュメントに追加し、新しく挿入されたページに$ .mobile.changePage()を呼び出します。 jquery tmpl + apis + jquery mobileの組み合わせがいかに便利かわかると思います。