webview中用到的Javascript 博客分類: Javascript JavaScriptjsonwebkitjQuery框架

以前在博文中提到過,在 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


}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章