簡體   English   中英

jQuery mobile如何檢測刷新

[英]jQuery mobile how to detect refresh

一些背景;

默認情況下,當您單擊指向單獨的HTML頁面的鏈接時,JQM會加載該頁面上的第一個data-role =“ page”並將其附加到第一頁的DOM上,這是因為JQM僅加載該頁面div而沒有加載任何腳本等在該容器之外。

我有一個5頁的jQuery移動應用程序“ login.html”“ menu.html”“ account.html”“ settings.html” ..etc

我用like更改頁面;

 $.mobile.changepage("account.html")

同樣,我將所有頁面加載邏輯都放在這樣的第一頁login.html中

<script>
     $(document).on('pageinit', '#loginpage', function() {
       //do some stuff run some ajax scripts and add some html to its body
    });

  $(document).on('pageinit', '#accountpage', function() {
        //do some stuff run some ajax scripts and add some html to its body
    });

   $(document).on('pageinit', '#settingspage', function() {
        //do some stuff run some ajax scripts and add some html to its body
    });

</script>

雖然此應用程序運行良好,但問題是我發現它非常脆弱,很難從意外錯誤中幸免。 例如;

由於在login.html中定義了每個頁面的正文html的加載方式,這意味着如果用戶在任何時候手動刷新這些頁面中的任何頁面,該頁面將在不運行這些腳本的情況下加載,並加載一個沒有正文的空頁面。 在那一刻,由於從內存中刪除了正確的DOM,用戶被困在一個充滿空頁面的應用程序中,唯一的辦法是他足夠聰明,可以在地址欄中鍵入“ login.html”,然后所有進程才能啟動順利。

我認為我們無法%100隱藏地址欄,向下滾動后再次可見。

因此,這是我想到的一個問題,可能會發生其他一些奇怪的事情,並且如果DOM損壞,只能再次使用app的唯一方式是鍵入login.html地址欄,用戶可能不會對此感興趣。

如何使該應用程序更強大,例如檢測到任何DOM損壞或刷新,然后將用戶轉發到login.html,這樣他就不會卡在空頁面的應用程序中。

減輕痛苦的一種方法是將特定於頁面的腳本放在適當的html文件中的data-role="page"元素內 ,並使該元素之外的每個頁面的腳本都相同(在body和/或head )。

這樣,即使用戶刷新頁面,所有必要的腳本仍將執行。 但是,一個問題是,在綁定任何處理程序之前,您需要先取消綁定它們。 否則,您最終將擁有多個處理程序。

為了說明這一點:

login.html已更新 ):

<div data-role="page" id="loginpage">
    <script>
        $(document).off('pageinit', '#loginpage').on('pageinit', '#loginpage', function() {
            $(document).off('click', '#btnaccount').on('click', '#btnaccount', function(){
                $.mobile.changePage("jqmaccount.html", {reloadPage: true});
            });
            console.log("paginit in loginpage");
        });
        $(document).off('pageshow', '#loginpage').on('pageshow', '#loginpage', function() {
            console.log("pageshow in loginpage");
        });
    </script>
    <div data-role="content">
        <a id="btnaccount" href="#" data-role="button">Account</a>
    </div>
</div>

account.html已更新 ):

<div data-role="page" id="accountpage">
    <script>
    $(document).off('pageinit', '#accountpage').on('pageinit', '#accountpage', function() {
        $(document).off('click', '#btnlogout').on('click', '#btnlogout', function(){
            $.mobile.changePage("jqmlogin.html", {reloadPage: true});
        });
        console.log("pageinit in accountpage");
    });
    $(document).off('pageshow', '#accountpage').on('pageshow', '#accountpage', function() {
        console.log("pageshow in accountpage");
    });
    </script>
    <div data-role="content">
        <a id="btnlogout" href="#" data-role="button">Logout</a>
    </div>
</div>

在此設置中,如果用戶刷新account.html,則該頁面上的“注銷”按鈕仍將起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM