10

私は index.html である page1 を持っています。自己完結型の Web サイトにはヘッダーとスクリプトが含まれています。このページには、クリックするとajax経由でpage2がロードされ、page2がpage1に挿入されるボタンがあります。Page2 は div data-role="page" とその中の html であり、自己完結型のページではありません。ただし、url が page2.html に変更され、ページを「更新」すると、page2 は完全なページではないため、完全なページが読み込まれず、page1 に挿入されるだけでした。

data-url="index.html&dashboard" (ダッシュボードはページ 2 のメイン ID です) を設定しようとしましたが、この場合、まだ index.html&dashboard であるため URL は正しく見えます。しかし今では、ユーザーがボタンをクリックした後にのみコンテンツが追加されたため、「ダッシュボード」が見つからないため、jquery はおかしくなり、ロード画面に永遠に座ったままになります。

これを回避するにはどうすればよいですか?

ありがとう。

page1 index.html

<!DOCTYPE HTML>
<html>
<head>
<title>title</title>
<script><script type="text/javascript" charset="utf-8" src="cordova-1.7.0.js"></script>
<script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
<script type="text/javascript" charset="utf-8" src="js/jquery.mobile.js"></script>
<script type="text/javascript" charset="utf-8" src="js/global.js"></script>
<script type="text/javascript" charset="utf-8" src="js/login.js"></script>

<link rel="stylesheet" type="text/css" href="css/jquery.mobile.css" />
<link rel="stylesheet" type="text/css" href="css/style.css" />

<script type="text/javascript" charset="utf-8" src="cordova-1.7.0.js"></script>
<script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
<script type="text/javascript" charset="utf-8" src="js/jquery.mobile.js"></script>
<script type="text/javascript" charset="utf-8" src="js/login.js"></script>

<link rel="stylesheet" type="text/css" href="css/jquery.mobile.css" />
<link rel="stylesheet" type="text/css" href="css/style.css" />

</head>
<body>
    <div data-role="page" data-theme="b">

        <div data-role="header" data-theme="b">
            <h1>Login</h1>
        </div>
        <!-- /header -->

        <div data-role="content">
            <div class="row">
                <label for="login_name">Login Name:</label> <input
                    class="ui-input-text" type="text" name="login_name" id="login_name" />
            </div>
            <div class="row">
                <label for="basic">Password:</label> <input class="ui-input-text"
                    type="password" name="password" id="password" />
            </div>
            <div class="row">
                <input type="checkbox" name="remember" id="remember" class="custom"
                    data-mini="true" /> <label for="remember">Remember Me</label>
            </div>
            <div class="row">
                <input type="submit" id="submit" name="submit" value="Submit" />
            </div>
        </div>
        <!-- /content -->

    </div>
    <!-- /page -->
</body>
</html>

page2 ダッシュボード.html

<div id="dashboard" data-role="page" data-theme="b" data-url="index.html&dashboard">

<div data-role="header" data-theme="b">
    <h1 id="page_title">Dashboard</h1>
</div>

login.js

$(function() {


$("#submit").click(function() {

    if ($("#login_name").val() == "") {
        alert("Please enter a login name");
        return false;
    }

    if ($("#password").val() == "") {
        alert("Please enter a password");
        return false;
    }

    $.post(URL + 'login', {
        'APIKEY' : APIKEY,
        'login' : $("#login_name").val(),
        'password' : $("#password").val()
    }, function(data) {
        if (data.error == "") {

            $.mobile.changePage("dashboard.html", { transition : "slide" });
        } else {
            alert(data.error);
        }

    }, "json");

});

});

4

1 に答える 1

7

短い答え

簡単に言うと、jQuery Mobileは、ハッシュを使用して単一ページの状態を表すことを想定しています。

  • /index.html-ページ1
  • /index.html#dashboard-ダッシュボード。

代わりに、JavaScriptを呼び出して、最初のページのコンテンツを動的に変更して2番目のページを表す必要があるときに、完全に新しいページをロードしています。

短い答えが理にかなっているなら、素晴らしいです!そうでない場合、長い答えは信じられないほど詳細であり、この問題に取り組むことができる2つの方法を説明しています。

長い答え

