以前在博文中提到過,在 webview 中使用 jQuery 等框架,很影響網頁加載速度,所以我都是使用純 Javascript 來寫頁面腳本。在開發 webview 程序過程中,經常用到了一些東西,總結一下:
1. 排序:
對一個對象數組進行排序,大的在前,小的在後
var array = [{id:1,date: 1272775205971}, {id:2,date: 1272775145384}, {id:3,date: 1272774832649}] function sortByDate(array) { array.sort(function(a, b){ if(a.date > b.date) return -1; else if(a.date < b.date) return 1; else return 0; }); }
2. 隱藏樁節點:
頁面上有如下元素, id 是 line 的 div 是一個樁節點, content 下的所有內容都是由這個樁節點 clone 出來的。
<div id=’content’> <div id='line'> <img class='type' src=''/> <span class='duration'>...</span> <span class='date'>...</span> </div> </div>
在所有節點 clone 結束之後,需要隱藏這個樁節點。其他的克隆出來的節點 id 也是 line ,沒有改變, webkit 下, firstChild 獲取的節點是 textNode ,所以需要進行一些判斷,來確定這個樁節點。
function hideStub() { var stub = (function(){ return arguments[0].nodeType == 1?arguments[0]:arguments.callee(arguments[0].nextSibling); })(document.getElementById('content').firstChild); stub.style.display = 'none'; }
3. 以前博文中提過, Webview 支持 java 和 javascript 互調。而調用 Java 方法,返回的字符串不是 javascript 的本地字符串。簡單來說,就是 javascript 的字符串和從 java 中獲取的字符串不一樣,很多字符串操作函數都不支持。需要進行一道轉換,轉換方法就是對它調用 toLocaleString() 函數。
4. 從 java 中獲取的 json 字符串,在 javascript 中要轉成 json 對象,一個很簡單的方法就是 eval(json) 或 window.eval(json) 。我以前也一直是這麼做的。昨天,我這麼解析一個從 java 中返回的 json 字符串,卻遇到了問題,用這個 eval 解析它, webkit 一直報錯,說語法錯誤。後來我用了另外一種方法,解決了。
很簡單,就是構造一個函數,這個函數返回這個字符串,然後運行這個函數,就得到了 json 對象。
var x = (new Function('return '+ json.toLocaleString()+';'))();
5. Webview 中的頁面,要可拖動並且裏面元素可以點擊,這個問題曾困擾過我,因爲事件的冒泡機制似乎並不太管用。後來還是解決了,這種方法我經常用到。
頁面:
<div id='log'> <!—- 整個log元素需要可以拖動 --> <div id='line'> <img class='type' src=''/> <span class='duration'>...</span> <span class='date'>...</span> </div> <div id='line'> <img class='type' src=''/> <span class='duration'>...</span> <span class='date'>...</span> </div> <!—- 很多個id是line的div,每個都可以點擊 --> </div>
Javascript:
document.getElementById('log').addEventListener('touchstart', function(e){ Scroll.moved = false; e.preventDefault(); clearTimeout(Scroll.handler); showScrollBar(); Scroll.down = true; Scroll.y = e.touches[0].clientY; }, false); document.getElementById('log').addEventListener('touchmove', function(e){ if(!Scroll.moved) {//沒有滾動的時候,不執行move操作 var rx = Scroll.ix - e.touches[0].clientX; var ry = Scroll.iy - e.touches[0].clientY; if(rx>-10 && rx <10 && ry>-10 && ry<10) return;//移動範圍小於10*10,則認爲沒有滾動 Scroll.moved = true;//否則,認爲滾動了 } e.preventDefault(); var dy = e.touches[0].clientY - Scroll.y; document.getElementById('log').scrollTop += -dy; Scroll.y = e.touches[0].clientY; }, false); document.getElementById('log').addEventListener('touchend', function(e){ e.preventDefault(); Scroll.moved = false; Scroll.handler = setTimeout(hideScrollBar, 1000); }, false); 子節點添加點擊: document.getElementById('line').addEventListener('touchstart', function(e){ e.preventDefault(); }, false); child.addEventListener('touchend', function(e){ e.preventDefault(); if(Scroll.moved) return;//頁面滾動了,不執行任何操作 //否則,在此觸發點擊事件,執行一些操作 }, false); //用於存儲滾動的狀態 Scroll = { moved:false, handler:null, down:false, y:0, ix:0, iy:0, dy:0 }