<?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; javascript</title>
	<atom:link href="http://blog.colorbase.tw/tag/javascript/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>有趣的 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; 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>XRefresh &#8211; 網頁開發解放F5</title>
		<link>http://blog.colorbase.tw/web-development/667</link>
		<comments>http://blog.colorbase.tw/web-development/667#comments</comments>
		<pubDate>Sat, 06 Mar 2010 12:27:46 +0000</pubDate>
		<dc:creator>阿育</dc:creator>
				<category><![CDATA[Web開發]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[IE]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[XRefresh]]></category>

		<guid isPermaLink="false">http://blog.colorbase.tw/?p=659</guid>
		<description><![CDATA[在寫網頁的時候通常我們經常需要在編輯器與瀏覽器切換，這種情況特別容易發生在寫CSS及Javascript時，就算是使用的是視覺化的編輯器，例如Dreamweaver，也難以避免來回切換瀏覽器的來檢視最正確的結果，而且不僅需要來回切換檢視甚至還得不斷按F5重新整理網頁，長久下來這是一件非常費力的工作，XRefresh 便是解決這種困擾的工具。

運作方式
它的運作方式為透過安裝一個常駐於系統列的監視器，監視我們所設定的目錄及檔案，當檔案發生變動的時候，它會將資訊傳達給安裝於瀏覽器中的插件進行自動重新整理網頁的動作，而目前 XRefresh 提供Firefox及IE的插件。
以下是官方提供的運作示意圖：

via http://xrefresh.binaryage.com/
在 Windwos 上使用 XRefresh

首先必須安裝 XRefresh Monitor for Windows 這個安裝程式會自動安裝IE的插件（XRefresh Monitor 是以 .Net Framework開發的，請先確定系統中已經安裝.Net Framework）。
如果是Frirefox則必須安裝 Firebug 1.4 或 更高版本，並且安裝 XRefresh for Firefox Addon。

安裝完畢後啟動 Xrefresh 將會出現在系統列中：

接著按下Tryicon選單的Configuration，進行目錄監視設定：

以上圖的設定來說，我設定了監視D:\xrefresh_test\ 裡面的所有 Javascript的檔案
假設在那個目錄裡面有 index.html 裡面引入了 test.js，現在就可以使用Firefox 打開 index.html並於該分頁啟用Firebug，且將Xrefresh啟用：



現在只要我一更動test.js並儲存的話，那個分頁就會自動重新整理了，甚至如同官方所給的示意圖，裝上雙螢幕的話連切換都不必了，這樣是不是很方便、很有效率呢？
如果不想要重新整理整個頁面，還可以啟用「Use Soft Refresh for CSS」及「Use Soft Refresh for JS」讓XRefresh只重新載入CSS或JS而不是整個頁面重新載入。
至於IE的話概念上大同小異，有興趣的話可以觀看官方的介紹。
PS.XRefresh 支援 Windows 及 OSX。
相關連結


XRefresh 官方網站


]]></description>
			<content:encoded><![CDATA[<p>在寫網頁的時候通常我們經常需要在編輯器與瀏覽器切換，這種情況特別容易發生在寫CSS及Javascript時，就算是使用的是視覺化的編輯器，例如Dreamweaver，也難以避免來回切換瀏覽器的來檢視最正確的結果，而且不僅需要來回切換檢視甚至還得不斷按F5重新整理網頁，長久下來這是一件非常費力的工作，XRefresh 便是解決這種困擾的工具。</p>
<p><span id="more-667"></span></p>
<h2><span style="color: #008080;">運作方式</span></h2>
<p>它的運作方式為透過安裝一個常駐於系統列的監視器，監視我們所設定的目錄及檔案，當檔案發生變動的時候，它會將資訊傳達給安裝於瀏覽器中的插件進行自動重新整理網頁的動作，而目前 XRefresh 提供Firefox及IE的插件。</p>
<p>以下是官方提供的運作示意圖：</p>
<p><img class="alignnone size-medium wp-image-660" title="xrefesh howto" src="http://blog.colorbase.tw/wp-content/uploads/2010/03/howto.png" alt="" width="400" height="265" /></p>
<p>via <a href="http://xrefresh.binaryage.com/" target="_blank">http://xrefresh.binaryage.com/</a></p>
<h2><span style="color: #008080;">在 Windwos 上使用 XRefresh</span></h2>
<ul>
<li>首先必須安裝 <a href="http://xrefresh.googlecode.com/files/xrefresh-1.3.msi" target="_blank">XRefresh Monitor for Windows</a> 這個安裝程式會自動安裝IE的插件（XRefresh Monitor 是以 .Net Framework開發的，請先確定系統中已經安裝.Net Framework）。</li>
<li>如果是Frirefox則必須安裝 <a href="https://addons.mozilla.org/en-US/firefox/addons/versions/1843" target="_blank">Firebug 1.4 或 更高版本</a>，並且安裝 <a href="http://addons.mozilla.org/en-US/firefox/addon/7711/" target="_blank">XRefresh for Firefox Addon</a>。</li>
</ul>
<div>安裝完畢後啟動 Xrefresh 將會出現在系統列中：</div>
<p><img class="alignnone size-medium wp-image-661" title="xrefresh_tryicon" src="http://blog.colorbase.tw/wp-content/uploads/2010/03/xrefresh_tryicon.png" alt="" width="45" height="26" /></p>
<div>接著按下Tryicon選單的Configuration，進行目錄監視設定：</div>
<p><img class="alignnone size-medium wp-image-664" title="xrefresh_coinfig" src="http://blog.colorbase.tw/wp-content/uploads/2010/03/xrefresh_coinfig.png" alt="" width="440" height="219" /></p>
<div>以上圖的設定來說，我設定了監視D:\xrefresh_test\ 裡面的所有 Javascript的檔案</div>
<p>假設在那個目錄裡面有 index.html 裡面引入了 test.js，現在就可以使用Firefox 打開 index.html並於該分頁啟用Firebug，且將Xrefresh啟用：</p>
<div>
<div><img class="alignnone size-medium wp-image-662" title="xrefresh_firebug" src="http://blog.colorbase.tw/wp-content/uploads/2010/03/xrefresh_firebug.png" alt="" width="262" height="168" /></div>
</div>
<div>現在只要我一更動test.js並儲存的話，那個分頁就會自動重新整理了，甚至如同官方所給的示意圖，裝上雙螢幕的話連切換都不必了，這樣是不是很方便、很有效率呢？</div>
<p>如果不想要重新整理整個頁面，還可以啟用「Use Soft Refresh for CSS」及「Use Soft Refresh for JS」讓XRefresh只重新載入CSS或JS而不是整個頁面重新載入。</p>
<div>至於IE的話概念上大同小異，有興趣的話可以觀看<a href="http://xrefresh.binaryage.com/#windows" target="_blank">官方的介紹</a>。</div>
<p>PS.XRefresh 支援 Windows 及 <a href="http://xrefresh.binaryage.com/#osx" target="_blank">OSX</a>。</p>
<div>相關連結</div>
<div>
<ul>
<li><a href="http://xrefresh.binaryage.com/" target="_blank">XRefresh 官方網站</a></li>
</ul>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.colorbase.tw/web-development/667/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>網頁使用特殊字型的解決方案</title>
		<link>http://blog.colorbase.tw/web-development/651</link>
		<comments>http://blog.colorbase.tw/web-development/651#comments</comments>
		<pubDate>Tue, 15 Dec 2009 01:30:35 +0000</pubDate>
		<dc:creator>阿育</dc:creator>
				<category><![CDATA[Web開發]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[網頁設計]]></category>

		<guid isPermaLink="false">http://blog.colorbase.tw/?p=651</guid>
		<description><![CDATA[字型的兼容對於網頁設計而言是一個很頭痛的問題，如果在網頁中使用特殊字型，而訪客的電腦中沒有安裝這個字型，將會因為無法正確顯示字型而導致網頁的設計走味。因此一般在設計網頁的時候只能選擇通用的字型，如：Verdana, Geneva, sans-serif,Georgia這些芭樂到不行的字型，結果是可能會讓外觀大打折扣。

很久以前若要設計有字型樣式的文字，會用圖片來替代文字，但自從SEO觀念盛行之後，這個方法便不那麼恰當了，因為縱然使用alt或title屬性來加強描述也不是很被搜尋引擎建議的方法。
因為終極目標是除了外觀要美也要符合SEO的原則，所以目前最佳的解決之道便是「以純文字設計」，並於顯示時「替換為圖片、Flash或其他方式」。
為了解決這個困擾，曾經出現過很多不同的解決方案，在此介紹幾種已知的方法，每個方法各有利弊，實際應用時可以依照情況斟酌著使用。
1.CSS技巧 &#8211; Image Replacement
利用CSS耍點花招將文字隱藏，並以background屬性顯示圖片，來達到替換文字為「具有字體樣式的文字型圖片」效果，要將文字隱藏方法有很多，其中一個較簡便的方法就是利用text-indent將文字「縮」到看不見的地方。


#title{
	background: url(text.gif) no-repeat left top;
	width: 150px;
	height: 40px;
}

#title span{
	text-indent: -9999px;
}





	
文字

	



缺點：

如果想替換的地方很多的話，只能慢慢做到天荒地老、海枯石爛&#8230;.。
只能於設計階段手工製作，如果是動態產生的內容則無法使用這個方法。

優點：

不論是Client端或Server端都不需消耗額外的效能與資源（因為在設計階段，已經用設計人員的腦力與耐性抵消掉了&#8230;）

2. sIFR &#8211; Scalable Inman Flash Replacement
Flash所產生的SWF播放檔可以內嵌字體，sIFR就是利用這個特性，動態的以Javascript將文字用SWF元素替代，來達到呈現特殊字型的效果。
範例：
http://dev.novemberborn.net/sifr3/svn/test/distribution/demo/
相關網址：
官方網站：http://wiki.novemberborn.net/sifr/
sIFR3：http://novemberborn.net/sifr3
缺點：

內嵌中文字型將造成SWF非常肥大。

優點：

輕鬆簡單，Server端無需耗費額外硬體資源，Client端耗用資源幾乎可以忽略不計。

3. jQuery Flash Plugin &#8211; sIFR
sIFR功能是這個jQuery Plugin的其中一個功能，一樣也是利用SWF播放檔可以內嵌字體的特性來達成替代文字的效果。
相關網址：
http://jquery.lukelutman.com/plugins/flash/index.html
http://jquery.lukelutman.com/plugins/flash/example-text-replacement.html
範例：
http://jquery.lukelutman.com/plugins/flash/example-text-replacement.html
優缺點同sIFR。
4. cufon
這是相當有趣的一項技術，它提供一個產生器(PHP寫的)，能將字型檔案TrueType (TTF), OpenType (OTF), Printer Font Binary (PFB)，轉換為一個Javascript格式的字型檔(或者可以說它是一個javascript的字型定義檔)，再即時的利用javascript透過canvas 與 VML，動態於網頁中繪出字體，並取代對應的網頁元素。
相關網址：
http://cufon.shoqolate.com/generate/
http://wiki.github.com/sorccu/cufon
範例：
http://www.acidsmile.co.uk/
更多範例：http://wiki.github.com/sorccu/cufon/demos
優點：

預先轉換字型檔，把解讀的工作交給Client端，可節省Server的資源耗用。

缺點：

中文字型產生的檔案太大了！字型檔是用MB計算的。
IE6與IE7這兩個市佔率最高的大老不支援，IE8才支援。

5. facelift
使用PHP在Server端產生對應的圖片，並於前端用javascript替換對應的HTML元素。
http://facelift.mawhorter.net/
優點：

以圖片達成，因此沒有瀏覽器顯示支援的問題，也不需安裝任何Plugin(Flash是一種Plugin)。
訪客瀏覽時只需下載特換過的特殊字型圖片，沒有中文字型過大的問題。

缺點：

Server端的loading比較重，但它具有cache可以抵消掉很多負擔。
Server必須能執行PHP。

範例：
http://facelift.mawhorter.net/examples/
碎碎念一下：
中文的博大精深為我們奠定了深厚的文化基礎，但中文的繁雜在印刷術發明後已經吃過一次虧，現在又吃了一記悶棍，簡體字也仍然保留缺點，真可謂成也蕭何敗也蕭何啊！
]]></description>
			<content:encoded><![CDATA[<p>字型的兼容對於網頁設計而言是一個很頭痛的問題，如果在網頁中使用特殊字型，而訪客的電腦中沒有安裝這個字型，將會因為無法正確顯示字型而導致網頁的設計走味。因此一般在設計網頁的時候只能選擇通用的字型，如：Verdana, Geneva, sans-serif,Georgia這些芭樂到不行的字型，結果是可能會讓外觀大打折扣。</p>
<p><span id="more-651"></span></p>
<p>很久以前若要設計有字型樣式的文字，會用圖片來替代文字，但自從SEO觀念盛行之後，這個方法便不那麼恰當了，因為縱然使用alt或title屬性來加強描述也不是很被搜尋引擎建議的方法。</p>
<p>因為終極目標是除了外觀要美也要符合SEO的原則，所以目前最佳的解決之道便是「以純文字設計」，並於顯示時「替換為圖片、Flash或其他方式」。</p>
<p>為了解決這個困擾，曾經出現過很多不同的解決方案，在此介紹幾種已知的方法，每個方法各有利弊，實際應用時可以依照情況斟酌著使用。</p>
<h2><span style="color: #008080;">1.CSS技巧 &#8211; Image Replacement</span></h2>
<p>利用CSS耍點花招將文字隱藏，並以background屬性顯示圖片，來達到替換文字為「具有字體樣式的文字型圖片」效果，要將文字隱藏方法有很多，其中一個較簡便的方法就是利用text-indent將文字「縮」到看不見的地方。</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="css:nogutter">
#title{
	background: url(text.gif) no-repeat left top;
	width: 150px;
	height: 40px;
}

#title span{
	text-indent: -9999px;
}
</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="wlWriterEditableSmartContent">
<pre name="code" class="xml:nogutter">
<html>
	<body>