基本的に求めているのは、複数ページのモバイルWebサイトを構築し、リソースを識別するURIから両方のページにアクセスできるようにする方法です。

この問題に取り組むために使用できる2つの方法があります。

マルチページテンプレート:

jQuery mobileの場合、これはjQueryMobileマルチページテンプレートを使用して実現されます。

一般的な考え方は、次のように、両方のページが同じHTMLドキュメント内にあるということです。

<head>

</head>

<!-- This is your FIRST page -->
<div data-role="page" id="one">

    <div data-role="header">
        <h1>Multi-page</h1>
    </div><!-- /header -->

    <div data-role="content" >  
        <h2>One</h2>

        <p>I have an id of "one" on my page container. I'm first in the source order so I'm shown when the page loads.</p>  

        <h3>Show internal pages:</h3>
        <p><a href="#two" data-role="button">Show page "two"</a></p>    
        <p><a href="#popup"data-role="button" data-rel="dialog" data-transition="pop">Show page "popup" (as a dialog)</a></p>
    </div><!-- /content -->

    <div data-role="footer" data-theme="d">
        <h4>Page Footer</h4>
    </div><!-- /footer -->
</div><!-- /page one -->

<!-- This is your SECOND page -->
<!-- Start of second page: #two -->
<div data-role="page" id="two" data-theme="a">

    <div data-role="header">
        <h1>Two</h1>
    </div><!-- /header -->

    <div data-role="content" data-theme="a">    
        <h2>Two</h2>
        <p>I have an id of "two" on my page container. I'm the second page container in this multi-page template.</p>   
        <p>Notice that the theme is different for this page because we've added a few <code>data-theme</code> swatch assigments here to show off how flexible it is. You can add any content or widget to these pages, but we're keeping these simple.</p>  
        <p><a href="#one" data-direction="reverse" data-role="button" data-theme="b">Back to page "one"</a></p> 

    </div><!-- /content -->

    <div data-role="footer">
        <h4>Page Footer</h4>
    </div><!-- /footer -->
</div><!-- /page two -->

</body>

