<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>色胚子部落 &#187; jquery</title>
	<atom:link href="http://blog.colorbase.tw/tag/jquery/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.colorbase.tw</link>
	<description>訊息多變的時代裡，需要多學習多思考</description>
	<lastBuildDate>Mon, 15 Aug 2011 03:29:59 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>解決使用 jQuery.getJSON 時 Session 卻過期期的問題</title>
		<link>http://blog.colorbase.tw/web-development/1141</link>
		<comments>http://blog.colorbase.tw/web-development/1141#comments</comments>
		<pubDate>Sun, 20 Jun 2010 10:06:25 +0000</pubDate>
		<dc:creator>阿育</dc:creator>
				<category><![CDATA[Web開發]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://blog.colorbase.tw/web-development/1141</guid>
		<description><![CDATA[當我們在做具有權限控管的網頁時，將會用到Session來做為是否已登入的紀錄及處理，通常在判斷為尚未登入時，將直接顯示錯誤訊息頁面或轉到登入表單頁面，但如果使用jQuery.getJSON()來做AJAX應用的話這樣的處理就不恰當了，因為這樣一來Session因為閒置過久而過期的話 getJSON() 將會得到非預期的結果而導致程式發生錯誤。
 
當然這種問題的解決的辦法有許多個，我們也可以在getJSON()取得資料後再判斷目前得到的資料是否正確，但這樣一來前端的程式碼將會顯得很囉嗦，因此解決辦法中有一個簡單又實用的就是直接取代 jQuery 的 getJOSN()，並搭配後端的對於不同請求給予不同的回應，來統一簡化整個判斷流程。
這裡主要用到了之前所提「使用 PHP 判斷 jQuery 傳來的 AJAX 請求類型」及「取代jQuery內置函數」兩種技巧。
在Javascript中寫入取代jQuery.getJSON()的函數：

(function($) {

	/**
	 * 取代 jQuery 的 JSON
	 */
	$.getJSON = function(url,paramData,callback){

		if($.isFunction(paramData)) {
			callback = paramData;
			paramData = null;
		}

		var opt = {
			url: url,
			dataType: 'json',
			cache: false,
			data: paramData,
			success: function(data, textStatus, XMLHttpRequest){

				if(null === data) return opt.error(XMLHttpRequest,textStatus);

				var handleError = false;

				if(data.TimeoutError != undefined ){
					if(data.TimeoutError == true){
						handleError = true;
						//提示錯誤訊息
						alert('您可能閒置過久，請重新登入系統再重試');
						//進一步轉向登入頁面
						window.location = '登入頁面URL';
					}
				}

				if(!handleError &#38;&#38; callback ...]]></description>
			<content:encoded><![CDATA[<p>當我們在做具有權限控管的網頁時，將會用到Session來做為是否已登入的紀錄及處理，通常在判斷為尚未登入時，將直接顯示錯誤訊息頁面或轉到登入表單頁面，但如果使用jQuery.getJSON()來做AJAX應用的話這樣的處理就不恰當了，因為這樣一來Session因為閒置過久而過期的話 getJSON() 將會得到非預期的結果而導致程式發生錯誤。</p>
<p> <span id="more-1141"></span>
<p>當然這種問題的解決的辦法有許多個，我們也可以在getJSON()取得資料後再判斷目前得到的資料是否正確，但這樣一來前端的程式碼將會顯得很囉嗦，因此解決辦法中有一個簡單又實用的就是直接取代 jQuery 的 getJOSN()，並搭配後端的對於不同請求給予不同的回應，來統一簡化整個判斷流程。</p>
<p>這裡主要用到了之前所提「<a href="http://blog.colorbase.tw/web-development/668" target="_blank">使用 PHP 判斷 jQuery 傳來的 AJAX 請求類型</a>」及「取代jQuery內置函數」兩種技巧。</p>
<p>在Javascript中寫入取代jQuery.getJSON()的函數：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:3f743993-4a17-479d-9727-3b783d8c652f" class="wlWriterEditableSmartContent">
<pre name="code" class="js:nogutter">(function($) {

	/**
	 * 取代 jQuery 的 JSON
	 */
	$.getJSON = function(url,paramData,callback){

		if($.isFunction(paramData)) {
			callback = paramData;
			paramData = null;
		}

		var opt = {
			url: url,
			dataType: 'json',
			cache: false,
			data: paramData,
			success: function(data, textStatus, XMLHttpRequest){

				if(null === data) return opt.error(XMLHttpRequest,textStatus);

				var handleError = false;

				if(data.TimeoutError != undefined ){
					if(data.TimeoutError == true){
						handleError = true;
						//提示錯誤訊息
						alert('您可能閒置過久，請重新登入系統再重試');
						//進一步轉向登入頁面
						window.location = '登入頁面URL';
					}
				}

				if(!handleError &amp;&amp; callback != undefined) {
					callback(data, textStatus, XMLHttpRequest);
				}
			},
			error: function(XMLHttpRequest, textStatus, errorThrown){
				//提示錯誤訊息
				alert('連線發生錯誤！請檢查您的連線並重新嘗試');
			}
		};

		$.ajax(opt);

	};

})(jQuery);</pre>
</div>
<p>在PHP中給予不同回應：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:d5938bc4-2520-4538-8d79-06c4ad512813" class="wlWriterEditableSmartContent">
<pre name="code" class="php:nogutter">session_start();
if(!isset($_SESSION['login'])){ // 尚未登入
	if('application/json, text/javascript, */*' == $_SERVER['HTTP_ACCEPT']){
		//回應給取代後的getJSON()
		echo json_encode( array('TimeoutError' =&gt; true) );
	}else{
		//轉向登入頁面表單
		header('location: 登入頁面URL');
	}
}else{
	// 已登入的其他處理......
	echo json_encode( array('msg' =&gt; '取得訊息') );
}
</pre>
</div>
<p>之後一樣使用jQuery.getJSON()完全不變：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:d2751d1b-d3cb-4e7c-81cb-4b78e3f1785d" class="wlWriterEditableSmartContent">
<pre name="code" class="js:nogutter">$(function(){

	$('#test').click(function(){
		// 取得 JSON資料
		// 若已登入將顯示「取得訊息」
		// 若未登入或Session過期將顯示「您可能閒置過久，請重新登入系統再重試」
		$.getJSON('/index.php',function(data){
			alert(data.msg);
		});
	});

});</pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.colorbase.tw/web-development/1141/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>有趣的 jQuery 快速顯示隱藏元素技巧</title>
		<link>http://blog.colorbase.tw/web-development/1063</link>
		<comments>http://blog.colorbase.tw/web-development/1063#comments</comments>
		<pubDate>Fri, 14 May 2010 10:54:00 +0000</pubDate>
		<dc:creator>阿育</dc:creator>
				<category><![CDATA[Web開發]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://blog.colorbase.tw/?p=1063</guid>
		<description><![CDATA[今天在 Now you see me… show/hide performance 一文中，看到該文作者分析了各種jQuery顯示、隱藏的作法及其效能比較，最後還提到了一個非常有趣的好方法，他利用禁用、啟用&#60;style&#62;元素的方法來達到套用顯示、隱藏效果，在頁面中需要大量套用情況下效能特別好。
 
首先利用&#60;style&#62;來定義樣式為隱藏：

&#60;style id="special_hide"&#62;
	.special_hide {	display: none;}
&#60;/style&#62;


接著在將該&#60;style&#62;元素的disabled屬性設為true使其失去作用，也就是讓他變為顯示，例如jQuery中可以這麼寫：

 $('#special_hide').attr('disabled', true);  // 禁用指定&#60;style&#62;元素

 $('#special_hide').attr('disabled', false); // 啟用指定&#60;style&#62;元素

以下為完整的範例 

&#60;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&#62;
&#60;html&#62;
  &#60;head&#62;
    &#60;script class="jsbin" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"&#62;
	&#60;/script&#62;
	&#60;script type="text/javascript"&#62;
	$(function (){
		$('#disableBtn').click(function(){
			$('#special_hide').attr('disabled', true); // 禁用樣式
		});

		$('#enableBtn').click(function(){
			$('#special_hide').attr('disabled', false); // 啟用樣式
		});
	});
	&#60;/script&#62;

    &#60;title&#62;&#60;/title&#62;
    &#60;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&#62;
 ...]]></description>
			<content:encoded><![CDATA[<p>今天在 <a href="http://www.learningjquery.com/2010/05/now-you-see-me-showhide-performance" target="_blank">Now you see me… show/hide performance</a> 一文中，看到該文作者分析了各種jQuery顯示、隱藏的作法及其效能比較，最後還提到了一個非常有趣的好方法，他利用禁用、啟用&lt;style&gt;元素的方法來達到套用顯示、隱藏效果，在頁面中需要大量套用情況下效能特別好。</p>
<p> <span id="more-1063"></span>
<p>首先利用&lt;style&gt;來定義樣式為隱藏：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:2b97de14-2bbc-4888-a074-0ef54270d1a9" class="wlWriterEditableSmartContent">
<pre name="code" class="css:nogutter">&lt;style id="special_hide"&gt;
	.special_hide {	display: none;}
&lt;/style&gt;</pre>
</div>
</p>
<p>接著在將該&lt;style&gt;元素的disabled屬性設為true使其失去作用，也就是讓他變為顯示，例如jQuery中可以這麼寫：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:0e6e200a-0f52-4fa3-8de6-e8d85a9fa9fe" class="wlWriterEditableSmartContent">
<pre name="code" class="js:nogutter"> $('#special_hide').attr('disabled', true);  // 禁用指定&lt;style&gt;元素

 $('#special_hide').attr('disabled', false); // 啟用指定&lt;style&gt;元素</pre>
</div>
<p>以下為完整的範例 </p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:1c2d78d8-22b3-4899-9a96-86bb6fec761b" class="wlWriterEditableSmartContent">
<pre name="code" class="xml:nogutter">&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;
&lt;html&gt;
  &lt;head&gt;
    &lt;script class="jsbin" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"&gt;
	&lt;/script&gt;
	&lt;script type="text/javascript"&gt;
	$(function (){
		$('#disableBtn').click(function(){
			$('#special_hide').attr('disabled', true); // 禁用樣式
		});

		$('#enableBtn').click(function(){
			$('#special_hide').attr('disabled', false); // 啟用樣式
		});
	});
	&lt;/script&gt;

    &lt;title&gt;&lt;/title&gt;
    &lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&gt;
    &lt;style id="special_hide"&gt;.special_hide { display: none; }&lt;/style&gt;
  &lt;/head&gt;
  &lt;body&gt;

    &lt;button id="disableBtn"&gt;取消樣式&lt;/button&gt;
    &lt;button id="enableBtn"&gt;啟用樣式&lt;/button&gt;

    &lt;div class="special_hide"&gt;這個元素預設會因為樣式而隱藏&lt;/div&gt;

  &lt;/body&gt;
&lt;/html&gt;</pre>
</div>
<p>執行範例：</p>
<p><iframe style="width: 100%; height: 300px" src="http://jsfiddle.net/PQuH6/embedded/"></iframe></p>
<h2>延伸思考</h2>
<p>透過禁用、啟用&lt;style&gt;元素的方法，不只可以應用在大量套用顯示、隱藏效果，其實很多效果都可以利用此方法來完成，特別是大量套用時，因為瀏覽器原生的CSS Selector解析，理論上總是會比jQuery Selector來的快。 </p>
</p>
<h2>參考文章</h2>
<ul>
<li><a href="http://www.learningjquery.com/2010/05/now-you-see-me-showhide-performance" target="_blank">Now you see me… show/hide performance</a> </li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.colorbase.tw/web-development/1063/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>兩款用於開發 iPhone Web 應用的 UI Framework</title>
		<link>http://blog.colorbase.tw/web-development/1010</link>
		<comments>http://blog.colorbase.tw/web-development/1010#comments</comments>
		<pubDate>Wed, 05 May 2010 10:42:04 +0000</pubDate>
		<dc:creator>阿育</dc:creator>
				<category><![CDATA[Web開發]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[library]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://blog.colorbase.tw/web-development/1010</guid>
		<description><![CDATA[最近在雜誌上看到了關於手機平台開發的專欄，裡面提到了手機平台Web上很難做出如同本機應用程式所能做出的使用者體驗(User experience)，雖然這是事實，但透過Framework的輔助多少可降低難度及開發成本。
 

iUI: iPhone User Interface Framework

為iPhone Web UI提供完整的解決方案，只需利用Javascript與標準的HTML就能開發出長得很像iPhone應用程式的Web應用。
網址：http://code.google.com/p/iui/
概觀：http://www.k10design.net/articles/iui/
範例：http://www.k10design.net/articles/iui/demo/
jQTouch

這是一個jQuery Plugin，如果熟悉jQuery的話是個不錯的選擇。
網址：http://www.jqtouch.com/
範例：http://www.jqtouch.com/preview/demos/main/
]]></description>
			<content:encoded><![CDATA[<p>最近在雜誌上看到了關於手機平台開發的專欄，裡面提到了手機平台Web上很難做出如同本機應用程式所能做出的使用者體驗(User experience)，雖然這是事實，但透過Framework的輔助多少可降低難度及開發成本。</p>
<p> <span id="more-1010"></span>
</p>
<h2>iUI: iPhone User Interface Framework</h2>
<p><a href="http://blog.colorbase.tw/wp-content/uploads/2010/05/image.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blog.colorbase.tw/wp-content/uploads/2010/05/image_thumb.png" width="400" height="319" /></a></p>
<p>為iPhone Web UI提供完整的解決方案，只需利用Javascript與標準的HTML就能開發出長得很像iPhone應用程式的Web應用。</p>
<p>網址：<a title="http://code.google.com/p/iui/" href="http://code.google.com/p/iui/">http://code.google.com/p/iui/</a></p>
<p>概觀：<a title="http://www.k10design.net/articles/iui/" href="http://www.k10design.net/articles/iui/">http://www.k10design.net/articles/iui/</a></p>
<p>範例：<a title="http://www.k10design.net/articles/iui/demo/" href="http://www.k10design.net/articles/iui/demo/">http://www.k10design.net/articles/iui/demo/</a></p>
<h2>jQTouch</h2>
<p><a href="http://blog.colorbase.tw/wp-content/uploads/2010/05/image1.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blog.colorbase.tw/wp-content/uploads/2010/05/image_thumb1.png" width="400" height="234" /></a></p>
<p>這是一個jQuery Plugin，如果熟悉jQuery的話是個不錯的選擇。</p>
<p>網址：<a title="http://www.jqtouch.com/" href="http://www.jqtouch.com/">http://www.jqtouch.com/</a></p>
<p>範例：<a title="http://www.jqtouch.com/preview/demos/main/" href="http://www.jqtouch.com/preview/demos/main/">http://www.jqtouch.com/preview/demos/main/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.colorbase.tw/web-development/1010/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>開始HTML5 &#8211; Video</title>
		<link>http://blog.colorbase.tw/web-development/947</link>
		<comments>http://blog.colorbase.tw/web-development/947#comments</comments>
		<pubDate>Tue, 27 Apr 2010 10:04:44 +0000</pubDate>
		<dc:creator>阿育</dc:creator>
				<category><![CDATA[Web開發]]></category>
		<category><![CDATA[audio]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[js-api]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://blog.colorbase.tw/?p=947</guid>
		<description><![CDATA[在HTML5以前若我們要在網頁中播放影片時，需要使用ActiveX或Plug-in的方式來達到，例如：Flash Player、QuickTime等等，但在HTML5之後這些東西成了標準，我們不需再透過額外的外掛來達成，相信這也意味著Web的相關應用將更趨於豐富化。
現在就連 YouTube 也已經測試使用HTML5的Video來做為影片播放介面，因此在實際應用上雖然我們並不一定要走在時代的尖端，但了解一下新技術是有其必要的。
 
&#160; 
HTML 5&#160; Video 基礎
基本的 HTML5 Video 標記如下，我們可以透過 src 屬性來標明影片的URL：

&#60;video src=影片URL &#62;很抱歉！您的瀏覽器不支援HTML5 Video&#60;/video&#62;

雖然上面的方式很簡短，但可惜的是因為目前各家瀏覽器在HTML5 Video的影片格式方面支援不一致，而導致我們若我們想要影片能夠兼容各種主流瀏覽器，我們必須提供這兩種主要的HTML5 Video 格式的影片檔案：

Theora/Vorbis (*.ogg ; *.ogv) 
H.264 / AAC (*.mp4 ; *.m4v) 

所以我們必須提供兩種格式讓瀏覽器自行依照自己支援的格式下載並播放，因此我們加入 &#60;source&#62; 來定義多個影片來源，而不是用 &#60;video&#62; 的 src 屬性，例如：

&#60;video&#62;
	&#60;source src="video.ogg"&#62;
	&#60;source src="video.m4v"&#62;
	很抱歉！您的瀏覽器不支援HTML5 Video
&#60;/video&#62;

&#60;video&#62; 的屬性
&#60;video&#62; 除了可以使用 src 屬性來標明影片的URL，我們還可以使用其他的屬性來定義 &#60;video&#62; 的基本樣式或行為。
src 
影片的URL。
autoplay
影片是否自動播放，預設為 false。
controls
是否顯示播放控制列，若設定為ture將會顯示播放控制列，這個控制器的樣式是依據瀏覽器而定的，預設為 false。
width
&#60;video&#62; 所佔寬度。
height 
&#60;video&#62; 所佔高度。
poster 
這如同一些以Flash實現的播放器所提供的「預覽圖」功能一樣，可於此指定預覽圖的URL，當影片尚未開始播放時，將會先顯示這裡所指定的圖片。
其他的屬性
&#60;video&#62;的屬性還有 loopend / loopstart ...]]></description>
			<content:encoded><![CDATA[<p>在HTML5以前若我們要在網頁中播放影片時，需要使用ActiveX或Plug-in的方式來達到，例如：Flash Player、QuickTime等等，但在HTML5之後這些東西成了標準，我們不需再透過額外的外掛來達成，相信這也意味著<strong>Web的相關應用將更趨於豐富化</strong>。</p>
<p>現在就連 YouTube 也已經測試使用HTML5的Video來做為影片播放介面，因此在實際應用上雖然我們並不一定要走在時代的尖端，但了解一下新技術是有其必要的。</p>
<p> <span id="more-947"></span>
<p>&#160;<img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="html5_video" border="0" alt="html5_video" src="http://blog.colorbase.tw/wp-content/uploads/2010/04/html5_video.png" width="400" height="286" /> </p>
<h2>HTML 5&#160; Video 基礎</h2>
<p>基本的 HTML5 Video 標記如下，我們可以透過 src 屬性來標明影片的URL：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:c994902f-36ec-4339-ad1b-0e0c875499c5" class="wlWriterEditableSmartContent">
<pre name="code" class="xml:nogutter">&lt;video src=影片URL &gt;很抱歉！您的瀏覽器不支援HTML5 Video&lt;/video&gt;</pre>
</div>
<p>雖然上面的方式很簡短，但可惜的是因為目前各家瀏覽器在HTML5 Video的影片格式方面支援不一致，而導致我們若我們想要影片能夠兼容各種主流瀏覽器，我們必須提供這兩種主要的HTML5 Video 格式的影片檔案：</p>
<ul>
<li>Theora/Vorbis (*.ogg ; *.ogv) </li>
<li>H.264 / AAC (*.mp4 ; *.m4v) </li>
</ul>
<p>所以我們必須提供兩種格式讓瀏覽器自行依照自己支援的格式下載並播放，因此我們加入 &lt;source&gt; 來定義多個影片來源，而不是用 &lt;video&gt; 的 src 屬性，例如：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:505dffee-a680-4820-aabc-364dee087a86" class="wlWriterEditableSmartContent">
<pre name="code" class="vb:nogutter">&lt;video&gt;
	&lt;source src="video.ogg"&gt;
	&lt;source src="video.m4v"&gt;
	很抱歉！您的瀏覽器不支援HTML5 Video
&lt;/video&gt;</pre>
</div>
<h2>&lt;video&gt; 的屬性</h2>
<p>&lt;video&gt; 除了可以使用 src 屬性來標明影片的URL，我們還可以使用其他的屬性來定義 &lt;video&gt; 的基本樣式或行為。</p>
<h3>src </h3>
<p>影片的URL。</p>
<h3>autoplay</h3>
<p>影片是否自動播放，預設為 false。</p>
<h3>controls</h3>
<p>是否顯示播放控制列，若設定為ture將會顯示播放控制列，這個控制器的樣式是依據瀏覽器而定的，預設為 false。</p>
<h3>width</h3>
<p>&lt;video&gt; 所佔寬度。</p>
<h3>height </h3>
<p>&lt;video&gt; 所佔高度。</p>
<h3>poster </h3>
<p>這如同一些以Flash實現的播放器所提供的「預覽圖」功能一樣，可於此指定預覽圖的URL，當影片尚未開始播放時，將會先顯示這裡所指定的圖片。</p>
<h3>其他的屬性</h3>
<p>&lt;video&gt;的屬性還有 loopend / loopstart / playcount / start / end / loop 但這些屬性的各個瀏覽器的支援不一，因此目前不是很實用。</p>
<h3>簡單的範例</h3>
<p>以下的範例會在頁面載入完成後自動播放，並顯示瀏覽器內建的影片播放控制列，在載入完成並播放之前將會顯示所指定的預覽圖。</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:0bd24c20-08c2-413e-ab4e-a60c6a36c0ea" class="wlWriterEditableSmartContent">
<pre name="code" class="xml:nogutter">&lt;video id="myvideo" autoplay controls poster="preview.png" &gt;
	&lt;source src="video.ogg"&gt;
	&lt;source src="video.m4v"&gt;
	很抱歉！您的瀏覽器不知員HTML5 Video
&lt;/video&gt;</pre>
</div>
<h2>&lt;video&gt; 與瀏覽器的支援</h2>
<p>目前HTML5的 &lt;video&gt; 僅於以下瀏覽器版本支援：</p>
<p>Chrome4+ / Firefox 3.5+ / Opera 10.5+ / IE 9+ / Safari 4+ </p>
<p>以及以下Mobile平台：</p>
<p>iPhone / iPod / iPad / Android OS</p>
<p><strong>替代性的解決方案</strong></p>
<p>在過度時期我們可以使用 <a href="http://code.google.com/p/video4all/" target="_blank">video4all</a> 這個開源專案讓更多瀏覽器版本也能支援&lt;video&gt;。</p>
<p>透過 <a href="http://code.google.com/p/video4all/" target="_blank">video4all</a> 我們只需要於HTML中加入它所提供的Javascript Library。</p>
<p class="tip">&lt;script src=&quot;video4all.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;</p>
<p>接著我們就可以正常的使用 &lt;video&gt; ，當訪客的瀏覽器不支援 &lt;video&gt; 時 video4all 會自動幫我們將&lt;video&gt;替換成使用Flash的播放器來播放所指定的影片。</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:505ca49b-8f7e-4930-9886-c84c8e257041" class="wlWriterEditableSmartContent">
<pre name="code" class="xml:nogutter">&lt;video&gt;
  &lt;source src="video.ogg" type="video/ogg" /&gt;
  &lt;source src="video.mp4" type="video/mp4" /&gt;
&lt;/video&gt;</pre>
</div>
<h2>HTML5 Video 成員</h2>
<p>在HTML5中我們可以透過 Video所提供的屬性以及方法來控制影片的播放與取得播放資訊。</p>
<h3>play()</h3>
<p>開始播放影片。</p>
<h3>pause()</h3>
<p>影片暫停播放。</p>
<h3>currentTime</h3>
<p><strong>numeric</strong> 目前的播放指標。</p>
<h3>readyState</h3>
<p>影片讀取狀態。</p>
<ul>
<li>HAVE_NOTHING = 0 </li>
<li>HAVE_METADATA = 1 </li>
<li>HAVE_CURRENT_DATA </li>
<li>HAVE_FUTURE_DATA = 2 </li>
<li>HAVE_ENOUGH_DATA = 3 </li>
</ul>
<h3>paused</h3>
<p><strong>boolean</strong> 是否停止</p>
<h3>muted</h3>
<p><strong>boolean</strong> 是否為靜音。</p>
<h3>volume</h3>
<p><strong>numeric</strong> 取得或設定音量值。</p>
<h3>ended</h3>
<p><strong>boolean</strong> 播放指標是否已經到最後。</p>
<h2>搭配jQuery的簡單HTML5 Video 控制範例</h2>
<p><a href="/html5/video/simple.html" target="_blank">請點我觀看範例</a></p>
<p><strong>simple.html</strong></p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:596625d8-15c6-4456-b233-d39f9af63947" class="wlWriterEditableSmartContent">
<pre name="code" class="xml:nogutter">&lt;!doctype html&gt;
&lt;html&gt;
	&lt;head&gt;
		&lt;meta charset="UTF-8"&gt;
		&lt;title&gt;HTML5 Video simple test&lt;/title&gt;
		&lt;script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.js"&gt;&lt;/script&gt;
		&lt;script src="init.js"&gt;&lt;/script&gt;
	&lt;/head&gt;

	&lt;body&gt;
		&lt;p&gt;&lt;a href="http://blog.colorbase.tw/web-development/947"&gt;回文章&lt;/a&gt;&lt;/p&gt;
		&lt;video id="myvideo" poster="html5_video.png" &gt;
			&lt;source src="video.ogg"&gt;
			&lt;source src="video.m4v"&gt;
			很抱歉！您的瀏覽器不支援 HTML5 Video
		&lt;/video&gt;
		&lt;div id="state"&gt;&lt;/div&gt;
		&lt;p&gt;&lt;button id="play"&gt;Play&lt;/button&gt;&lt;button id="pause"&gt;Pause&lt;/button&gt;&lt;/p&gt;
		&lt;ul id="statelist"&gt;&lt;/ul&gt;
	&lt;/body&gt;
&lt;/html&gt;</pre>
</div>
<p><strong>init.js</strong></p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:913445dd-32a6-4c0b-bc8c-02f2f4f45612" class="wlWriterEditableSmartContent">
<pre name="code" class="js:nogutter">$(function(){
	var video = $('#myvideo')[0];//取得video
	var statelist = $('#statelist');
	var videoStateTexts = [
		'HAVE_NOTHING','HAVE_METADATA','HAVE_CURRENT_DATA',
		'HAVE_FUTURE_DATA','HAVE_ENOUGH_DATA'
	];
	var pr = ['currentTime','readyState','paused','muted','volume','ended'];

	$('#play').click(function(){
		video.play(); //播放影片
	});

	$('#pause').click(function(){
		video.pause(); //停止播放
	});

	var t = setInterval(function(){
		statelist.empty();
		$('#state').text(videoStateTexts[video.readyState]);
		for(x in pr){
			statelist.append($('&lt;li&gt;&lt;storng&gt;'+ pr[x]  + ' : ' + video[pr[x]] + '&lt;/strong&gt;&lt;/li&gt;'));
		}
	},100);
});</pre>
</div>
<h2>播放介面的解決方案</h2>
<p>雖然我們可以使用Javascript自行控制HTML5 Video的播放，也意味著我們可以自行開發更漂亮美觀的介面，但這終究會增加許多開發成本，目前已經有許多HTML5 Video Player，不僅提供漂亮的介面，甚至我們還可以根據需求自定播放器外觀。</p>
<h3><a href="http://www.mediafront.org/project/osmplayer" target="_blank">Open Standard Media Player</a></h3>
<p>非常專業且完整度極佳的HTML5 Video 播放器。</p>
<p><a href="http://blog.colorbase.tw/wp-content/uploads/2010/04/image15.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blog.colorbase.tw/wp-content/uploads/2010/04/image_thumb10.png" width="400" height="267" /></a> </p>
<h3><a href="http://camendesign.com/code/video_for_everybody" target="_blank">Video for Everybody!</a></h3>
<p>簡單清爽的播放介面。</p>
<p><a href="http://blog.colorbase.tw/wp-content/uploads/2010/04/image17.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blog.colorbase.tw/wp-content/uploads/2010/04/image_thumb12.png" width="400" height="224" /></a> </p>
<h3><a href="http://jilion.com/sublime/video" target="_blank">SublimeVideo</a></h3>
<p>典雅的播放介面。</p>
<p><a href="http://blog.colorbase.tw/wp-content/uploads/2010/04/image18.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blog.colorbase.tw/wp-content/uploads/2010/04/image_thumb13.png" width="400" height="235" /></a>&#160;</p>
<h3><a href="http://www.html5video.org/kaltura-html5/" target="_blank">Kaltura</a></h3>
<p>能整合jQuery UI訂製介面。</p>
<p><a href="http://blog.colorbase.tw/wp-content/uploads/2010/04/image19.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blog.colorbase.tw/wp-content/uploads/2010/04/image_thumb14.png" width="400" height="235" /></a> </p>
<h3><a href="http://www.openbeelden.nl/oiplayer/" target="_blank">OIPlayer jQuery plugin</a></h3>
<p>jQuery的Plugin</p>
<p><a href="http://blog.colorbase.tw/wp-content/uploads/2010/04/image20.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blog.colorbase.tw/wp-content/uploads/2010/04/image_thumb15.png" width="321" height="238" /></a> </p>
</p>
<h2>參考資料</h2>
<ul>
<li><a title="http://grack.com/blog/2009/07/07/video-support-for-older-browsers/" href="http://grack.com/blog/2009/07/07/video-support-for-older-browsers/">http://grack.com/blog/2009/07/07/video-support-for-older-browsers/</a> </li>
<li><a title="http://diveintohtml5.org/video.html" href="http://diveintohtml5.org/video.html">http://diveintohtml5.org/video.html</a> </li>
<li><a title="http://www.w3.org/TR/html5/video.html" href="http://www.w3.org/TR/html5/video.html">http://www.w3.org/TR/html5/video.html</a> </li>
<li><a title="http://www.broken-links.com/2009/10/06/building-html5-video-controls-with-javascript/" href="http://www.broken-links.com/2009/10/06/building-html5-video-controls-with-javascript/">http://www.broken-links.com/2009/10/06/building-html5-video-controls-with-javascript/</a> </li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.colorbase.tw/web-development/947/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>開始HTML5 &#8211; Web Workers</title>
		<link>http://blog.colorbase.tw/web-development/888</link>
		<comments>http://blog.colorbase.tw/web-development/888#comments</comments>
		<pubDate>Fri, 23 Apr 2010 17:11:00 +0000</pubDate>
		<dc:creator>阿育</dc:creator>
				<category><![CDATA[Web開發]]></category>
		<category><![CDATA[程式設計]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[trend]]></category>
		<category><![CDATA[web-workers]]></category>

		<guid isPermaLink="false">http://blog.colorbase.tw/?p=888</guid>
		<description><![CDATA[HTML5帶來了許多的改變，除了標記語意上的增強之外，最令人震撼的莫過於它所附屬的Javascript APIs。而 Web Workers 是 HTML5 提供的一個多執行緒(Multi-Thread)的解決方案，讓我們可以把需要大量運算的程式交由Web Workers去做背景執行，如此的好處就是其他的工作仍可以順利進行。
Web Workes 目前支援的瀏覽器有：Firefox 3.5+ / Safari 4.0+ / Chrome 5.0+

 


HTML5 的不同
標記的不同
HTML5在標記上有著相當大的變化，其中最為明顯的即是語意上的標籤，在HTML5中，結構化網頁的語意更加清晰了，除了移除許多不必要的標記之外也增加了許多標記及有用的屬性，本文只簡述範例中會用到的部份。
若想知道自己編寫的HTML5是否有錯誤可以利用HTML5 validator來驗證。
DOCTYPE 變簡潔了
現在DOCTYPE只需簡短的這樣寫：

&#60;!DOCTYPE html&#62;

標籤不一定要閉合
在XHTML裡標籤必須要閉合，例如：

&#60;input type="text" id="name" /&#62;

而在HTML5中，以下的寫法也是正確的，而這也是比較建議的寫法：

&#60;input type="text" id="name"&#62;

同樣的方法也適用於meta，而且在指定content-type時，也只需要指定charset而不必定義文件類型text/html，例如：

&#60;meta charset="UTF-8"&#62;

Web Workers基本概念
在使用Web Workers時，我們必須建立一個Worker實體，並傳入要被呼叫的Javascript檔案所在URL，而我們必須把Worker要跑的程式寫在這個檔案中，例如：

var worker = new Worker("worker.js");

在worker.js中我們必須綁定onmessage來執行我們想要執行的動作，在這裡我們可以使用postMessage()來觸發Worker.onmessage事件，例如：

onmessage = function (evt) {
	for (var i=0; i&#60;100000000; i++) {
		//執行大量迴圈
		postMessage(i); // 觸發 Worker.onmessage() 並傳入 i
	};
};

Worker.onmessage(event) 事件
當在被呼叫的javascript裡呼叫postMessage()時，將會觸發這個事件，在這個事件中我們可以透過event.data來取得傳入資料。

worker.onmessage = function (e){
	// 由於在 worker.js 中使用了 ...]]></description>
			<content:encoded><![CDATA[<p>HTML5帶來了許多的改變，除了標記語意上的增強之外，最令人震撼的莫過於它所附屬的Javascript APIs。而 Web Workers 是 HTML5 提供的一個多執行緒(Multi-Thread)的解決方案，讓我們可以把需要大量運算的程式交由Web Workers去做背景執行，如此的好處就是其他的工作仍可以順利進行。</p>
<p>Web Workes 目前支援的瀏覽器有：Firefox 3.5+ / Safari 4.0+ / Chrome 5.0+</p>
</p>
<p> <span id="more-888"></span>
</p>
<p><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="html5_web_workers" border="0" alt="html5_web_workers" src="http://blog.colorbase.tw/wp-content/uploads/2010/04/html5_web_workers.png" width="400" height="286" /></p>
<h2>HTML5 的不同</h2>
<p><strong>標記的不同</strong></p>
<p>HTML5在標記上有著相當大的變化，其中最為明顯的即是語意上的標籤，在HTML5中，結構化網頁的語意更加清晰了，除了移除許多不必要的標記之外也增加了許多標記及有用的屬性，本文只簡述範例中會用到的部份。</p>
<p>若想知道自己編寫的HTML5是否有錯誤可以利用<a href="http://html5.validator.nu/" target="_blank">HTML5 validator</a>來驗證。</p>
<p><strong>DOCTYPE 變簡潔了</strong></p>
<p>現在DOCTYPE只需簡短的這樣寫：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:7714dd36-584e-40a1-a576-2010022e278a" class="wlWriterEditableSmartContent">
<pre name="code" class="xml:nogutter">&lt;!DOCTYPE html&gt;</pre>
</div>
<p><strong>標籤不一定要閉合</strong></p>
<p>在XHTML裡標籤必須要閉合，例如：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:30da56d4-5b66-4776-92e7-c7841d65385e" class="wlWriterEditableSmartContent">
<pre name="code" class="xml:nogutter">&lt;input type="text" id="name" /&gt;</pre>
</div>
<p>而在HTML5中，以下的寫法也是正確的，而這也是比較建議的寫法：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:6a745a67-529f-448c-b2a7-2bc82d2f8685" class="wlWriterEditableSmartContent">
<pre name="code" class="xml:nogutter">&lt;input type="text" id="name"&gt;</pre>
</div>
<p>同樣的方法也適用於meta，而且在指定content-type時，也只需要指定charset而不必定義文件類型text/html，例如：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:9286ad54-8926-459b-9861-27a5d61f4915" class="wlWriterEditableSmartContent">
<pre name="code" class="xml:nogutter">&lt;meta charset="UTF-8"&gt;</pre>
</div>
<h2>Web Workers基本概念</h2>
<p>在使用Web Workers時，我們必須建立一個Worker實體，並傳入要被呼叫的Javascript檔案所在URL，而我們必須把Worker要跑的程式寫在這個檔案中，例如：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:6a92410e-2431-47f6-a787-a8e7379bf5cd" class="wlWriterEditableSmartContent">
<pre name="code" class="js:nogutter">var worker = new Worker("worker.js");</pre>
</div>
<p>在worker.js中我們必須綁定onmessage來執行我們想要執行的動作，在這裡我們可以使用postMessage()來觸發Worker.onmessage事件，例如：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:f480ed37-4b24-4c84-b8a8-7897bf2b78ad" class="wlWriterEditableSmartContent">
<pre name="code" class="js:nogutter">onmessage = function (evt) {
	for (var i=0; i&lt;100000000; i++) {
		//執行大量迴圈
		postMessage(i); // 觸發 Worker.onmessage() 並傳入 i
	};
};</pre>
</div>
<p><strong>Worker.onmessage(event) 事件</strong></p>
<p>當在被呼叫的javascript裡呼叫postMessage()時，將會觸發這個事件，在這個事件中我們可以透過event.data來取得傳入資料。</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:1ab754fb-e683-472a-9dae-a5245b080ffd" class="wlWriterEditableSmartContent">
<pre name="code" class="js:nogutter">worker.onmessage = function (e){
	// 由於在 worker.js 中使用了 postMessage() 並傳入 i 值
	// 因此在這裡可以使用 event.data 來取得 i 值，並做出相關處理
	// 例如：
	console.log(e.data);
}</pre>
</div>
<p><strong>Worker.onerror(event) 事件</strong></p>
<p>當呼叫失敗時，將會觸發此事件，在這個事件中我們可以透過event來取得事件相關資訊。</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:1574452f-d5b9-4cfa-b25b-ad3f54dcdc1a" class="wlWriterEditableSmartContent">
<pre name="code" class="js:nogutter">worker.onerror = function(e){
	alert("於第["+ e.lineno +"]行發生錯誤 : " + e.message); //顯示錯誤訊息
}</pre>
</div>
<p><strong>Worker.terminate()</strong></p>
<p>用以停止Worker的執行的成員函數。</p>
<p>因此Web Worker簡單的操作流程圖如下：</p>
<p><a href="http://blog.colorbase.tw/wp-content/uploads/2010/04/image16.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="html5-web-workers" border="0" alt="html5-web-workers" src="http://blog.colorbase.tw/wp-content/uploads/2010/04/image_thumb11.png" width="400" height="422" /></a></p>
<h2>搭配jQuery的簡單Web Worker範例</h2>
<p><a href="/html5/web_workers_simple/worker.html" target="_blank">點我觀看Web Workers Demo</a></p>
<p>worker.html</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:b8988b77-5fda-40a3-be29-4323ba204859" class="wlWriterEditableSmartContent">
<pre name="code" class="xml:nogutter">&lt;!doctype html&gt;
&lt;html&gt;
	&lt;head&gt;
		&lt;meta charset="UTF-8"&gt;
		&lt;title&gt;Worker Test&lt;/title&gt;
		&lt;link rel="stylesheet" href="worker.css" type="text/css" media="screen"&gt;
		&lt;script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.js"&gt;&lt;/script&gt;
		&lt;script src="init.js"&gt;&lt;/script&gt;
	&lt;/head&gt;

	&lt;body&gt;
		&lt;a href="#" id="startWorker"&gt;開始&lt;/a&gt;
		&lt;ul id="worker-list"&gt;&lt;/ul&gt;
		&lt;a href="#"&gt;回文章&lt;/a&gt;
	&lt;/body&gt;
&lt;/html&gt;</pre>
</div>
<p>worker.css</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:99c7580b-12f5-4617-b64a-3c56c9060045" class="wlWriterEditableSmartContent">
<pre name="code" class="css:nogutter">#worker-list {
	list-style-type: none;
	width: 400px;
}
#worker-list li {
	background-color: #FFE;
	margin: 3px;
	padding: 3px;
	border: 1px solid #C6BC9F;
	font-size: 16px;
	position: relative;
}

#worker-list .close {
	position: absolute;
	background-color: #FFF;
	display: block;
	height: 18px;
	width: 18px;
	border: 1px solid #CCC;
	text-align: center;
	vertical-align: middle;
	font-size: 12px;
	cursor:pointer;
	font-family: Arial, Helvetica, sans-serif;
	right: 3px;
	top: 3px;
}</pre>
</div>
<p>worker.js</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:d61331df-90ac-4c5c-8e93-b5d67f6425b1" class="wlWriterEditableSmartContent">
<pre name="code" class="js:nogutter">onmessage = function (e) {
	for (var i=0; i&lt;e.data; i++) {
		//觸發 worker.onmessage 傳入 i
		if(0 === i % 10 ) postMessage(i);
	};
};</pre>
</div>
<p>init.js</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:525d877f-fbc9-4f2a-a97d-fa21c2c5ed73" class="wlWriterEditableSmartContent">
<pre name="code" class="js:nogutter">$(function(){

	function createWorker (msgObj) {

		// 建立 worker
		var worker = new Worker("worker.js");

		worker.onmessage = function (e){
			msgObj.html(e.data); // 更新資訊 (e.data可取得觸發傳入值)
		}

		worker.onerror = function(e){
			alert("於第["+ e.lineno +"]行發生錯誤 : " + e.message); //顯示錯誤訊息
		}

		return worker;
	}

	$("#startWorker").click(function(){
		for(var i=0;i&lt;5;i++){
			addworker();
		}
		$(this).remove();
		return false;
	});

	function addworker(){
		var newItem = $('&lt;li /&gt;');
		var msg = $('&lt;span class="message"&gt;Waitting...&lt;/span&gt;');

		//關閉鈕
		var close = $('&lt;span class="close"&gt;X&lt;/span&gt;').click(function(){
			var li = $(this).closest('li');
			li.data('worker').terminate(); //停止worker的執行
			li.remove();
		});;

		var worker = createWorker (msg);

		//儲存Worker在元素裡
		newItem.data('worker',worker);

		//執行Worker
		worker.postMessage(30000);

		$('#worker-list').append(newItem.append(msg).append(close))
	}
});</pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.colorbase.tw/web-development/888/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>使用 PHP 判斷 jQuery 傳來的 AJAX 請求類型</title>
		<link>http://blog.colorbase.tw/web-development/668</link>
		<comments>http://blog.colorbase.tw/web-development/668#comments</comments>
		<pubDate>Sun, 07 Mar 2010 08:49:35 +0000</pubDate>
		<dc:creator>阿育</dc:creator>
				<category><![CDATA[Web開發]]></category>
		<category><![CDATA[程式設計]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://blog.colorbase.tw/?p=665</guid>
		<description><![CDATA[今天看到 Detecting Ajax Events on the Server 這篇文章中提到一個有趣的好方法，當jQuery送出AJAX請求時會附上 X-Requested-With 請求檔頭，其值為「XMLHttpRequest」。
依據該文的描述在PHP中我們可以透過判斷 X-Requested-With 請求檔頭來分辨現在的請求是不是AJAX請求而給予不同的回應。
 
但這樣的判斷似乎不夠完整，在某些時候我們可能需要更進一步的判斷，jQuery所提供的AJAX方法不僅可以指定回傳的格式，它在送出AJAX請求時也會根據指定回傳格式的不同而傳出不同的Accept請求檔頭，因此在相同的概念下進一步聯想，其實我們還可以透過「Accept」請求檔頭來分辨現在的請求是什麼樣的類型。
以下依據該文的描述透過判斷 $_SERVER[ 'HTTP_X_REQUESTED_WITH' ] 來分辨現在的請求是不是AJAX請求而給予不同的回應。    例如： 


if('XMLHttpRequest' === $_SERVER[ 'HTTP_X_REQUESTED_WITH' ]){
	// 回應 AJAX 請求，例如JSON格式
	echo json_encode(array('message' =&#62; 'hello'));
} else {
	// 回應一般請求，例如HTML格式
	echo 'hello';
}

當需要更進一步區分請求類型的不同時，將可以透過「Accept」請求檔頭來分辨現在的請求是什麼樣的類型。
以下我整理出jQuery中各種不同的AJAX方法所傳出的「Accept」請求檔頭：

#table td{font-size:12px; background-color:#eeeeee}
#table th{font-size:12px; background-color:#999; color:#fff}



jQuery code
Accept header


$.getJSON(URL); 
$.ajax({url:URL, dataType :&#8217;json&#8217;});

application/json, text/javascript, */*


$.getScript(URL); 
$.ajax({url:URL, dataType :&#8217;script&#8217;}) ;
$.ajax({url:URL, dataType :&#8217;jsonp&#8217;}) ;

text/javascript, ...]]></description>
			<content:encoded><![CDATA[<p>今天看到 <a href="http://www.learningjquery.com/2010/03/detecting-ajax-events-on-the-server?utm_source=feedburner&amp;utm_medium=feed&amp;utm_campaign=Feed%3A+LearningJquery+%28Learning+jQuery%29" target="_blank">Detecting Ajax Events on the Server</a> 這篇文章中提到一個有趣的好方法，當jQuery送出AJAX請求時會附上 X-Requested-With 請求檔頭，其值為「XMLHttpRequest」。</p>
<p>依據該文的描述在PHP中我們可以透過判斷 X-Requested-With 請求檔頭來分辨現在的請求是不是AJAX請求而給予不同的回應。</p>
<p> <span id="more-668"></span>
<p>但這樣的判斷似乎不夠完整，在某些時候我們可能需要更進一步的判斷，jQuery所提供的AJAX方法不僅可以指定回傳的格式，它在送出AJAX請求時也會根據指定回傳格式的不同而傳出不同的Accept請求檔頭，因此在相同的概念下進一步聯想，其實我們還可以透過「Accept」請求檔頭來分辨現在的請求是什麼樣的類型。</p>
<p>以下依據該文的描述透過判斷 $_SERVER[ 'HTTP_X_REQUESTED_WITH' ] 來分辨現在的請求是不是AJAX請求而給予不同的回應。    <br />例如： </p>
</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterSmartContent">
<pre class="php:nogutter" name="code">if('XMLHttpRequest' === $_SERVER[ 'HTTP_X_REQUESTED_WITH' ]){
	// 回應 AJAX 請求，例如JSON格式
	echo json_encode(array('message' =&gt; 'hello'));
} else {
	// 回應一般請求，例如HTML格式
	echo '<strong>hello</strong>';
}</pre>
</div>
<p>當需要更進一步區分請求類型的不同時，將可以透過「Accept」請求檔頭來分辨現在的請求是什麼樣的類型。</p>
<p>以下我整理出jQuery中各種不同的AJAX方法所傳出的「Accept」請求檔頭：</p>
<style type="text/css">
<p>#table td{font-size:12px; background-color:#eeeeee}
#table th{font-size:12px; background-color:#999; color:#fff}</style>
<table id="table" cellspacing="3" cellpadding="2" width="90%">
<tbody>
<tr>
<th width="50%" align="center">jQuery code</th>
<th width="50%" align="center">Accept header</th>
</tr>
<tr>
<td>$.getJSON(<strong>URL</strong>); </p>
<p>$.ajax({url:<strong>URL</strong>, dataType :&#8217;json&#8217;});</p>
</td>
<td>application/json, text/javascript, */*</td>
</tr>
<tr>
<td>$.getScript(<strong>URL</strong>); </p>
<p>$.ajax({url:<strong>URL</strong>, dataType :&#8217;script&#8217;}) ;</p>
<p>$.ajax({url:<strong>URL</strong>, dataType :&#8217;jsonp&#8217;}) ;</p>
</td>
<td>text/javascript, application/javascript, */*</td>
</tr>
<tr>
<td>$.get(<strong>URL</strong>);</td>
<td>*/*</td>
</tr>
<tr>
<td>$(&#8216;#result&#8217;).load(<strong>URL</strong>); </p>
<p>$.ajax({url:<strong>URL</strong>, dataType :&#8217;html&#8217;});</p>
</td>
<td>text/html, */*</td>
</tr>
<tr>
<td>$.ajax({url:<strong>URL</strong>, dataType :&#8217;xml&#8217;})</td>
<td>application/xml, text/xml, */*</td>
</tr>
</tbody>
</table>
<p>現在有了這個對照表，我們就可以根據Accept header來回應不同格式的結果：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterSmartContent">
<pre class="php:nogutter" name="code">switch ($_SERVER['HTTP_ACCEPT']){
	case 'application/json, text/javascript, */*':
		// 回應 JSON 格式
		break;
	case 'text/javascript, application/javascript, */*':
		// 回應 javascript 或 JSONP 格式
		break;
	case 'text/html, */*':
		// 回應 HTML 格式
		break;
	case 'application/xml, text/xml, */*':
		// 回應 XML 格式
		break;
}</pre>
</div>
<p>參考文章：<a href="http://www.learningjquery.com/2010/03/detecting-ajax-events-on-the-server?utm_source=feedburner&amp;utm_medium=feed&amp;utm_campaign=Feed%3A+LearningJquery+%28Learning+jQuery%29" target="_blank">Detecting Ajax Events on the Serve</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.colorbase.tw/web-development/668/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>超好用的jQuery樣板引擎 &#8211; jBind</title>
		<link>http://blog.colorbase.tw/programming/592</link>
		<comments>http://blog.colorbase.tw/programming/592#comments</comments>
		<pubDate>Wed, 17 Jun 2009 11:43:50 +0000</pubDate>
		<dc:creator>阿育</dc:creator>
				<category><![CDATA[程式設計]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://blog.colorbase.tw/?p=592</guid>
		<description><![CDATA[我之前分享過過一篇jQuery樣板的文章 - jQuery的JavaScript 樣板引擎 &#8211; royTemplate  裡面有推薦兩個不錯的Javascript樣板，依舊推薦，但我自己寫的那個狗屁不通樣板如果已經使用的人就請勿再使用了，因為使用了這個jBind之後才發現我寫的那個效能奇差無比（差到讓我想噴血），原因是因為我的寫法對效能的影響很大。

今天要介紹的這個jBind樣板引擎的優點剛剛好符合我的需求：
操作簡單（我想沒有人不喜歡簡單吧？）。
要有區塊的功能（這是很常見的需求）。
檔案要小（javascript是在Client端執行的，越小的檔案當然越好）。
執行效能要好。
甚至多了自定義處理的功能。
操作概念一樣是指派JSON變數給樣板，樣板的定義大約如下：
區塊
使用HTML註解表示。例如：




......區塊內的內容.....




若不經過特殊指定，每個樣板需至少指定一個&#60;!&#8211; data &#8211;&#62;為根區塊。
變數
使用大括號「{」及「}」涵蓋。
例如：{name}


{name}



{role}, {type}




一個完整的樣板定義如下




{name}

    

        {role}, {type}

    




一個完整的範例
HTML：




	


{thead1}
{thead2}



	


{bookName}
{author}



	


{tfoot1}
{tfoot2}



	





Javascript：


var vars =
{
	thead1:'書名',
	thead2:'作者',
	tfoot1:'書名',
	tfoot2:'作者',
	rows:
	[
		{
			bookName:'jQuery in Action',
			author:'Bibeault, Bear'

		},
		{
			bookName:'Learning jQuery',
			author:'Jonathan Chaffer、Karl Swedberg',

		}
	]
};

//指派樣板JSON變數，並把結果加入id為show的tag中
var node = $('#tableTemplate').bindTo(vars,{appendTo:'#show'});


結果：





書名
作者




jQuery in Action
Bibeault, Bear




Learning jQuery
Jonathan Chaffer、Karl Swedberg




書名
作者





更多完整、詳細的範例請直接上jBind官網觀看
相關連結：

jBind

]]></description>
			<content:encoded><![CDATA[<p>我之前分享過過一篇jQuery樣板的文章 - <a href="http://blog.colorbase.tw/programming/551" target="_blank">jQuery的JavaScript 樣板引擎 &#8211; royTemplate </a> 裡面有推薦兩個不錯的Javascript樣板，依舊推薦，但我自己寫的那個狗屁不通樣板如果已經使用的人就請勿再使用了，因為使用了這個<a href="http://www.arashkarimzadeh.com/index.php/jquery/11-jbind-jquery-bind-template.html" target="_blank">jBind</a>之後才發現我寫的那個效能奇差無比（差到讓我想噴血），原因是因為我的寫法對效能的影響很大。<br />
<span id="more-592"></span><br />
今天要介紹的這個jBind樣板引擎的優點剛剛好符合我的需求：</p>
<li>操作簡單（我想沒有人不喜歡簡單吧？）。</li>
<li>要有區塊的功能（這是很常見的需求）。</li>
<li>檔案要小（javascript是在Client端執行的，越小的檔案當然越好）。</li>
<li>執行效能要好。</li>
<li>甚至多了自定義處理的功能。</li>
<p>操作概念一樣是指派JSON變數給樣板，樣板的定義大約如下：</p>
<p><strong>區塊</strong></p>
<p>使用HTML註解表示。例如：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="xml:nogutter">
<!-- data -->

......區塊內的內容.....

<!-- data -->
</pre>
</div>
<p>若不經過特殊指定，每個樣板需至少指定一個&lt;!&#8211; data &#8211;&gt;為根區塊。</p>
<p><strong>變數</strong></p>
<p>使用大括號「{」及「}」涵蓋。</p>
<p>例如：{name}</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="xml:nogutter">
{name}

<!--roles-->

{role}, {type}

<!--roles-->
</pre>
</div>
<p>一個完整的樣板定義如下</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="xml:nogutter">
<!--data-->

{name}

    <!--roles-->

        {role}, {type}

    <!--roles-->

<!--data-->
</pre>
</div>
<p><strong>一個完整的範例</strong><br />
HTML：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="xml:nogutter">
<div style="display:none">
<table width="900" border="0" cellspacing="2" cellpadding="5" id="tableTemplate">
	<!--data-->
<thead>
<tr>
<td width="62%" bgcolor="#CCCCCC">{thead1}</td>
<td width="38%" bgcolor="#CCCCCC">{thead2}</td>
</tr>
</thead>

	<!--rows-->
<tbody>
<tr>
<td><strong>{bookName}</strong></td>
<td>{author}</td>
</tr>
</tbody>

	<!--rows-->
<tfoot>
<tr>
<td bgcolor="#CCCCCC">{tfoot1}</td>
<td bgcolor="#CCCCCC">{tfoot2}</td>
</tr>
</tfoot>

	<!--data-->
</table>
</div>
<div id='show'></div>
</pre>
</div>
<p>Javascript：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="js:nogutter">
var vars =
{
	thead1:'書名',
	thead2:'作者',
	tfoot1:'書名',
	tfoot2:'作者',
	rows:
	[
		{
			bookName:'jQuery in Action',
			author:'Bibeault, Bear'

		},
		{
			bookName:'Learning jQuery',
			author:'Jonathan Chaffer、Karl Swedberg',

		}
	]
};

//指派樣板JSON變數，並把結果加入id為show的tag中
var node = $('#tableTemplate').bindTo(vars,{appendTo:'#show'});
</pre>
</div>
<p>結果：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="xml:nogutter">
<table id="tableTemplate" border="0" cellpadding="5" cellspacing="2" width="900">
<thead>
<tr>
<td bgcolor="#cccccc" width="62%">書名</td>
<td bgcolor="#cccccc" width="38%">作者</td>
</tr>
</thead>
<tbody>
<tr>
<td><strong>jQuery in Action</strong></td>
<td>Bibeault, Bear</td>
</tr>
</tbody>
<tbody>
<tr>
<td><strong>Learning jQuery</strong></td>
<td>Jonathan Chaffer、Karl Swedberg</td>
</tr>
</tbody>
<tfoot>
<tr>
<td bgcolor="#cccccc">書名</td>
<td bgcolor="#cccccc">作者</td>
</tr>
</tfoot>
</table>
</pre>
</div>
<p>更多完整、詳細的範例請直接上jBind官網觀看</p>
<p>相關連結：</p>
<ul>
<li><a href="http://www.arashkarimzadeh.com/index.php/jquery/11-jbind-jquery-bind-template.html" target="_blank">jBind</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.colorbase.tw/programming/592/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQuery的JavaScript 樣板引擎 &#8211; royTemplate</title>
		<link>http://blog.colorbase.tw/sharing/551</link>
		<comments>http://blog.colorbase.tw/sharing/551#comments</comments>
		<pubDate>Tue, 24 Feb 2009 16:07:00 +0000</pubDate>
		<dc:creator>阿育</dc:creator>
				<category><![CDATA[作品分享]]></category>
		<category><![CDATA[程式設計]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[jquery plug-in]]></category>

		<guid isPermaLink="false">http://blog.colorbase.tw/?p=551</guid>
		<description><![CDATA[隨著網頁程式越來越複雜、AJAX應用使用量越來越大，Javascript 呈現 HTML 越來越需要樣板引擎了，今天分享一個因為最近的需求所寫的一個超迷你樣板引擎，也推薦兩個不錯的javascript樣板引擎。
我對javascript樣板引擎的需求大致如下：


操作簡單（我想沒有人不喜歡簡單吧？）。
要有區塊的功能（這是很常見的需求）。
檔案要小（javascript是在Client端執行的，越小的檔案當然越好）。 

先來介紹兩個不錯的樣板引擎
1. jTemplates
以jQuery為基礎開發的樣板引擎，感覺相當不錯，檔案很小(壓縮後約4kb)，樣板語法類似Smarty (可見其功能完整性足夠，而且Smarty知名度夠，因此對很多人來說Smarty樣板語法很容易上手) 官方的特色介紹：

Fast*, Small (&#60;10kB)
100% in JavaScript
Work with Ajax and/or JSON
Allow to use JavaScript code in templates
Work with jQuery
Allow to build cascading templates
Allow to define parameters in templates
Syntax similar to Smarty
Live Refresh! automatic update content from server
Free to commercial or non-commercial use! 

http://jtemplates.tpython.com/
2.JavaScriptTemplates 
純Javascript的樣板引擎，功能感覺相當強大，也很複雜 http://code.google.com/p/trimpath/wiki/JavaScriptTemplates
royTemplate for jQuery plug-in 
因為我喜歡簡單，所以懶人專用、操作簡單的jQuery早成了我寫javascript時必定會一起載入的library，原本這方面的需求都是直接把jQuery強大的DOM操作能力當成樣板引擎在用，但最近發現這樣的寫法真夠讓人吐血的麻煩，因此就在網路上找到上面推薦的那兩個感覺不錯的樣板引擎。 只是我的需求還不到那麼複雜的功能，檔案小、操作簡單的樣板引擎才是我需要的，因此才會重新發明輪子，把我原本的寫法進一步寫成一個jQuery ...]]></description>
			<content:encoded><![CDATA[<p>隨著網頁程式越來越複雜、AJAX應用使用量越來越大，Javascript 呈現 HTML 越來越需要樣板引擎了，今天分享一個因為最近的需求所寫的一個超迷你樣板引擎，也推薦兩個不錯的javascript樣板引擎。</p>
<p><span id="more-551"></span>我對javascript樣板引擎的需求大致如下：
</p>
<ol>
<li>操作簡單（我想沒有人不喜歡簡單吧？）。
<li>要有區塊的功能（這是很常見的需求）。
<li>檔案要小（javascript是在Client端執行的，越小的檔案當然越好）。 </li>
</ol>
<p>先來介紹兩個不錯的樣板引擎</p>
<p><span style="color: #339966"><strong>1. jTemplates</strong></span></p>
<p>以jQuery為基礎開發的樣板引擎，感覺相當不錯，檔案很小(壓縮後約4kb)，樣板語法類似<a href="http://www.smarty.net/" target="_blank">Smarty</a> (可見其功能完整性足夠，而且Smarty知名度夠，因此對很多人來說Smarty樣板語法很容易上手) <br />官方的特色介紹：</p>
<ul>
<li>Fast*, Small (&lt;10kB)
<li>100% in JavaScript
<li>Work with Ajax and/or JSON
<li>Allow to use JavaScript code in templates
<li>Work with jQuery
<li>Allow to build cascading templates
<li>Allow to define parameters in templates
<li>Syntax similar to Smarty
<li>Live Refresh! automatic update content from server
<li>Free to commercial or non-commercial use! </li>
</ul>
<p><a href="http://jtemplates.tpython.com/" target="_blank">http://jtemplates.tpython.com/</a></p>
<p><strong><span style="color: #339966">2.JavaScriptTemplates </span></strong></p>
<p>純Javascript的樣板引擎，功能感覺相當強大，也很複雜 <br /><a href=" http://code.google.com/p/trimpath/wiki/JavaScriptTemplates" target="_blank"><br />http://code.google.com/p/trimpath/wiki/JavaScriptTemplates</a></p>
<p><span style="color: #339966"><strong>royTemplate for jQuery plug-in <br /></strong></span></p>
<p>因為我喜歡簡單，所以懶人專用、操作簡單的jQuery早成了我寫javascript時必定會一起載入的library，原本這方面的需求都是直接把jQuery強大的DOM操作能力當成樣板引擎在用，但最近發現這樣的寫法真夠讓人吐血的麻煩，因此就在網路上找到上面推薦的那兩個感覺不錯的樣板引擎。 <br />只是我的需求還不到那麼複雜的功能，檔案小、操作簡單的樣板引擎才是我需要的，因此才會重新發明輪子，把我原本的寫法進一步寫成一個jQuery 的樣板引擎Plug-in，<em>好讓自己以後不用再邊寫邊吐血</em> XD</p>
<p><span style="color: #339966"><strong>特色：</strong></span></p>
<ol>
<li>操作簡易，只需指派JSON資料即可。
<li>沒有複雜樣板引擎語法，區塊的是否呈現完全取決於資料變數及HTML結構，適合以WYSIWYG編輯器編輯樣板(如Dreamweaver)。
<li>支援階層區塊
<li>檔案本身size迷你(以jQuery為基礎)，原始大小 2.11 KB，壓縮後1.17 KB。 </li>
</ol>
<p>使用概念很簡單，有用過Web Server端語言(如PHP)樣板引擎的人應該會很容易理解，使用概念如下：</p>
<ol>
<li>資料變數採用 JSON格式，樣板變數的格式為： %變數名稱%，例如：%title%
<li>區塊的定義只需要設定HTML tag的屬性blk即可，如：blk=』區塊名稱』。
<li>單一區塊直接指定子值即可，而重複區塊資料指派JSON array資料即可 </li>
</ol>
<p><strong>基本範例：</strong> <br />HTML，樣板的部份用一個tag包裹起來，並設定style=』display:none』，用以隱藏原始樣板</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterSmartContent">
<pre class="xml:nogutter" name="code">
<div id="result"></div>
<div style="display: none">
<div id="template">
<h2>%hello%</h2>
<div blk="block1">這個區塊將被顯示</div>
<div blk="block2">這個區塊不會被顯示！</div>
</div>
</div>
</pre>
</div>
<p>javascript，將結果顯示在id=』result』的tag裡面</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterSmartContent">
<pre class="js:nogutter" name="code">//JSON變數資料
var vars =
{
	hello:'Hello world!!',
	block1:{}
};
/*
以下資料最終結果一樣
var vars =
{
	hello:'Hello world!!',
	block1:true,
	block2:undefined;
};
*/

//操作方式
/*
	結果 = $(樣板).royTemplate(JSON資料);
*/
var result = $('#template').royTemplate(vars);
$('#result').html(result);</pre>
</div>
<p>結果</p>
<div class="codecolorer-container">
<div id="template">
<h2>Hello world!!</h2>
<div>這個區塊將被顯示</div>
</div>
</div>
<p>結果HTML，由於block2沒有指派資料，所以不會顯示</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterSmartContent">
<pre class="xml:nogutter" name="code">
<div id="result">
<div id="template">
<h2>Hello world!!</h2>
<div>這個區塊將被顯示</div>
</div>
</div>
<div style="display: none">
<div id="template">
<h2>%hello%</h2>
<div blk="block1">這個區塊將被顯示</div>
<div blk="block2">這個區塊不會被顯示！</div>
</div>
</div>
</pre>
</div>
<p><strong>表格區塊範例：</strong></p>
<p>HTML</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterSmartContent">
<pre class="xml:nogutter" name="code">
<div id="result"></div>
<div style="display: none">
<table id="tableTemplate" border="0" cellspacing="2" cellpadding="5" width="900">
<tbody>
<tr>
<td bgcolor="#cccccc" width="62%">%title1%</td>
<td bgcolor="#cccccc" width="38%">%title2%</td>
</tr>
<tr blk="rows">
<td><strong>%bookName%</strong></td>
<td>%author%</td>
</tr>
</tbody>
</table>
</div>
</pre>
</div>
<p>javascript，由於要讓rows區塊以重複區塊的方式呈現，因此JSON變數資料中指派rows陣列以顯示多列資料</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterSmartContent">
<pre class="js:nogutter" name="code">//JSON變數資料
var vars =
{
	title1:'書名',
	title2:'作者',
	rows:
	[
		{
			bookName:'jQuery in Action',
			author:'Bibeault, Bear'

		},
		{
			bookName:'Learning jQuery',
			author:'Jonathan Chaffer、Karl Swedberg',

		},
		{
			bookName:'JavaScript Programmer’s Reference',
			author:'Horn, Shannon'
		}
	]
};
//如果rows區塊只需顯示一次，則不需指派Array資料，改為如下
/*
var vars =
{
	title1:'書名',
	title2:'作者',
	rows:
	{
		bookName:'jQuery in Action',
		author:'Bibeault, Bear'
	}
};
*/

$('#result').html($('#tableTemplate').royTemplate(vars));</pre>
</div>
<p>結果HTML</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:a1072bb0-bdd8-460c-aba9-55a676a6f9bb" class="wlWriterEditableSmartContent">
<pre name="code" class="xml:nogutter">&lt;div id="result"&gt;
	&lt;table id="tableTemplate" border="0" cellspacing="2" cellpadding="5" width="900"&gt;
		&lt;tbody&gt;
			&lt;tr&gt;
				&lt;td bgcolor="#cccccc" width="62%"&gt;書名&lt;/td&gt;
				&lt;td bgcolor="#cccccc" width="38%"&gt;作者&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;&lt;td&gt;&lt;strong&gt;jQuery in Action&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Bibeault, Bear&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Learning jQuery&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Jonathan Chaffer、Karl Swedberg&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;&lt;td&gt;&lt;strong&gt;JavaScript Programmer’s Reference&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Horn, Shannon&lt;/td&gt;
			&lt;/tr&gt;
		&lt;/tbody&gt;
	&lt;/table&gt;
&lt;/div&gt;
&lt;div style="display: none"&gt;
	&lt;table id="tableTemplate" border="0" cellspacing="2" cellpadding="5" width="900"&gt;
		&lt;tbody&gt;
			&lt;tr&gt;
				&lt;td bgcolor="#cccccc" width="62%"&gt;%title1%&lt;/td&gt;
				&lt;td bgcolor="#cccccc" width="38%"&gt;%title2%&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr blk="rows"&gt;&lt;td&gt;&lt;strong&gt;%bookName%&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;%author%&lt;/td&gt;
			&lt;/tr&gt;
		&lt;/tbody&gt;
	&lt;/table&gt;
&lt;/div&gt;</pre>
</div>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterSmartContent">
<pre class="xml:nogutter" name="code"></pre>
</div>
<p><strong>下載：</strong><a title="royTemplate" href="/download/royTemplate.zip">royTemplate</a> <br />包含royTemplate的原始檔及壓縮後的檔案，與四個範例(基本Demo、表格列表(階層區塊)Demo、綜合Demo、AJAX Demo for PHP)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.colorbase.tw/sharing/551/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>為jQuery擴充功能，得到DOM同級元素</title>
		<link>http://blog.colorbase.tw/programming/506</link>
		<comments>http://blog.colorbase.tw/programming/506#comments</comments>
		<pubDate>Sun, 31 Aug 2008 11:50:53 +0000</pubDate>
		<dc:creator>阿育</dc:creator>
				<category><![CDATA[程式設計]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://blog.colorbase.tw/?p=506</guid>
		<description><![CDATA[jQuery提供簡單易用的DOM操作能力，讓我們可以專注於Javascript程式的邏輯而不用去理會煩人的DOM操作、瀏覽器相容等問題。
我們可以利用next()來取得同級的下一個元素，利用prev()來取得同級的上一個元素，但是jQuery並無直接由函數提供取得同級的第一個元素、同級的最後一個元素、同級的任一元素，因此我們可以利用jQuery強大的Selector（選擇器）達成這樣的需求，並替jQuery擴充功能。

擴充jQuery的功能函數，把以下程式碼加入JQuery中


//取得第一個同級元素
$.fn.first = function()
{
	return this.parent().children(":first");
}
//取得最後一個同級元素
$.fn.last = function()
{
	return this.parent().children(":last");
}
//由索引值取得任一個同級元素，索引值從0開始
$.fn.eq = function(eIdx)
{
	return this.parent().children(":eq("+ eIdx +")");
}


使用範例 &#8211; 利用jQuery擴充操作DOM，取得同級的第一個元素、同級的最後一個元素、同級的任一元素：


$(function()
{
	alert($("#item3").first().attr("id"));//顯示item1（同級的第一個元素）
	alert($("#item3").last().attr("id"));//顯示item5（同級的最後一個元素）
	alert($("#item3").eq(1).attr("id"));//顯示item2（同級的任一元素）
});


以上範例需搭配以下HTML內容




項目一
項目二
項目三
項目四
項目五




關於Selector可進一步參考官方提供的jQueryAPI詳細的說明及範例：
API/1.2/Selectors
在簡睿隨筆中也有中文一覽表及說明：
jQuery神奇的選擇器(Selector)
]]></description>
			<content:encoded><![CDATA[<p>jQuery提供簡單易用的DOM操作能力，讓我們可以專注於Javascript程式的邏輯而不用去理會煩人的DOM操作、瀏覽器相容等問題。<br />
我們可以利用next()來取得同級的下一個元素，利用prev()來取得同級的上一個元素，但是jQuery並無直接由函數提供取得同級的第一個元素、同級的最後一個元素、同級的任一元素，因此我們可以利用jQuery強大的Selector（選擇器）達成這樣的需求，並替jQuery擴充功能。<br />
<span id="more-506"></span><br />
擴充jQuery的功能函數，把以下程式碼加入JQuery中</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="js:nogutter">
//取得第一個同級元素
$.fn.first = function()
{
	return this.parent().children(":first");
}
//取得最後一個同級元素
$.fn.last = function()
{
	return this.parent().children(":last");
}
//由索引值取得任一個同級元素，索引值從0開始
$.fn.eq = function(eIdx)
{
	return this.parent().children(":eq("+ eIdx +")");
}
</pre>
</div>
<p><strong>使用範例</strong> &#8211; 利用jQuery擴充操作DOM，取得同級的第一個元素、同級的最後一個元素、同級的任一元素：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="js:nogutter">
$(function()
{
	alert($("#item3").first().attr("id"));//顯示item1（同級的第一個元素）
	alert($("#item3").last().attr("id"));//顯示item5（同級的最後一個元素）
	alert($("#item3").eq(1).attr("id"));//顯示item2（同級的任一元素）
});
</pre>
</div>
<p><strong>以上範例需搭配以下HTML內容</strong></p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="xml:nogutter">
<div>
<ul id="ul1">
<li id="item1">項目一</li>
<li id="item2">項目二</li>
<li id="item3">項目三</li>
<li id="item4">項目四</li>
<li id="item5">項目五</li>
</ul>
</div>
</pre>
</div>
<p>關於Selector可進一步參考官方提供的jQueryAPI詳細的說明及範例：<br />
<a target="_blank" href="http://docs.jquery.com/Selectors">API/1.2/Selectors</a></p>
<p>在簡睿隨筆中也有中文一覽表及說明：<br />
<a target="_blank" href="http://blog.colorbase.tw.roodo.com/emisjerry/archives/4205285.html">jQuery神奇的選擇器(Selector)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.colorbase.tw/programming/506/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

