1 關於page cache
由於移動端瀏覽器webkit基本都實現了page cache(火狐叫做back-forwoad cache);所以回退操作基本不會觸發onload操作了,不過上一頁的狀態事件都會保存,一般情況下不會出問題,如果需要每次展現都觸發事件可以考慮pageshow事件。
但是在三星s3上發現了一個問題,就是直接給dom設置屬性的時候(這里指的是dom.prop = value 這種類型的,而不是attribute。)點擊后退時原生的瀏覽器這個屬性會丟失,而awen在有些庫里用到了這種方式。。。所以悲劇了。后來不得不改為attribute。
ps:某日awen意外 的發現如果引入自己寫的sjs庫,這個問題奇怪的消失了....看來還有待研究,日后給出解釋
2 pointer-events
被懸浮元素蓋住的元素基本是無法觸發鼠標事件的。一般情況下比較符合要求,但是有時候我們需要觸發怎么辦?比如說地圖。css3中有個樣式叫做:pointer-events可以解決,他的值如下:
- auto------- 默認值,鼠標不會穿透當前層
- none------ 元素不再是鼠標事件的目標,鼠標不再監聽當前層而去監聽下面的層中的元素。但是如果它的子元素設置了pointer-events為其它值,比如auto,鼠標還是會監聽這個子元素的。
- 其它屬性值是針對SVG
兼容性:Firefox 3.6+和chrome 2.0+ 以及safari 4.0+都支持這個CSS3屬性,IE6/7/8/9都不支持,Opera在SVG中支持該屬性但是HTML中不支持。不過值得慶幸的是,andorid和ios中基本都支持。
3 webkit取消默認的效果
常用的如下幾個:
-webkit-tap-highlight-color: rgba(0, 0, 0, 0); //取消點擊選取背景色
-webkit-user-drag:none; //取消拖拽
-webkit-user-select:none; //取消用戶選取
更詳細的說明,看這里:http://ued.ctrip.com/blog/wp-content/webkitcss/
4 touchmove & e.preventDefault
大家都知道在手機上這個方法的重要性。也知道android的不連續觸發touchmove的bug,但是android上會有點同樣需要注意(只是個人見解,歡迎探討漲姿勢)。
手指touchup之前:如果第一次觸發touchmove的時候你調用了e.preventDefault方法,之后整個move的過程系統都不會再處理,哪怕你把該方法寫在了判斷里,相反如果第一次觸發touchmove你沒有調用e.preventDefault,那么你想在之后的touchmove觸發時不再e.preventDefault那是沒門的。
也就是說,android上的touchmove在手指離開屏幕之前,是否取消系統默認事件,只取決於第一次觸發touchmove時你有沒有調用e.preventDefault.
模擬一種場景,按鈕點擊,如果我判斷移動一段距離之前調用e.preventDefault,出了該距離就不阻止默認事件,基本是沒效果的。他只會取決於你第一次touchmove的時候你的判斷是不是需要e.preventDefault,來決定之后整個手指在屏幕上的響應是給系統(比如滾動條)還是給你自己操作。
5 quojs&jQ.Mobi的設備判斷
判斷系統時我的中興的原生瀏覽器居然說不是移動設備,我去。看看了quojs源碼中的代碼:
SUPPORTED_OS = { Android: /(Android)\s+([\d.]+)/, ipad: /(iPad).*OS\s([\d_]+)/, iphone: /(iPhone\sOS)\s([\d_]+)/, Blackberry: /(BlackBerry|BB10|Playbook).*Version\/([\d.]+)/, FirefoxOS: /(Mozilla).*Mobile[^\/]*\/([\d\.]*)/, webOS: /(webOS|hpwOS)[\s\/]([\d.]+)/ };
紅色部分有問題,因為中興的userAgent中"Android"和版本使用'/'間隔的。所以上面紅色部分應改為:Android: /(Android)[\s\/]+([\d.]+)/,不知道別的手機是不是也有類似的問題呢?總有些oem廠商強大的就是不走尋常路。
6 fixed on mobile
”position:fixed“的效果有目共睹,在移動設備上除了android2.2以上和ios的5.0之后的版本效果還好,但是在這之前,很多人都被高的郁悶不已。
根據蘋果官方文檔,當頁面上設置了viewport的meta聲明之后。手指移動時其實移動的是viewport(抽象出頁面),而fixed是針對於頁面的,所以當手指移動式,其實頁面並沒有發生變化,從而導致看上去fixed無效。
對此,jquery mobile用的中規中矩的隨着手指一動改變top或者left的位置。sencha touch 和 twitter做的就比較新穎,基本摒棄了viewport的作用了,就像一些實現的滾動條插件的做法。用translate的方法來改變內部元素的位置。這樣一來手指滑動的時候,頁面和viewport其實都沒有移動。
7 translate3d的妙用
有時候在使用css3變換的時候,經常發現頁面會發生閃現的情況,這是因為css3變化的時候影響頁面渲染造成了非常短暫的卡頓。方法是使用translate3d();來將元素浮出原ui層,這樣既可以盡可能的利用硬件加速。上面說的sencha touch 和 twitter都用到了類似處理。
8 css3動畫防抖
有時候在做css3動畫的時候頁面會閃一下,跟上面提到的差不多, 那么可以使使用 '-webkit-backface-visibility' = 'hidden' 或者 "-webkit-perspective: 1000;" 來防止頁面抖動。別忘了使用瀏覽器私有屬性hack
9 css透明
很多人覺得,移動開發可以放心opacity了,但是值得注意的是,有時候在有些機器上(android),圖片opacity會造成大塊的黑色陰影塊,第一次碰到的時候直接麻爪了,后來發現是opacity搞的鬼,換成rgba就可以解決了
10 uploadify引起chrome崩潰
很好用的上傳工具,可以個問題差點讓我崩潰,chrome下會經常出現崩潰。原因不明,大概是chrome緩存了uploadify的某些變量,重新載入時引起js bug。解決辦法就是給uploadify的js源文件加時間戳版本號,每次請求新的。。。。
11 android addJavascriptInterface 失效
js調用java的時候,如果測試機器的sdk version >=17 並且應用設置了targetSdkVersion>=17時如果你不加@JavascriptInterface 注解就會出現這一問題。
12 android中注冊的javascript橋接類參數個數需謹慎
js往webview中注冊的js方法,在webview中被js調用的時候,切記參數個數必須完全一致,做js的不限參數使用慣了這里經常會出錯。
13 android4.4 以上的 webview中圖片不顯示
再android4.4版本之前,我們經常設置 setBlockNetworkImage(true) 來將圖片的渲染放在dom加載最后從而提升性能,但是從4.4之后這個屬性導致了webview中的圖片不能再被加載,原因不明,解決辦法,直接設成false或者不設置,當然你也可以判斷版本來設置:
if(Build.VERSION.SDK_INT<19){ ws.setBlockNetworkImage(true); }
14 android4.4 webview頁面 onActivityResult 頁面刷新
目前本人測試事4.4中,activity發起startActivityForResult,結果回到當前頁時,如果布局中有webview,那么頁面會刷新,這時候如果你再onActivityResult中執行js方法(loadUrl("javascript:..")) 你就會悲催的發現報錯,方法不存在。
可能設置頁面不刷新能解決,但是我沒找到,cache也不管用,所以用了笨辦法,如果是sdk>18 則生成一個運行js的Runnable置於全局,每次頁面加載完成時判斷這個專用於sdk19以上的Runnable!=null,則執行並置空。