次に、jQuery Mobileが本質的に行うことは、CSSを使用してid = "two"でDIV要素を非表示にし、id="one"でdivのみを表示することです。ユーザーが`href="#two "のハイパーリンクをクリックすると、hashChangeイベントをインターセプトし、id =" one "でDIVを非表示にし、id="twoでDIVを表示するJavaScriptコードを起動するリスナーがあります。 "。

これにより、HTMLマークアップを取得するためにサーバーにアクセスする必要がなく、ページの遷移が非常にスムーズかつ高速に表示されます。

動的に感染したコンテンツ:

データがより動的である場合、別のオプションはjQuery Mobile DynamicPageInjectionを使用することです。このプロセスの一般的な前提は、ブラウザがhashChangeイベントをリッスンするという点でマルチページテンプレートに似ていますが、ページの変更に加えて、JSONコンテンツを取得するためにサーバーにAJAXリクエストを送信する点が異なります。

<div id="home" data-role="page">
  <div data-role="header"><h1>Categories</h1></div>
  <div data-role="content">
    <h2>Select a Category Below:</h2>
    <ul data-role="listview" data-inset="true">
        <li><a href="#category-items?category=animals">Animals</a></li>
        <li><a href="#category-items?category=colors">Colors</a></li>
        <li><a href="#category-items?category=vehicles">Vehicles</a></li>
    </ul>
  </div>

</div>

カテゴリ「動物」をクリックすると、id ="home"DIVが非表示になります。この例では、ページをリロードする代わりに、HTMLが動的に生成され、JSONオブジェクトの結果が入力されます。

正しいコンテンツの表示を処理するコードは次のとおりです。

// Load the data for a specific category, based on
// the URL passed in. Generate markup for the items in the
// category, inject it into an embedded page, and then make
// that page the current active page.
function showCategory( urlObj, options )
{
    var categoryName = urlObj.hash.replace( /.*category=/, "" ),

        // Get the object that represents the category we
        // are interested in. Note, that at this point we could
        // instead fire off an ajax request to fetch the data, but
        // for the purposes of this sample, it's already in memory.
        category = categoryData[ categoryName ],

        // The pages we use to display our content are already in
        // the DOM. The id of the page we are going to write our
        // content into is specified in the hash before the '?'.
        pageSelector = urlObj.hash.replace( /\?.*$/, "" );

    if ( category ) {
        // Get the page we are going to dump our content into.
        var $page = $( pageSelector ),

            // Get the header for the page.
            $header = $page.children( ":jqmData(role=header)" ),

            // Get the content area element for the page.
            $content = $page.children( ":jqmData(role=content)" ),

            // The markup we are going to inject into the content
            // area of the page.
            markup = "<p>" + category.description + "</p><ul data-role='listview' data-inset='true'>",

            // The array of items for this category.
            cItems = category.items,

            // The number of items in the category.
            numItems = cItems.length;

        // Generate a list item for each item in the category
        // and add it to our markup.
        for ( var i = 0; i < numItems; i++ ) {
            markup += "<li>" + cItems[i].name + "</li>";
        }
        markup += "</ul>";

        // Find the h1 element in our header and inject the name of
        // the category into it.
        $header.find( "h1" ).html( category.name );

        // Inject the category items markup into the content element.
        $content.html( markup );

        // Pages are lazily enhanced. We call page() on the page
        // element to make sure it is always enhanced before we
        // attempt to enhance the listview markup we just injected.
        // Subsequent calls to page() are ignored since a page/widget
        // can only be enhanced once.
        $page.page();

        // Enhance the listview we just injected.
        $content.find( ":jqmData(role=listview)" ).listview();

        // We don't want the data-url of the page we just modified
        // to be the url that shows up in the browser's location field,
        // so set the dataUrl option to the URL for the category
        // we just loaded.
        options.dataUrl = urlObj.href;

        // Now call changePage() and tell it to switch to
        // the page we just modified.
        $.mobile.changePage( $page, options );
    }
}

また、[カテゴリ]ページと[動物]ページのURLを見ると、HTMLドキュメントが毎回同じであることがわかります。違いはハッシュ値です。

http://jquerymobile.com/demos/1.1.0/docs/pages/dynamic-samples/sample-reuse-page.html

http://jquerymobile.com/demos/1.1.0/docs/pages/dynamic-samples/sample-reuse-page.html#category-items?category=animals

ページが読み込まれると、ハッシュ値がページの状態を表すために使用されます。ブラウザはほとんどステートレスであるため、ハッシュは、ページをユーザーに表示する必要がある状態を判断するのに役立つ1つのトリックです。

changePageメソッドの呼び出しを、カテゴリページのメニューで使用されているURLと比較するだけです。

<li><a href="#category-items?category=animals">Animals</a></li>
<li><a href="#category-items?category=colors">Colors</a></li>
<li><a href="#category-items?category=vehicles">Vehicles</a></li>

ユーザーがリンクをクリックしたときに変更されるのはハッシュ値だけであり、ページが再ロードされることはないことに注意してください。しかし、あなたの例では、実際にはまったく新しいページを読み込んでいます。

// this is a new page, not a hash
$.mobile.changePage("dashboard.html", { transition : "slide" });

論理的に言えば、ページをどのように表現するかについての戦略を再考する必要があります。jQuery Mobileを最大限に活用するには、最初のHTMLページをすべてのCSS、JavaScript、および静的コンテンツのフレームと考えてください。

その後、リクエストするリソースは、同じページの後にハッシュ値が続くURLで識別される必要があります。

たとえば、静的ページが「index.html」の場合、ダッシュボードは「index.html#dashboard」になります。ダッシュボードHTMLをid="dashboard" DIVに含めて、サーバーからのデータを動的に入力するか、AJAXを介してHTMLとデータを読み込むこともできます。

2つ目のポイントは、ダッシュボードに直接アクセスする人は誰でも「/index.html#dashboard」にアクセスする必要があるということです。これにより、元のページが読み込まれ、ハッシュをチェックするJavaScriptが起動され、「ダッシュボード」が含まれていることが認識されます。動的データをプルバックして、ダッシュボードページに移行します。

詳細については、jQueryページの動的ドキュメントを参照してください。

于 2012-05-12T06:28:01.280 に答える