0

jQuery Mobile と追加のスクリプトの読み込みが私を殺しています。ドキュメントを確認し、AJAX モデルが複雑さを引き起こしていることを理解しました。情報を適用するためにここから助けを得ましたが、まだすべてを一貫して動作させることはできません。次に例を示します。

日付用と時刻用の 2 つのフォーム フィールドを含むページがあります。日付フィールドで jQuery UI Datepicker を呼び出し、時間フィールドでサードパーティの Timepicker (この timepicker ) を呼び出しています。ページに直接アクセスするか、更新を行うと、どちらも問題なく動作します。しかし、他の場所からページに移動すると、日付ピッカーのみが実行されます。それらは両方ともドキュメント ヘッドでリンクされており、両方ともページで呼び出されますpageinit。一方が機能するのに、もう一方が機能しないのはなぜですか?

頭:

<!DOCTYPE html>
<!--[if IE 8]>               <html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
  <head>
    <meta charset="utf-8">

    <title>Test Site</title>

    <!-- Make it Mobile friendly -->
    <meta name="HandheldFriendly" content="True">
    <meta name="MobileOptimized" content="320">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta http-equiv="cleartype" content="on">

    <!-- Stylesheets -->
    <link rel="stylesheet" href="_css/normalize.css" />
    <link href="http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css" rel="stylesheet">
    <link rel="stylesheet" href="_css/jquery.mobile.structure-1.3.1.css" />
    <link rel="stylesheet" href="_css/red_variant/red_variant.css" />
    <link href="_libraries/jquery-ui-timepicker-0.3.2/jquery.ui.timepicker.css" rel="stylesheet" type="text/css" />
    <link rel="stylesheet" href="_css/foundation.css" />
    <link rel="stylesheet" href="_css/main.css" />

    <!-- jQuery Including UI and Mobile -->
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
    <script src="http://code.jquery.com/ui/1.10.2/jquery-ui.js" type="text/javascript"></script>
    <script src="http://code.jquery.com/mobile/1.3.1/jquery.mobile-1.3.1.min.js" type="text/javascript"></script>
    <script src="_libraries/jquery-ui-timepicker-0.3.2/jquery.ui.timepicker.js" type="text/javascript"></script>

</head>

問題のフォーム:

<form>
    <label for="addAgendaDate" class="ui-hidden-accessible">Date:</label>
<input name="addAgendaDate" id="addAgendaDate" placeholder="Date" value="" type="text">
    <label for="addAgendaTime" class="ui-hidden-accessible">Time:</label>
<input name="addAgendaTime" id="addAgendaTime" placeholder="Time" value="" type="text">
</form>

<script>
        $(document).on('pageinit', function(){       
            $( "#addAgendaTime" ).timepicker({
                showPeriod: true,
                showLeadingZero: true
            });
        });

        $(document).on('pageinit', function(){       
            $( "#addAgendaDate" ).datepicker();
        });
</script>

通常のページの読み込みでは両方が動作するのに、jQuery Mobile AJAX の読み込みでは 1 つしか動作しない原因は何ですか?


解決しました! 1か月かかりましたが、ようやく頭に浮かびました。Gajotres と Kevin B は、根底にあるスクリプトの使用に関する問題を理解するのに役立ちましたが、スクリプトの問題のそれぞれに、さまざまな追加の問題が発生しました。

  • 以下の日時ピッカーの不一致は、実際には z-index の CSS の問題が原因でした。タイム ピッカーポップし、スクリプト的には正常に動作していましたが、何らかの理由で jQueryUI が z-index インラインをゼロに設定していたため、モバイル ページ オーバーレイの背後に配置されていました。CSS オーバーライド (!important を実行する必要がありました) により、これが修正されました。
  • 各ページに同じフッターをプルする PHP が含まれていたため、jQuery カウントダウンに問題がありました。これは ID の重複の問題でした。解決するクラスに変更されました。
4

1 に答える 1

5

jQuery Mobile がページの変更を処理する方法

この状況を理解するには、jQuery Mobile がどのように機能するかを理解する必要があります。ajax を使用して他のページをロードします。

最初のページは正常に読み込まれます。そのHEADBODYはDOMにロードされ、他のコンテンツを待機します。2 番目のページが読み込まれると、そのBODYコンテンツのみがDOMに読み込まれます。

そのため、ボタンは正常に表示されますが、クリック イベントは機能しません。ページ遷移中に親 HEAD が無視された同じクリック イベント。

詳細を知りたい場合は、私の別の記事を読んでください: jquery モバイルですべてのスクリプトを index.html に配置する必要がある理由

公式ドキュメントは次のとおりです: http://jquerymobile.com/demos/1.2.0/docs/pages/page-links.html

残念ながら、これはドキュメントに記載されていません。彼らはこれが常識だと思っているか、私の他のトピックのように説明するのを忘れていました。(jQuery Mobile のドキュメントは膨大ですが、多くのものが欠けています)。

解決策 1

2 ページ目と他のすべてのページで、次のように SCRIPT タグを BODY コンテンツに移動します。

<body>
    <script>
        // Your javascript will go here
    </script>
    // And rest of your HTML content
</body>

これは簡単な解決策ですが、それでも醜い解決策です。

解決策 2

すべての JavaScript を元の最初の HTML に移動します。すべてを収集し、単一の js ファイル内の HEAD に配置します。jQuery Mobile が読み込まれた後に初期化します。

<head>
    <meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; minimum-scale=1.0; user-scalable=no; target-densityDpi=device-dpi"/>
    <link rel="stylesheet" href="http://code.jquery.com/mobile/1.2.0/jquery.mobile-1.2.0.min.css" />
    <script src="http://code.jquery.com/mobile/1.2.0/jquery.mobile-1.2.0.min.js"></script>    
    <script src="index.js"></script> // Put your code into a new file
</head>

最後に、これが優れたソリューションの一部である理由を説明します。

解決策 3

ボタンと、ページを変更するために使用しているすべての要素でrel="external"を使用します。そのため、ページのロードに ajax を使用する必要があり、jQuery Mobile アプリは通常の Web アプリケーションのように動作します。残念ながら、これはあなたの場合には良い解決策ではありません。Phonegap が通常の Web アプリとして機能することはありません。

<a href="#second" class="ui-btn-right" rel="external">Next</a>

公式ドキュメント、次の章を探してください: Linking without Ajax

現実的な解決策

現実的なソリューションはSolution 2を使用します。ただし、ソリューション 2 とは異なり、同じ index.js ファイルを使用して、他のすべてのページの HEAD 内で初期化します。

今、あなたはなぜ私に尋ねることができますか?

jQuery Mobile のような Phonegap はバグが多く、すべての js コンテンツが単一の HTML ファイル内にある場合、遅かれ早かれエラーが発生し、アプリが失敗します (読み込まれた DOM を含む)。DOM が消去される可能性があり、Phonegap によって現在のページが更新されます。そのページに JavaScript がない場合、再起動するまで機能しません。

于 2013-05-07T18:04:29.703 に答える