Phonegap+JqueryMobile問題總結與經驗彙總
最近用phonegap+JqueryMobile開發了一個程序,跨android和ios兩個平臺,這期間遇到了很多問題,在論壇上苦苦搜索以及提問,但好多問題都沒有被解決,網上搜的很多答案都是轉帖或者不準確的。後來通過自己的研究和探索以及在stackoverflow上的一些資料,終於把項目做完了。現在總結一些實用的技巧:
1 關於載入框的自定義,顯示和隱藏
新版本的JM需要這樣設置
$.mobile.loadingMessageTextVisible=true;//使載入時文字可見
$.mobile.loadingMessage="載入中..."; //設置文字內容
設置完上面的兩行代碼後,就可以正常使用了
$.mobile.showPageLoadingMsg();//顯示
$.mobile.hidePageLoadingMsg();//處理完成後隱藏
2頁面跳轉時很實用的changeHash: false功能($.mobile.changePage的可選參數)
(頁面跳轉後,是否保存此界面的記錄)
我認爲此條是非常實用且重要的,因此加了紅色標題。changeHash:false
是$.mobile.changePage即頁面跳轉時的可選參數。官方解釋爲:changeHash
(boolean,default: true) Decides if the hash in the location bar should be updated. 決定在locationbar裏的hash值是否更新。簡單的說就是是否要把本次打開頁面的記錄存放到hash表中。下面舉個例子說明:有三個界面A,B,C.
A界面爲首頁,B界面爲登陸頁面,C界面爲用戶中心。如果點擊A界面裏的用戶中心按鈕,先檢查用戶是否登錄,如果沒有登錄,那麼先跳轉到B界面。用戶填寫信息登錄成功後跳轉至C界面。B界面裏的登錄js代碼在處理成功後,如果你這樣寫:$.mobile.changePage($("#C"));雖然跳轉到了C界面,但是當你點擊返回按鍵時,會返回到B界面,也就是登陸界面。這樣顯然是不對的。如果加上本參數$.mobile.changePage($("#C"),{changeHash:
false}); 那麼到C界面後再點擊回退按鍵,回退到的就是A界面了。參數的作用從字面即可理解爲,是否要保存hash記錄。保存了就會返回到B界面,不保存則返回到B之前的界面也就是A界面了。
3關於phonegap播放音頻文件的位置:
Android:如果放在www目錄下,應該這樣寫:
var my_media=new Media("file:///android_asset/www/boot.mp3",function(){});
IOS:寫法比較簡單,www目錄下
Var my_media=new Media(“boot.mp3”,function(){});
4 如何去除ios界面上下拖動時彈性的黑邊顯示
在ios的主界面上,明明一屏就顯示完了,也不存在滾動條的情況下,當上下拖動時,界面還是會跟着上下活動,並且出現很討厭的黑邊。在網上搜索此問題,有的解決方案是這樣寫的:
UIWebView *contentView=[[UIWebView alloc] init];
[(UIScrollView *)[[contentViewsubviews] objectAtIndex:0] setBounces:NO];
但是這對於ios初學者以及純phonegap+JM開發者來說,根本不知道加在哪裏。其實是有一種更簡單的辦法的.打開Cordova.plist文件。我們可以找到
UIWebViewBounce字段,默認的value設置的是Yes,只要把它設置爲NO,問題就完美解決啦。View就無法bounce啦~\(≧▽≦)/~
5 關於跨域訪問問題
$.mobile.allowCrossDomainPages
當jQuery Mobile嘗試加載外部頁面的時候,請求會通過$.mobile.loadPage()發出。 只有當$.mobile.allowCrossDomainPages被設爲true的時候,跨域的請求才會通過。 因爲jQuery Mobile框架會通過瀏覽器的location hash值來跟蹤哪些頁面被瀏覽過,如果有問題 的 跨站腳本攻擊(XSS攻擊)能夠修改hash 值並設爲一個跨域URL值的話,就可能會有安全性上 的問題。這就是爲什麼$.mobile.allowCrossDomainPages 默認設爲false.
所以如果PhoneGap應用想要加載遠程服務器的文件,
$.support.cors 和 $.mobile.allowCrossDomainPages 都必須設爲true.並且 $.mobile.allowCrossDomainPages的設置必須要在跨域請求之前完成。 所以我們建議在mobileinit 中這樣寫:
$( document ).bind("mobileinit", function() {
$.support.cors=true;
$.mobile.allowCrossDomainPages= true;
});
另外在ios的開發中,我們還需要配置白名單,否則訪問其它主機仍然是不允許的。
在Cordova.plist中找到ExternalHosts字段,在其中加上你要訪問的遠程主機。最簡單的辦法是:
在ExternalHosts加一下選項爲*,*號的意思是可以匹配爲任意字符的url。這樣就可以訪問外部的url了。