1

jquery mobileとphonegap(Apache Cordova)を使用してモバイルアプリを構築しています。問題は、「ログイン」ページまたは「ログイン」ページの場合、最初にロードするページを決定する前に、まずDBクエリを作成する必要があることです。メインページ"。

phonegapのドキュメントに基づいて、「deviceready」イベントをバインドして、デバイスの準備ができたことを確認してから、DBクエリを実行する必要があります。

document.addEventListener("deviceready", onDeviceReady, false);

「onDeviceReady」という関数は、DBが作成されていない場合は作成し、「users」という名前のテーブルにクエリを実行します。1人以上のユーザーがいる場合は、「main.html」という名前のページを表示しません。それ以外の場合はページを表示します。 「login.html」という名前。

function onDeviceReady() {
    var db = window.openDatabase("Database", "1.0", "Cordova Demo", 200000);
    db.transaction(populateDB, errorCB, successCB);
}

基本的に、問題は、この関数の実行中に、「onDeviceReady」関数が呼び出される前に次のコードが実行されるため、最初のページが読み込まれることです。

$(document).bind( "mobileinit", function(){             
    $.mobile.listview.prototype.options.filterPlaceholder = "Buscar...";
    //-> patch for phonegap
    $.mobile.allowCrossDomainPages = true;
    $.mobile.page.prototype.options.backBtnText = "atrás";
});
$( document ).bind( "pagebeforeload", function( event, data ){
    // here i think i would say to phone gap not to load any page until i make the db queries
    //i think i can't make the DB queries here because the "pagebeforeload" is launched before the "deviceready" function
});

ASC順序のDOMに従った最初のページのコードがロードされる場合、このページは次のようにロードされます。

<div data-role="page" id="page-init">
        <div data-role="header" data-theme="c" data-position="fixed">
            <h1>Init page</h1>
        </div><!-- /header -->
    </div>

$.mobile.changePage("main.html");「users」テーブルに1つ以上のユーザーレコードがあるかどうかを確認してからページを「main.html」に変更すると、最初に「page-init」ページが読み込まれ、次に「main.html」とiが読み込まれます。ユーザーは一種のフラッシュを使用できるため、これは望ましくありません。どのページが最初に表示されるかを「ユーザー」テーブルに確認したら、決定したいだけです。

4

3 に答える 3

5

ここでstackoverflowで次のことを学びましたが、もう答えが見つからないので、自分で答えます:

インデックスの最後に:

            $(document).bind("mobileinit", onMobileInit);
            $(document).ready(onPageLoad);

インデックス内の任意の JS ファイルまたはスクリプト タグ内:

function onMobileInit() {
    console.log("mobile init");
    $.mobile.autoInitialize = false;
}

function onPageLoad() {// Document.Ready
    console.log("document ready");
    try {
        if(someCondition) {
            document.location.hash = "#profile";
        } else {
            document.location.hash = "#signIn";
        }
    } catch (exception) {

    } finally {
        $.mobile.initializePage();
    }
}

PS init コードを別の場所に置くこともできますが、それは db 呼び出しであるため、ロード画面の方が適しています。ブラウザのストレージを使用すると、はるかに高速だと思います

于 2012-10-09T08:08:45.000 に答える
1

これはロード画面で解決できるようです。最初のページを読み込み画面として作成し、データベースをチェックして、データベースの結果に基づいて正しいページを読み込みます。JQM スピナーを追加して、何かが起こっていることをユーザーに伝えることもできます。

于 2012-05-29T14:51:17.787 に答える
0

この質問は古いですが、モバイルの初期化手順なしで、document.location.hash = "#profile"; のように、必要なハッシュを document.location.hash に割り当てるだけでうまくいったと言えます。これは、document.ready() を実行する前に行う必要があります。

于 2020-02-12T12:05:29.517 に答える