<h1 id="title"><span>文字</span></h1>

	</body>
</html>
</pre>
</div>
<p><span style="color: #008080;"><strong>缺點：</strong></span></p>
<ul>
<li>如果想替換的地方很多的話，只能慢慢做到天荒地老、海枯石爛&#8230;.。</li>
<li>只能於設計階段手工製作，如果是動態產生的內容則無法使用這個方法。</li>
</ul>
<p><span style="color: #008080;"><strong>優點：</strong></span></p>
<ul>
<li>不論是Client端或Server端都不需消耗額外的效能與資源（因為在設計階段，已經用設計人員的腦力與耐性抵消掉了&#8230;）</li>
</ul>
<h2><span style="color: #008080;">2. sIFR &#8211; Scalable Inman Flash Replacement</span></h2>
<p>Flash所產生的SWF播放檔可以內嵌字體，sIFR就是利用這個特性，動態的以Javascript將文字用SWF元素替代，來達到呈現特殊字型的效果。</p>
<p><span style="color: #008080;"><strong>範例：</strong></span></p>
<p><a href="http://dev.novemberborn.net/sifr3/svn/test/distribution/demo/" target="_blank">http://dev.novemberborn.net/sifr3/svn/test/distribution/demo/</a></p>
<p><span style="color: #008080;"><strong>相關網址：</strong></span></p>
<p>官方網站：<a href="http://wiki.novemberborn.net/sifr/" target="_blank">http://wiki.novemberborn.net/sifr/</a></p>
<p>sIFR3：<a href="http://novemberborn.net/sifr3" target="_blank">http://novemberborn.net/sifr3</a></p>
<p><span style="color: #008080;"><strong>缺點：</strong></span></p>
<ul>
<li>內嵌中文字型將造成SWF非常肥大。</li>
</ul>
<p><span style="color: #008080;"><strong>優點：</strong></span></p>
<ul>
<li>輕鬆簡單，Server端無需耗費額外硬體資源，Client端耗用資源幾乎可以忽略不計。</li>
</ul>
<h2><span style="color: #008080;">3. jQuery Flash Plugin &#8211; sIFR</span></h2>
<p>sIFR功能是這個jQuery Plugin的其中一個功能，一樣也是利用SWF播放檔可以內嵌字體的特性來達成替代文字的效果。</p>
<p><span style="color: #008080;"><strong>相關網址：</strong></span></p>
<p><a href="http://jquery.lukelutman.com/plugins/flash/index.html" target="_blank">http://jquery.lukelutman.com/plugins/flash/index.html</a></p>
<p><a href="http://jquery.lukelutman.com/plugins/flash/example-text-replacement.html" target="_blank">http://jquery.lukelutman.com/plugins/flash/example-text-replacement.html</a></p>
<p><span style="color: #008080;"><strong>範例：</strong></span></p>
<p><span style="color: #008080;"><strong></strong></span><a href="http://jquery.lukelutman.com/plugins/flash/example-text-replacement.html" target="_blank">http://jquery.lukelutman.com/plugins/flash/example-text-replacement.html</a></p>
<p>優缺點同sIFR。</p>
<h2><span style="color: #008080;">4. cufon</span></h2>
<p>這是相當有趣的一項技術，它提供一個產生器(PHP寫的)，能將字型檔案TrueType (TTF), OpenType (OTF), Printer Font Binary (PFB)，轉換為一個Javascript格式的字型檔(或者可以說它是一個javascript的字型定義檔)，再即時的利用javascript透過canvas 與 VML，動態於網頁中繪出字體，並取代對應的網頁元素。</p>
<p><span style="color: #008080;"><strong>相關網址：</strong></span></p>
<p><a href="http://cufon.shoqolate.com/generate/" target="_blank">http://cufon.shoqolate.com/generate/</a></p>
<p><a href="http://wiki.github.com/sorccu/cufon" target="_blank">http://wiki.github.com/sorccu/cufon</a></p>
<p><span style="color: #008080;"><strong>範例：</strong></span></p>
<p><a href="http://www.acidsmile.co.uk/" target="_blank">http://www.acidsmile.co.uk/</a></p>
<p>更多範例：<a href="http://wiki.github.com/sorccu/cufon/demos" target="_blank">http://wiki.github.com/sorccu/cufon/demos</a></p>
<p><strong><span style="color: #008080;">優點：</span></strong></p>
<ul>
<li>預先轉換字型檔，把解讀的工作交給Client端，可節省Server的資源耗用。</li>
</ul>
<p><span style="color: #008080;"><strong>缺點：</strong></span></p>
<ul>
<li>中文字型產生的檔案太大了！字型檔是用MB計算的。</li>
<li>IE6與IE7這兩個市佔率最高的大老不支援，IE8才支援。</li>
</ul>
<h2><span style="color: #008080;">5. facelift</span></h2>
<p>使用PHP在Server端產生對應的圖片，並於前端用javascript替換對應的HTML元素。</p>
<p><a href="http://facelift.mawhorter.net/" target="_blank">http://facelift.mawhorter.net/</a></p>
<p><span style="color: #008080;"><strong>優點：</strong></span></p>
<ul>
<li>以圖片達成，因此沒有瀏覽器顯示支援的問題，也不需安裝任何Plugin(Flash是一種Plugin)。</li>
<li>訪客瀏覽時只需下載特換過的特殊字型圖片，沒有中文字型過大的問題。</li>
</ul>
<p><span style="color: #008080;"><strong>缺點：</strong></span></p>
<ul>
<li>Server端的loading比較重，但它具有cache可以抵消掉很多負擔。</li>
<li>Server必須能執行PHP。</li>
</ul>
<p><span style="color: #008080;"><strong>範例：</strong></span></p>
<p><span style="color: #008080;"><strong></strong></span><a href="http://facelift.mawhorter.net/examples/" target="_blank">http://facelift.mawhorter.net/examples/</a></p>
<blockquote><p>碎碎念一下：</p>
<p>中文的博大精深為我們奠定了深厚的文化基礎，但中文的繁雜在印刷術發明後已經吃過一次虧，現在又吃了一記悶棍，簡體字也仍然保留缺點，真可謂成也蕭何敗也蕭何啊！</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.colorbase.tw/web-development/651/feed</wfw:commentRss>
		<slash:comments>4</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>解決一個頁面有兩個FCKeditor時，無法使用FCKeditorAPI.GetInstance的問題</title>
		<link>http://blog.colorbase.tw/programming/509</link>
		<comments>http://blog.colorbase.tw/programming/509#comments</comments>
		<pubDate>Thu, 18 Sep 2008 05:56:19 +0000</pubDate>
		<dc:creator>阿育</dc:creator>
				<category><![CDATA[程式設計]]></category>
		<category><![CDATA[FCKeditor]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://blog.colorbase.tw/?p=509</guid>
		<description><![CDATA[FCKeditor跟Wordpress使用的TinyMCE一樣，都是OpenSource的WYSIWYG Editor(所見即所得編輯器)，一直以來比較習慣用FCKeditor這套編輯器來幫網頁加入可以編輯HTML的功能，但今天突然發現如果一個頁面有兩個FCKeditor且在Firefox運行時，若要使用FCKeditorAPI.GetInstance()來取得編輯器的instance，只有第一個可以正確取得，第二個將會是undefined，第三個以上沒試但應該也難逃厄運了。

運行環境：

Firefox 3.0.1
FCKeditor 2.6.3

發生錯誤可能原因：

fckeditorcode_gecko.js 有Bug
Firefox有Bug或與FCKeditor有小部份衝突

解決概念：
如果是第一個原因，我實在沒興趣把壓縮過的fckeditorcode_gecko.js解回來檢查(壓縮過都還有253K啊！)，更別說Firefox有bug能幫上什麼忙了，不過幸好在FCKeditor JavaScript API有提到，可以建立一個名為FCKeditor_OnComplete的callback function，當FCKeditor載入完畢後將會呼叫這個function並傳入一個參數，這個參數就是目前裝載完畢的FCKeditor Instance，只要把這個參數記錄下來，就可以直接使用Instance，不需要用FCKeditorAPI.GetInstance()來取得，這樣一來便解決問題了。
解決方式：
在FCKeditor載入之前加入以下Javascript


//修正FckEditor錯誤
var __fckEditorInstance_  = new Array();//用來儲存FCKeditor Instance的陣列

function FCKeditor_OnComplete( editorInstance )
{
	__fckEditorInstance_[editorInstance.Name] = editorInstance;
}

function getFckInst(idname)
{
	return __fckEditorInstance_[idname];
}


之後就可以利用getFckInst()來代替FCKeditorAPI.GetInstance()取得FCKeditor Instance
]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.fckeditor.net/" target="_blank">FCKeditor</a>跟Wordpress使用的<a href="http://tinymce.moxiecode.com/" target="_blank">TinyMCE</a>一樣，都是OpenSource的WYSIWYG Editor(所見即所得編輯器)，一直以來比較習慣用FCKeditor這套編輯器來幫網頁加入可以編輯HTML的功能，但今天突然發現如果一個頁面有兩個FCKeditor且在Firefox運行時，若要使用FCKeditorAPI.GetInstance()來取得編輯器的instance，只有第一個可以正確取得，第二個將會是undefined，第三個以上沒試但應該也難逃厄運了。<br />
<span id="more-509"></span><br />
<span style="color: #008080;"><strong>運行環境：</strong></span></p>
<ul>
<li>Firefox 3.0.1</li>
<li>FCKeditor 2.6.3</li>
</ul>
<p><span style="color: #008080;"><strong>發生錯誤可能原因：</strong></span></p>
<ol>
<li>fckeditorcode_gecko.js 有Bug</li>
<li>Firefox有Bug或與FCKeditor有小部份衝突</li>
</ol>
<p><span style="color: #008080;"><strong>解決概念：</strong></span></p>
<p>如果是第一個原因，我實在沒興趣把壓縮過的fckeditorcode_gecko.js解回來檢查(壓縮過都還有253K啊！)，更別說Firefox有bug能幫上什麼忙了，不過幸好在<a href="http://docs.fckeditor.net/FCKeditor_2.x/Developers_Guide/JavaScript_API" target="_blank">FCKeditor JavaScript API</a>有提到，可以建立一個名為FCKeditor_OnComplete的callback function，當FCKeditor載入完畢後將會呼叫這個function並傳入一個參數，這個參數就是目前裝載完畢的FCKeditor Instance，只要把這個參數記錄下來，就可以直接使用Instance，不需要用FCKeditorAPI.GetInstance()來取得，這樣一來便解決問題了。</p>
<p><span style="color: #008080;"><strong>解決方式：</strong></span></p>
<p>在FCKeditor載入之前加入以下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">
//修正FckEditor錯誤
var __fckEditorInstance_  = new Array();//用來儲存FCKeditor Instance的陣列

function FCKeditor_OnComplete( editorInstance )
{
	__fckEditorInstance_[editorInstance.Name] = editorInstance;
}

function getFckInst(idname)
{
	return __fckEditorInstance_[idname];
}
</pre>
</div>
<p>之後就可以利用getFckInst()來代替FCKeditorAPI.GetInstance()取得FCKeditor Instance</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.colorbase.tw/programming/509/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

