<?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; Web開發</title>
	<atom:link href="http://blog.colorbase.tw/category/web-development/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>檢測訪客瀏覽器對 HTML5 與 CSS3 的支援程度</title>
		<link>http://blog.colorbase.tw/web-development/1099</link>
		<comments>http://blog.colorbase.tw/web-development/1099#comments</comments>
		<pubDate>Sun, 23 May 2010 02:26:00 +0000</pubDate>
		<dc:creator>阿育</dc:creator>
				<category><![CDATA[Web開發]]></category>
		<category><![CDATA[cross-browser]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[detecting]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[library]]></category>
		<category><![CDATA[modernizr]]></category>
		<category><![CDATA[判斷]]></category>
		<category><![CDATA[檢測]]></category>
		<category><![CDATA[瀏覽器]]></category>
		<category><![CDATA[跨瀏覽器]]></category>

		<guid isPermaLink="false">http://blog.colorbase.tw/web-development/1099</guid>
		<description><![CDATA[由於各主流瀏覽器對於 HTML5 與 CSS3 中支援的程度不一，如果我們想要搶先嘗試使用它們的的新功能，卻又想要在各種瀏覽器中保持一定的可用性，那麼勢必要在 Javascript 中撰寫相關的判斷程式碼來進行判斷瀏覽器是否支援新特性，如果訪客的瀏覽器支援，則使用新功能，而反之則執行替代的程式碼或者提示使用者所使用的瀏覽器將會有部分進階功能無法使用。
 
關於目前各主流瀏覽器的支援情況可參考之前的文章 HTML5 與 CSS3 準備好了嗎？
自行撰寫 Javascript 進行 HTML5 與 CSS3 的檢測
如果我們使用到的 HTML5 與 CSS3 新特性並不多，則可以自行撰寫相關的檢測碼來進行判斷，至於該如何檢測，則可參考：    The All-In-One Almost-Alphabetical No-Bullshit Guide to Detecting Everything
文章中除了羅列一大堆 HTML5 等檢測的片段程式碼，也提到了一個很好用的函式庫 Modernizer。

Modernizr
 
Modernizr 是一個非常小巧的函式庫 (大約 8 KB，gzip壓縮後大約3.9 KB)，它用於檢測瀏覽器對於 HTML5 與 CSS3 支援程度，其首頁也提供了一份即時的檢測表，當使用不同的瀏覽器進入該網站時，將可看到不同的檢測結果，這個檢測表其實也可以當做一種瀏覽器支援參考，當安裝了新版本的瀏覽器時只要進入這個網站就可以即時知道瀏覽器是否有增加了什麼 HTML5 或 CSS3 的新功能。
先讓&#160; IE 支援 HTML5 的新標籤
由於 IE9 ...]]></description>
			<content:encoded><![CDATA[<p>由於各主流瀏覽器對於 HTML5 與 CSS3 中支援的程度不一，如果我們想要搶先嘗試使用它們的的新功能，卻又想要在各種瀏覽器中保持一定的可用性，那麼勢必要在 Javascript 中撰寫相關的判斷程式碼來進行判斷瀏覽器是否支援新特性，如果訪客的瀏覽器支援，則使用新功能，而反之則執行替代的程式碼或者提示使用者所使用的瀏覽器將會有部分進階功能無法使用。</p>
<p> <span id="more-1099"></span>
<p>關於目前各主流瀏覽器的支援情況可參考之前的文章 <a href="http://blog.colorbase.tw/web-development/1070" target="_blank">HTML5 與 CSS3 準備好了嗎？</a></p>
<h2>自行撰寫 Javascript 進行 HTML5 與 CSS3 的檢測</h2>
<p>如果我們使用到的 HTML5 與 CSS3 新特性並不多，則可以自行撰寫相關的檢測碼來進行判斷，至於該如何檢測，則可參考：    <br /><a href="http://diveintohtml5.org/everything.html" target="_blank">The All-In-One Almost-Alphabetical No-Bullshit Guide to Detecting Everything</a></p>
<p>文章中除了羅列一大堆 HTML5 等檢測的片段程式碼，也提到了一個很好用的函式庫 Modernizer。</p>
</p>
<h2>Modernizr</h2>
<p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="modernizr" border="0" alt="modernizr" src="http://blog.colorbase.tw/wp-content/uploads/2010/05/modernizr.jpg" width="400" height="286" /> </p>
<p><a href="http://www.modernizr.com/" target="_blank">Modernizr</a> 是一個非常小巧的函式庫 (大約 8 KB，gzip壓縮後大約3.9 KB)，它用於檢測瀏覽器對於 <strong>HTML5</strong> 與 <strong>CSS3</strong> 支援程度，其首頁也提供了一份即時的檢測表，當使用不同的瀏覽器進入該網站時，將可看到不同的檢測結果，這個檢測表其實也可以當做一種瀏覽器支援參考，當安裝了新版本的瀏覽器時只要進入這個網站就可以即時知道瀏覽器是否有增加了什麼 HTML5 或 CSS3 的新功能。</p>
<h2>先讓&#160; IE 支援 HTML5 的新標籤</h2>
<p>由於 IE9 之後才認得 HTML5 的新標籤，因此若要讓舊版本的IE也認得 HTML5的新標籤，則可以使用<a href="http://code.google.com/p/html5shiv/" target="_blank">html5shiv</a>來讓 IE 支援 HTML5 的新標籤，使用方式為加入以下的語法於&lt;head&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:df468869-4434-4e78-bfbb-73fdaa23c52c" class="wlWriterEditableSmartContent">
<pre name="code" class="xml:nogutter">&lt;!--[if IE]&gt;
&lt;script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"&gt;&lt;/script&gt;
&lt;![endif]--&gt;</pre>
</div>
<h2>使用 Modernizr </h2>
<p>Modernizr 的使用方式很簡單，只需於&lt;head&gt;之間使用&lt;script&gt;標籤引入這個函式庫即可：</p>
<p class="tip">&lt;script src=&quot;modernizr.min.js&quot;&gt;&lt;/script&gt;</p>
<p>接著我們就可以在 Javascript 或 CSS 中做相對應的判斷及處理。</p>
</p>
<h3>在 Modernizr 中使用 Javascript 判斷</h3>
</p>
<p>Modernizr 載入後，即可使用 Modernizr.特性名稱的方式來判斷瀏覽器的支援，例如以下為判斷瀏覽器是否支援 canvas。</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:6d8c5b01-69b5-4f9a-86bb-4873d0262736" class="wlWriterEditableSmartContent">
<pre name="code" class="js:nogutter">if (Modernizr.canvas) { //判斷瀏覽器是否支援 canvas
	alert("支援");
}else{
	alert("不支援");
}</pre>
</div>
<h3>在 Modernizr 中使用 CSS 判斷</h3>
<p>Modernizr 使用了一個非常聰明的方法來達成 CSS 判斷的功能，它在載入完成後將會自動檢測瀏覽器的支援情況並將其寫入 &lt;html&gt; 標籤的 class 屬性，其類別名稱的格式為：</p>
<p class="tip">支援：<strong>特性名稱</strong></p>
<p class="tip">不支援：<strong>no-特性名稱</strong></p>
</p>
<p><strong></strong></p>
<p>例如當瀏覽器支援支援 canvastext 時，&lt;html&gt;標籤的 class 屬性中將會有一個 <strong><font color="#800000">canvastext</font></strong> 值。</p>
<p>相反的當瀏覽器不支援 canvastext 時，&lt;html&gt;標籤的 class 屬性中將會有一個 <strong><font color="#800000">no-canvastext</font></strong>值。</p>
<p>如此一來我們就可以輕易的使用 CSS Selector 來做出相對應的判斷，例如，在 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:e0726f3c-2d84-4eae-aa0c-ab7c662515c4" 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;Modernizr Test&lt;/title&gt;
	&lt;link rel="stylesheet" href="style.css" type="text/css" media="screen"&gt;
	&lt;!--[if IE]&gt;
	&lt;script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"&gt;&lt;/script&gt;
	&lt;![endif]--&gt;
	&lt;script src="modernizr.min.js"&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
	&lt;div id="canvasContainer"&gt;
		 &lt;canvas id="c"&gt;&lt;/canvas&gt;
		 &lt;p class="supported"&gt;瀏覽器支援 canvastext&lt;/p&gt;
		 &lt;p class="noSupported"&gt;瀏覽器不支援 canvastext！&lt;/p&gt;
	&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
</div>
<p>在 style.css 中，透過以下的 CSS，在支援 canvastext 中將顯示「<strong>瀏覽器支援 canvastext</strong>」，反之則顯示「<strong>瀏覽器不支援 canvastext！</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:41348c61-527e-4e53-a9ce-466db63c7a6c" class="wlWriterEditableSmartContent">
<pre name="code" class="css:nogutter">#canvasContainer p{
	display: none;
}

.canvastext #canvasContainer .supported {
	display: block;
}

