jQuery mobile 開發問題記錄


 

一、動態加載頁面問題

 


1.存在這樣一個頁面布局:

    main.html 為主界面A,B為該頁面中的三個page,其中A為splitview左部分頁面,B為右半部頁面

    a1.html 為一個獨立的頁面

    a2.html為一個獨立的頁面

2.在main.html中有這樣一段script

    $("#A1").live("pagecreate",function(){

      $.getScript("a1.js", function(){

        $.mobile.changePage(a1.html',{transition: "none",changeHash:false});

      });    

    });

    而a1.html中存在一個按鈕btn1,a1.js中有這樣一段代碼

 

    $("#btn1").live("click",function(){

      $.getScript("a2.js", function(){

        $.mobile.changePage(a2.html',{transition: "none",changeHash:false});

      });    

    });

 

    無論a1.js還是a2.js中的按鈕觸發一個動作,然后動態生成一個頁面填充至B,而后使用

    $.mobile.changePage("#B");

    這種操作是不能成功的。

每當a1->a2時,a2頁面中的pageceate及pageinit事件會被調用

同理,每當a2->a1時,a1頁面中的pageceate及pageinit事件會被調用

 

為了解決這個問題,

方法1.可以刪除a1,a2頁面,把這兩個頁面的html代碼合並至main.html中。

方法2.如果這樣會導致頁面龐大不好維護,也可以采用在頁面一加載之初,a1.html的內容使用ajax獲取,並且追加至A容器中,當btn1按鈕點擊時,同樣,使用ajax把a2.html的內容追加至A容器。

 

 

二、動態生成ListView問題

 


這個問題花了整整一天的時間才解決了。之前老是出現各種奇怪的錯誤,典型如:

Uncaught cannot call methods on listview prior to initialization; attempted to call method 'refresh'

 

我的listview的容器ul完全是動態生成的。動態HTML代碼如下:

      <div data-role="page" id="pLogin" data-hash="false">

        <div data-role="header" data-theme="b" data-position="inline">

          <h1>歡迎使用</h1>

        </div>

        <div data-role="content">  

      <div class="content-primary">

        <ul data-role="listview" data-inset="true" id="lv1">

          <li><a href="#">AAAAAAAAAAA<a></li>

          <li><a href="#">BBBBBBBBBBB<a></li>

          <li><a href="#">CCCCCCCCCCC<a></li>

          <li><a href="#">DDDDDDDDDDD<a></li>

        </ul>

      </div>

        </div>

      </div>

調用

$("#lv").listview('refresh');時,出錯了:Uncaught cannot call methods on listview prior to initialization; attempted to call method 'refresh'

查了N多資料,終於弄明白了。因為我的page容器也是動態生成的。page數據加載至容器時,jquerymobile並沒有對該page容器進行初始化。因此調用 page的content下的listview組件的refresh方法時,會出現異常。

解決方法:

在dom數據加載完成后,重新生成page

        $("#pLogin").page();

        $("#lv").listview('refresh');

問題成功解決。

 

 

三、splitview導航時,導航標簽所在頁面消失。


 

存在場景,L為splitview的左部分,R為splitview的右部分。 

在L容器中,存在

<li><a id="a1" onclick="fun1()" href="#d1">導航1</a></li>

<li><a id="a2" onclick="fun1()"href="#d2">導航2</a></li>

在點擊a1,a2按鈕后,觸發fun1,使用ajx去服務器取數據,並且生成一段HTML格式化代碼,填充至R容器中。

服務器生成HTML代碼如下:

      <div data-role="page" id="d1" data-hash="false">

        <div data-role="header" data-theme="b" data-position="inline">HHHHHH</div>

        <div data-role="content">  

      <div class="content-primary">

            XXXXXXXXXXX

      </div>

        </div>

      </div>

fun1代碼:

    html = ${發送ajax后,由服務器生成的格式如上}

   $("#R").append(html);

   $.mobile.changePage("d1");

問題就出現了,是的,R部分顯示了XXXXXXXXXXX,是該顯示的東東,不過,L部分變成空白了。

琢磨了很久,原來是這樣,因為使用ajax,是異步請求,a1點擊時錨點對應的d1 頁面並沒有生成,並且填充至R容器,由於找不到d1,因此左部分空白了。

解決方法仍然有兩個:

1.在R部分再做一個空白的page,a1,a2的href屬性設置為該空白page的id即可

2.在發送異步請求之前,先生成page所在div容器,至少讓d1容器先生成出來,不至於a1找不到錨點。在請求完成后,把請求得到的數據填充至content部分即可。

 

 

四、header上增加返回按鈕時,導致header變高


 我的header部分是動態生成的。根據業務需要,有的page需要返回按鈕,有的page不需要。業務詳情共用一個page,每次點擊后,根據業務信息更新header及業務情況,決定是否顯示返回按鈕。

我的方法:

在header中加入一個按鈕header.append('<a onclick="history.go(-1)">返回<a>');

然后再去修改header部分的文字信息。

不過,問題就來了,第一,返回按鈕的地方不一定准確。第二,header部分變得特別高。把content部分都遮擋了。

 

解決方案:刪除生成了返回按鈕,使用page帶的返回按鈕屬性。

<div data-role="page" id="p'+id+'" data-add-back-btn="true" data-back-btn-text="返回">

 

業務邏輯中,使用這樣的代碼

      if(back){

        $("a[data-rel='back']",header).show();

      }else{

        $("a[data-rel='back']",header).hide();

      }

來決定是否顯示返回按鈕。

這樣做解決了header超高問題,返回位置不准確問題。

 

五、關於a標簽結合changePage使用問題


如果點擊一個a標簽后,調用一個changePage轉到目標頁面,而在a標簽上,又設置了href="#id"屬性,這樣可能會導致點擊a標簽后, 頁面多次跳轉問題。

解決方案,如果頁面使用了button那么就使用changePage

如果頁面使用了href屬性,則在生成目標page后,不需要調用changePage事件。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM