7

以下に示すように、各ページに単一のファイルがあり、すべてのページに pageinit イベントハンドラーを実装しようとしています (1 つのページに厳密に属しているものはそこで宣言する必要があると思います)。

<body>
    <div id="myPage" data-role="page">
        <!-- Content here -->
        <script type="text/javascript">
            $("#myPage").live('pageinit', function() {
                // do something here...
            });
        </script>
    </div>
</body>

イベントはページに適切にバインドされているため、コードは実行されますが、別のページに移動して後で戻ると、pageinit イベントが 2 回実行されます。.live メソッドが pageinit イベントを再度ページにバインドするためだと思います。しかし、pageinit イベントは、ページの初期化時に 1 回だけ呼び出されるべきではありませんか? ここで何が欠けていますか?

4

5 に答える 5

6

イベントの名前を渡すことで問題を解決します。この場合は、ハンドラーではなく「pageinit」です。

<script defer="defer" type="text/javascript">

var supplier = null;
$("#pageID").die("pageinit"); //<--- this is the fix
$("#pageID").live("pageinit", function(event){

console.log("initialized - @(ViewBag.ID)");
supplier = new Tradie.Supplier();

supplier.Initialize("@(ViewBag.ID)");

});

参照: http://www.rodcerrada.com/post/2012/04/26/jQuery-Mobile-Pageinit-Fires-More-Than-Once.aspx

于 2012-04-29T05:40:58.753 に答える
2

on()を使用してpageinitをドキュメントにバインドすることをお勧めしていると確信しています。例えば

$(document).on ('pageinit', '#myPage', function (event) {

pageinitをページにバインドする代わりに、再初期化されます。実際、今では一般的に、$(document).on()がjQueryでイベントをバインドするための推奨される方法だと思いました。

于 2012-12-16T20:21:10.270 に答える
2

JavaScriptコードを別のファイルに移動するのがおそらく最善だと思います。サイト内を移動している間、jQuery Mobileはそのページをクリーンアップ(読み取り:DOMから削除)する可能性があるmyPageため、ページを再度ロードして、同じコードブロックを再実行する必要があります。イベントの2つのリスナーを定義してバインドしましたpageinit

それが基本的にliveoron関数の使用を提案する理由ですが、ページにバインディングコードを含めると失敗します;)

bindただし、の代わりに使用するのではなく、ページごとにコードを配置することを主張する場合live

参照:http://jquerymobile.com/demos/1.0/docs/pages/page-cache.html

したがって、jQuery Mobileには、DOMを整理するためのシンプルなメカニズムがあります。jQuery Mobileは、Ajaxを介してページをロードするたびに、後で(技術的には、pagehideイベントで)DOMから移動するときに、DOMから削除されるページにフラグを立てます。

于 2012-01-08T23:59:41.527 に答える
0

私が使用した簡単な回避策は、ハンドラー関数を含む変数を宣言することです。

var handler = function() {
    // your code
};

die()次に、ハンドラーをバインドする前に常に使用しますlive()

$( "#myPage" ).die( handler ).live( handler );

これは作者の意図した使用法ではないと確信していますが、それでうまくいきます。コードをページDIV内に残すことができます。

于 2012-01-09T08:18:20.083 に答える
0
$("#page1").live("pageinit", function () {
    alert('pageinit');
    $("#page1").die("pageinit"); //<--- prevent from firing twice on refresh
});
于 2012-10-28T22:02:25.183 に答える