.no-canvastext #canvasContainer .noSupported {
   display: block;
}</pre>
</div>
<p><a href="http://blog.colorbase.tw/html5/modernizr/" target="_blank">點我觀看 Modernizr CSS Selector 檢測範例</a></p>
<p>同理，若要利用 CSS 判斷瀏覽器是否支援 video 則可使用「.video / .no-video」兩個 CSS 類別。</p>
<p>更多 Modernizr 支援的 HTML5 與 CSS3 特性檢測，請參閱其<a href="http://www.modernizr.com/docs/" target="_blank">使用手冊</a>。</p>
<h2>需注意的事情</h2>
<ol>
<li>Modernizr 只能提供檢測而不能替瀏覽器增加新功能以達成兼容。 </li>
<li>若要兼容 video 可使用 <a href="http://code.google.com/p/video4all/">video4all</a>來達成，更多詳情可參考 <a href="http://blog.colorbase.tw/web-development/947" target="_blank">開始HTML5 – Video</a>。 </li>
<li>若要讓 IE 6, 7, 8 支援 CSS3 可使用<a href="http://www.fetchak.com/ie-css3/" target="_blank">CSS3 support for IE</a>來達成。 </li>
</ol>
<h2>相關連結與參考文章</h2>
<ul>
<li><a href="http://www.modernizr.com/" target="_blank">Modernizr</a> </li>
<li><a href="http://diveintohtml5.org/everything.html" target="_blank">The All-In-One Almost-Alphabetical No-Bullshit Guide to Detecting Everything</a> </li>
<li><a href="http://diveintohtml5.org/detect.html" target="_blank">Detecting HTML5 Features</a> </li>
<li><a href="http://code.google.com/p/video4all/">video4all</a> </li>
<li><a href="http://www.fetchak.com/ie-css3/" target="_blank">CSS3 support for IE</a> </li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.colorbase.tw/web-development/1099/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>HTML5 與 CSS3 準備好了嗎？</title>
		<link>http://blog.colorbase.tw/web-development/1070</link>
		<comments>http://blog.colorbase.tw/web-development/1070#comments</comments>
		<pubDate>Sun, 16 May 2010 04:20:35 +0000</pubDate>
		<dc:creator>阿育</dc:creator>
				<category><![CDATA[Web開發]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[thinking]]></category>
		<category><![CDATA[trend]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[網路趨勢]]></category>
		<category><![CDATA[網頁設計]]></category>
		<category><![CDATA[網頁開發]]></category>
		<category><![CDATA[趨勢]]></category>

		<guid isPermaLink="false">http://blog.colorbase.tw/web-development/1070</guid>
		<description><![CDATA[HTML5 與 CSS3 不斷出現各種令人驚艷的應用，引起了業界的高度關注，它把許多原本屬於 Flash 的特殊應用搬到了 Web 標準中，而標準化的好處在哪我想不需要我多說了，但 HTML5 與 CSS3 真的準備好了嗎？
從 HTML &#38; CSS3 Readiness 這份圖表可以很容易看出一些關鍵，它把 HTML5 與 CSS3 從 2008 年到 2010 年各個主流瀏覽器的支援情形以扇形區色塊圖的方式呈現，每個瀏覽器及渲染引擎都有自己的色系。

目前支援度最高的新特性為 Drag and Drop / @font-face / contenteditable 。
目前支援度最佳的瀏覽器為 Chrome 與 Safari。
目前支援度最差的瀏覽器為 IE 系列。


HTML &#38; CSS3 Reandiness
HTML5 與  CSS3 現在最需要什麼？
良好的集成式開發環境
我想對於開發人員而言，最需要的還是工具，因為純手工編製複雜的 Web 應用可真是一件吃力不討好的工作，但我相信只要有市場便不怕沒工具，之前 Adobe CTO Kevin Lynch 也已經說要為HTML5開發工具了，我也相信在公開的標準規範之下將會有更多軟體開發商投入精力創造出更好用的產品。
廣泛的普及
既然工具的問題排除了，那麼剩下的便是普及性的問題了，但很顯然的它們仍然還沒完全準備好，在 When can I use ...]]></description>
			<content:encoded><![CDATA[<p>HTML5 與 CSS3 不斷出現各種令人驚艷的應用，引起了業界的高度關注，它把許多原本屬於 Flash 的特殊應用搬到了 Web 標準中，而標準化的好處在哪我想不需要我多說了，但 HTML5 與 CSS3 真的準備好了嗎？</p>
<p>從 <a href="http://html5readiness.com/" target="_blank">HTML &amp; CSS3 Readiness</a> 這份圖表可以很容易看出一些關鍵，它把 HTML5 與 CSS3 從 2008 年到 2010 年各個主流瀏覽器的支援情形以扇形區色塊圖的方式呈現，每個瀏覽器及渲染引擎都有自己的色系。<span id="more-1070"></span></p>
<ol>
<li>目前支援度最高的新特性為 Drag and Drop / @font-face / contenteditable 。</li>
<li>目前支援度最佳的瀏覽器為 Chrome 與 Safari。</li>
<li>目前支援度最差的瀏覽器為 IE 系列。</li>
</ol>
<p><a href="http://blog.colorbase.tw/wp-content/uploads/2010/05/html5_css3_readiness.jpg"><img style="display: inline; border-width: 0px;" title="html5_css3_readiness" src="http://blog.colorbase.tw/wp-content/uploads/2010/05/html5_css3_readiness_thumb.jpg" border="0" alt="html5_css3_readiness" width="400" height="286" /></a></p>
<p><a href="http://html5readiness.com/" target="_blank">HTML &amp; CSS3 Reandiness</a></p>
<h2>HTML5 與  CSS3 現在最需要什麼？</h2>
<h3>良好的集成式開發環境</h3>
<p>我想對於開發人員而言，最需要的還是工具，因為純手工編製複雜的 Web 應用可真是一件吃力不討好的工作，但我相信只要有市場便不怕沒工具，之前 <a href="http://techcrunch.com/2010/05/05/adobe-cto-kevin-lynch-were-going-to-make-the-best-tools-in-the-world-for-html5/" target="_blank">Adobe CTO Kevin Lynch 也已經說要為HTML5開發工具</a>了，我也相信在公開的標準規範之下將會有更多軟體開發商投入精力創造出更好用的產品。</p>
<h3>廣泛的普及</h3>
<p>既然工具的問題排除了，那麼剩下的便是普及性的問題了，但很顯然的它們仍然還沒完全準備好，在 <a href="http://caniuse.com/" target="_blank">When can I use</a> 裡面列出了目前HTML5個主流瀏覽器的支援情況，雖然這是一個支援度比較表，但命名更像是在抱怨。</p>
<h2>幾種 HTML5 與 CSS3 支援度參考資料</h2>
<ul>
<li><a href="http://html5readiness.com/" target="_blank">HTML &amp; CSS3 Reandiness</a></li>
<li><a href="http://www.findmebyip.com/" target="_blank">findmebyIP</a></li>
<li><a href="http://caniuse.com/" target="_blank">When can I use</a></li>
<li><a href="http://www.quirksmode.org/css/contents.html" target="_blank">CSS contents and browser compatibility</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.colorbase.tw/web-development/1070/feed</wfw:commentRss>
		<slash:comments>0</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>與你的夥伴線上討論設計或概念 &#8211; Cacoo</title>
		<link>http://blog.colorbase.tw/web-development/881</link>
		<comments>http://blog.colorbase.tw/web-development/881#comments</comments>
		<pubDate>Sun, 18 Apr 2010 13:09:17 +0000</pubDate>
		<dc:creator>阿育</dc:creator>
				<category><![CDATA[Web開發]]></category>
		<category><![CDATA[設計及影像處理]]></category>
		<category><![CDATA[軟體介紹]]></category>
		<category><![CDATA[online-tool]]></category>
		<category><![CDATA[wireframe]]></category>
		<category><![CDATA[網路工具]]></category>
		<category><![CDATA[網路資源]]></category>

		<guid isPermaLink="false">http://blog.colorbase.tw/web-development/881</guid>
		<description><![CDATA[Cacoo是一款很像Visio的免費線上工具，它可以用來繪製網站地圖、wireframe、UML、流程圖、網路圖等類型的圖表，其最大的特的點是它可以即時多人同時編輯。
以往當與夥伴處於異地而無法面對面直接溝通時，我們可能會用即時通訊軟體，你在那端、我在這端各自描述著自己的想法，遇到需要用圖形表示時只能透過即時通訊軟體或E-mail把編輯好的圖檔寄過去或用MSN之類的即時通訊軟體傳過去，這樣的過程不僅耗費不必要的時間，溝通起來也挺憋腳的，甚至還可能出現雞同鴨講的窘境。

現在透過Cacoo同時且即時的功能，我們將可以與夥伴的盡情的溝通，讓網路的溝通障礙減到最低，如果再搭配語音通訊的話，相信就更完美了。

Cacoo主要功能與特色

多人線上「即時」且「同時」編輯圖表。
可繪製網站地圖、wireframe、UML、流程圖及網路圖等類型的圖表。
內建簡易螢幕截圖工具，可直接擷取螢幕畫面並加入圖表中。
線上工具，走到哪用到哪。
提供多種圖形素材可直接套用，也可上傳自己的圖片。
內建即時通訊功能，就算沒裝MSN也能用溝通。

Screenshot
可繪製多種圖形，例如下圖的網路架構圖。

可繪製wireframe與夥伴溝同版面設計。

可邀請夥伴編輯同一份文件，當夥伴已經在編輯時，於文件列表中將會以「Editing」提示。

內建的即時通訊功能，沒有安裝MSN或Skype也能線上即時溝通(文字溝通)。

當對方在編輯內容時，可「即時」看到對方正在編輯的動作。

Cacoo官方的介紹影片

Cacoo &#8211; Real-time Collaborative Diagramming &#38; Design from Nulab Inc. on Vimeo.
相關連結
Cacoo 線上即時協作繪圖工具
]]></description>
			<content:encoded><![CDATA[<p><a href="http://cacoo.com/" target="_blank">Cacoo</a>是一款很像Visio的<strong>免費</strong>線上工具，它可以用來繪製網站地圖、wireframe、UML、流程圖、網路圖等類型的圖表，其最大的特的點是它可以<strong>即時多人同時編輯</strong>。</p>
<p>以往當與夥伴處於異地而無法面對面直接溝通時，我們可能會用即時通訊軟體，你在那端、我在這端各自描述著自己的想法，遇到需要用圖形表示時只能透過即時通訊軟體或E-mail把編輯好的圖檔寄過去或用MSN之類的即時通訊軟體傳過去，這樣的過程不僅耗費不必要的時間，溝通起來也挺憋腳的，甚至還可能出現雞同鴨講的窘境。</p>
<p><span id="more-881"></span></p>
<p>現在透過Cacoo同時且即時的功能，我們將可以與夥伴的盡情的溝通，讓網路的溝通障礙減到最低，如果再搭配語音通訊的話，相信就更完美了。</p>
<p><img style="display: inline; border-width: 0px;" title="image" src="http://blog.colorbase.tw/wp-content/uploads/2010/04/image9.png" border="0" alt="image" width="400" height="274" /></p>
<h2>Cacoo主要功能與特色</h2>
<ul>
<li>多人線上「<strong>即時</strong>」且「<strong>同時</strong>」編輯圖表。</li>
<li>可繪製網站地圖、wireframe、UML、流程圖及網路圖等類型的圖表。</li>
<li>內建簡易螢幕截圖工具，可直接擷取螢幕畫面並加入圖表中。</li>
<li>線上工具，走到哪用到哪。</li>
<li>提供多種圖形素材可直接套用，也可上傳自己的圖片。</li>
<li>內建即時通訊功能，就算沒裝MSN也能用溝通。</li>
</ul>
<h2>Screenshot</h2>
<p>可繪製多種圖形，例如下圖的網路架構圖。</p>
<p><a href="http://blog.colorbase.tw/wp-content/uploads/2010/04/image10.png"><img style="display: inline; border-width: 0px;" title="image" src="http://blog.colorbase.tw/wp-content/uploads/2010/04/image_thumb6.png" border="0" alt="image" width="400" height="248" /></a></p>
<p>可繪製wireframe與夥伴溝同版面設計。</p>
<p><a href="http://blog.colorbase.tw/wp-content/uploads/2010/04/image11.png"><img style="display: inline; border-width: 0px;" title="image" src="http://blog.colorbase.tw/wp-content/uploads/2010/04/image_thumb7.png" border="0" alt="image" width="400" height="248" /></a></p>
<p>可邀請夥伴編輯同一份文件，當夥伴已經在編輯時，於文件列表中將會以「Editing」提示。</p>
<p><img style="display: inline; border-width: 0px;" title="image" src="http://blog.colorbase.tw/wp-content/uploads/2010/04/image12.png" border="0" alt="image" width="263" height="309" /></p>
<p>內建的即時通訊功能，沒有安裝MSN或Skype也能線上即時溝通(文字溝通)。</p>
<p><a href="http://blog.colorbase.tw/wp-content/uploads/2010/04/image13.png"><img style="display: inline; border-width: 0px;" title="image" src="http://blog.colorbase.tw/wp-content/uploads/2010/04/image_thumb8.png" border="0" alt="image" width="400" height="248" /></a></p>
<p>當對方在編輯內容時，可「<strong>即時</strong>」看到對方正在編輯的動作。</p>
<p><img style="display: inline; border-width: 0px;" title="image" src="http://blog.colorbase.tw/wp-content/uploads/2010/04/image_thumb9.png" border="0" alt="image" width="400" height="301" /></p>
<p><strong>Cacoo官方的介紹影片</strong></p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="400" height="250" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=7502521&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed type="application/x-shockwave-flash" width="400" height="250" src="http://vimeo.com/moogaloop.swf?clip_id=7502521&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p><a href="http://vimeo.com/7502521">Cacoo &#8211; Real-time Collaborative Diagramming &amp; Design</a> from <a href="http://vimeo.com/user1881721">Nulab Inc.</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<h2>相關連結</h2>
<p><a href="http://cacoo.com/" target="_blank">Cacoo 線上即時協作繪圖工具</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.colorbase.tw/web-development/881/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>我一個半途夭折的想法</title>
		<link>http://blog.colorbase.tw/web-development/767</link>
		<comments>http://blog.colorbase.tw/web-development/767#comments</comments>
		<pubDate>Tue, 06 Apr 2010 10:33:51 +0000</pubDate>
		<dc:creator>阿育</dc:creator>
				<category><![CDATA[Web開發]]></category>
		<category><![CDATA[作品分享]]></category>
		<category><![CDATA[程式設計]]></category>
		<category><![CDATA[c-sharp]]></category>
		<category><![CDATA[thinking]]></category>

		<guid isPermaLink="false">http://blog.colorbase.tw/?p=767</guid>
		<description><![CDATA[在2008年底，我突發奇想的開始做了一個名為「拓客基地」的網站，這是一個聊天室網站，大約在2009一月底完成一個簡易的beta版，但卻在辛辛苦苦做完之後一直擺著沒去裡它，也從未對外公開它的網址。
與一些聊天室不同的是，這個聊天架構不是由Client(Browser)不斷送出Request，而是由Server在有需求時才送出訊息或通知。
直到最近pigo大在他的部落格中提到一種叫做Comet架構的概念，我才發現原來有這樣一種架構概念，在這之前我倒是沒有聽過，真是後知後覺啊。
在稍微了解過這種概念後發現與我當初想的好像頗為相似，重點似乎都是Server的主動，而不是不斷的請求，但我不是很確定是否有何不同，不過很恰巧的是Server端都是用C#寫的（硬要攀關係 XD）。
仔細想想這樣的運作架構或許有它的存在的價值，重點在於用在什麼地方。
因此今天又重新把這個網站整理一下搬了出來，有興趣的人不妨隨意玩玩，或許可以激起你另一個想法。
Screenshots
Web 聊天介面

室長端介面

網址：
http://tbase.colorbase.tw/
帳號：test  密碼：test
概念
這個聊天室架構不是由Client(Browser)不斷發送Request請求，而是讓聊天室成員與室長端建立一個固定的連線，換句話說是在有需求時訊息才會被傳遞，而室長端就是一個Server端，訊息流量都由使用者（室長與成員）自行承擔，缺點是使用者如果要當室長必須需要下載一個Client端軟體。
在這樣架構之下總共會有兩種Server端（HTTP Server不納入計算），一是中介Server，用於室長與聊天成員之間建立連線的媒介，處理一些狀態訊息等等，二是室長端。
但事實上，中介Server的角色在某些應用底下，它並不是一定要存在的，因此若單指聊天室長端的Server與聊天成員的運作來看，這樣的運作就會很像所謂的comet（希望我沒有會錯意）。
由於是固定連線的關係，因此在訊息的傳遞上非常即時，實測的結果，室長端使用一般家用網路其即時的效果跟MSN似乎不相上下，當然這取決於連線數量的多寡與頻寬條件。
如下簡圖：

圖示來自：
http://www.iconshock.com/
http://www.vistaicons.com/icon/i161s0/web_browsers_icons.htm
關於comet架構
這有一些文章可以參考：

http://lightyror.thegiive.net/2007/06/comet-push-server.html
http://www.pigo.idv.tw/archives/761
http://blog.roodo.com/rocksaying/archives/12010463.html

PS. pigo大最近打算釋出他的原始碼，有興趣的人不妨留意一下他的消息。
]]></description>
			<content:encoded><![CDATA[<p>在2008年底，我突發奇想的開始做了一個名為「拓客基地」的網站，這是一個聊天室網站，大約在2009一月底完成一個簡易的beta版，但卻在辛辛苦苦做完之後一直擺著沒去裡它，也從未對外公開它的網址。</p>
<p>與一些聊天室不同的是，這個聊天架構不是由Client(Browser)不斷送出Request，而是由Server在有需求時才送出訊息或通知。</p>
<p><span id="more-767"></span>直到最近<a href="http://www.pigo.idv.tw" target="_blank">pigo</a>大在他的部落格中提到一種叫做<a href="http://www.pigo.idv.tw/archives/781" target="_blank">Comet架構的概念</a>，我才發現原來有這樣一種架構概念，在這之前我倒是沒有聽過，真是後知後覺啊。</p>
<p>在稍微了解過這種概念後發現與我當初想的好像頗為相似，重點似乎都是Server的主動，而不是不斷的請求，但我不是很確定是否有何不同，不過很恰巧的是Server端都是用C#寫的（硬要攀關係 XD）。</p>
<p>仔細想想這樣的運作架構或許有它的存在的價值，重點在於用在什麼地方。</p>
<p>因此今天又重新把這個網站整理一下搬了出來，有興趣的人不妨隨意玩玩，或許可以激起你另一個想法。</p>
<h2>Screenshots</h2>
<p><strong>Web 聊天介面</strong></p>
<p><a href="http://blog.colorbase.tw/wp-content/uploads/2010/04/room_screen.png"><img class="alignnone size-medium wp-image-768" title="room_screen" src="http://blog.colorbase.tw/wp-content/uploads/2010/04/room_screen-300x199.png" alt="" width="300" height="199" /></a></p>
<p><strong>室長端介面</strong></p>
<p><a href="http://blog.colorbase.tw/wp-content/uploads/2010/04/screen_20090120180622.jpg"><img class="alignnone size-medium wp-image-777" title="screen_20090120180622" src="http://blog.colorbase.tw/wp-content/uploads/2010/04/screen_20090120180622-300x250.jpg" alt="" width="300" height="250" /></a></p>
<p>網址：</p>
<p><a href="http://tbase.colorbase.tw/" target="_blank">http://tbase.colorbase.tw/</a></p>
<p>帳號：test  密碼：test</p>
<h2>概念</h2>
<p>這個聊天室架構不是由Client(Browser)不斷發送Request請求，而是讓聊天室成員與室長端建立一個固定的連線，換句話說是在有需求時訊息才會被傳遞，而室長端就是一個Server端，訊息流量都由使用者（室長與成員）自行承擔，缺點是使用者如果要當室長必須需要下載一個Client端軟體。</p>
<p>在這樣架構之下總共會有兩種Server端（HTTP Server不納入計算），一是中介Server，用於室長與聊天成員之間建立連線的媒介，處理一些狀態訊息等等，二是室長端。</p>
<p>但事實上，中介Server的角色在某些應用底下，它並不是一定要存在的，因此若單指聊天室長端的Server與聊天成員的運作來看，這樣的運作就會很像所謂的comet（希望我沒有會錯意）。</p>
<p>由於是固定連線的關係，因此在訊息的傳遞上非常即時，實測的結果，室長端使用一般家用網路其即時的效果跟MSN似乎不相上下，當然這取決於連線數量的多寡與頻寬條件。</p>
<p>如下簡圖：</p>
<p><a href="http://blog.colorbase.tw/wp-content/uploads/2010/04/conception.jpg"><img class="alignnone size-medium wp-image-799" title="conception" src="http://blog.colorbase.tw/wp-content/uploads/2010/04/conception-300x176.jpg" alt="" width="300" height="176" /></a></p>
<p>圖示來自：</p>
<p><a href="http://www.iconshock.com/" target="_blank">http://www.iconshock.com/</a></p>
<p><a href="http://www.vistaicons.com/icon/i161s0/web_browsers_icons.htm" target="_blank">http://www.vistaicons.com/icon/i161s0/web_browsers_icons.htm</a></p>
<h2>關於comet架構</h2>
<p>這有一些文章可以參考：</p>
<ul>
<li><a href="http://lightyror.thegiive.net/2007/06/comet-push-server.html" target="_blank">http://lightyror.thegiive.net/2007/06/comet-push-server.html</a></li>
<li><a href="http://www.pigo.idv.tw/archives/761" target="_blank">http://www.pigo.idv.tw/archives/761</a></li>
<li><a href="http://blog.roodo.com/rocksaying/archives/12010463.html" target="_blank">http://blog.roodo.com/rocksaying/archives/12010463.html</a></li>
</ul>
<p>PS. <a href="http://www.pigo.idv.tw/" target="_blank">pigo</a>大最近打算釋出他的原始碼，有興趣的人不妨留意一下他的消息。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.colorbase.tw/web-development/767/feed</wfw:commentRss>
		<slash:comments>11</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>
	</channel>
</rss>

