<?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>Life["Breathing"] &#187; jquery</title>
	<atom:link href="http://blog.hsin.tw/tag/jquery/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.hsin.tw</link>
	<description></description>
	<lastBuildDate>Fri, 06 Jan 2012 10:42:37 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>jquery .trigger()的用法</title>
		<link>http://blog.hsin.tw/2011/jquery-trigger-howtouse/</link>
		<comments>http://blog.hsin.tw/2011/jquery-trigger-howtouse/#comments</comments>
		<pubDate>Tue, 10 May 2011 04:55:56 +0000</pubDate>
		<dc:creator>hsin</dc:creator>
				<category><![CDATA[jquery]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://blog.hsin.tw/?p=441</guid>
		<description><![CDATA[到今天才知道trigger()的用法 ._. 今天用這個jquery輪播的plugin http://jqueryfordesigners.com/jquery-infinite-carousel/ 他裡面有bind()了一個跳頁數的method 但是我折騰了一兩個小時 都不知道怎麼用阿！！！NO！！！ 上個廁所突然豁然開朗 原來是要用trigger()阿！！！(摸鬍子) 以下是剪貼官網的範例 首先當然是bind一個新的method 可以是click, focus 這些javascript原本就有的 或是自己取名字也行~ (上面的例子就是custom) 要觸發 就是用.trigger()囉 有參數的話 後面第二個參數用一個陣列帶入！ 收工！ 不錯不錯 希望不會再忘了]]></description>
			<content:encoded><![CDATA[<p>到今天才知道trigger()的用法 ._.<br />
<span id="more-441"></span></p>
<p>今天用這個jquery輪播的plugin<br />
<a href="http://jqueryfordesigners.com/jquery-infinite-carousel/" target="_blank">http://jqueryfordesigners.com/jquery-infinite-carousel/</a><br />
他裡面有bind()了一個跳頁數的method<br />
但是我折騰了一兩個小時 都不知道怎麼用阿！！！NO！！！</p>
<p>上個廁所突然豁然開朗 原來是要用trigger()阿！！！(摸鬍子)<br />
以下是剪貼<a href="http://api.jquery.com/trigger/" target="_blank">官網</a>的範例</p>
<pre class="brush: jscript; title: ; notranslate">
$('#foo').bind('custom', function(event, param1, param2) {
    alert(param1 + &quot;\n&quot; + param2);
});
$('#foo').trigger('custom', ['Custom', 'Event']);
</pre>
<p>首先當然是bind一個新的method<br />
可以是click, focus 這些javascript原本就有的<br />
或是自己取名字也行~ (上面的例子就是custom)</p>
<p>要觸發 就是用.trigger()囉<br />
有參數的話 後面第二個參數用一個陣列帶入！<br />
收工！<br />
不錯不錯<br />
希望不會再忘了</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hsin.tw/2011/jquery-trigger-howtouse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQuery Plugin : ClockPick 選取時間</title>
		<link>http://blog.hsin.tw/2009/jquery-plugin-clockpick/</link>
		<comments>http://blog.hsin.tw/2009/jquery-plugin-clockpick/#comments</comments>
		<pubDate>Sat, 19 Sep 2009 06:14:14 +0000</pubDate>
		<dc:creator>hsin</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[plugin]]></category>

		<guid isPermaLink="false">http://blog.hsin.tw/?p=368</guid>
		<description><![CDATA[網路上可以找到很多月曆的js程式 但是選取時間的程式相對少很多 前陣子找到了這個基於jquery的選取時間程式ClockPick 使用的方法很直覺 也有數個參數可以設定以達到自己的需求 demo就直接去該網頁看囉 範例下載]]></description>
			<content:encoded><![CDATA[<p>網路上可以找到很多月曆的js程式<span id="more-368"></span><br />
但是選取時間的程式相對少很多<br />
前陣子找到了這個基於jquery的選取時間程式<a target="_blank" href="http://www.jnathanson.com/index.cfm?page=jquery/clockpick/ClockPick">ClockPick</a><br />
使用的方法很直覺<br />
也有數個參數可以設定以達到自己的需求<br />
demo就直接去該網頁看囉</p>
<p><a href="http://ex.hsin.tw/files/clockpick.zip">範例下載</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hsin.tw/2009/jquery-plugin-clockpick/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>jQuery in Action</title>
		<link>http://blog.hsin.tw/2009/jquery-in-action/</link>
		<comments>http://blog.hsin.tw/2009/jquery-in-action/#comments</comments>
		<pubDate>Wed, 01 Jul 2009 11:54:43 +0000</pubDate>
		<dc:creator>hsin</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[html]]></category>

		<guid isPermaLink="false">http://blog.hsin.tw/?p=337</guid>
		<description><![CDATA[這些只是我大概記一下的內容 要詳細閱讀跟學習jQuery還是買本書比較實在喔~ 原文書網址：jQuery in Action 中文版：jQuery實戰手冊 原文電子書版本：咕狗"jquery in action ebook" http://jquery.com/ 這本書是以jQuery 1.2.1版為基礎 ch.1 Introuducing jQuery&#160; jQuery概略介紹 ch.2 Creating the wrapped element set&#160; 建立elements set ch.3 Bringing pages to life with jQuery&#160; 讓頁面上的東西更生動 ch.4 Events are where it happens!&#160; events的操作 &#8230; <a href="http://blog.hsin.tw/2009/jquery-in-action/">繼續閱讀 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>這些只是我大概記一下的內容<br />
<span id="more-337"></span><br />
要詳細閱讀跟學習jQuery還是買本書比較實在喔~<br />
原文書網址：<a href="http://www.manning.com/bibeault/" target="_blank">jQuery in Action</a><br />
中文版：<a href="http://findbook.tw/book/9789861816388/basic" target="_blank">jQuery實戰手冊</a><br />
原文電子書版本：<a href="http://tinyurl.com/d3tbsq" target="_blank">咕狗"jquery in action ebook"</a></p>
<p><a href="http://jquery.com/" target="_blank">http://jquery.com/</a><br />
這本書是以jQuery 1.2.1版為基礎</p>
<p><a style="font-weight:bold;" target="_blank" href="http://blog.hsin.tw/2009/jquery-in-action-ch1-introuducing-jquery/">ch.1 Introuducing jQuery</a>&nbsp;<br />
jQuery概略介紹</p>
<p><a style="font-weight:bold;" target="_blank" href="http://blog.hsin.tw/2009/jquery-in-action-ch2-creating-the-wrapped-element-set/">ch.2 Creating the wrapped element set</a>&nbsp;<br />
建立elements set</p>
<p><a style="font-weight:bold;" target="_blank" href="http://blog.hsin.tw/2009/jquery-in-action-ch3/">ch.3 Bringing pages to life with jQuery</a>&nbsp;<br />
讓頁面上的東西更生動</p>
<p><a style="font-weight:bold;" target="_blank" href="http://blog.hsin.tw/2009/jquery-in-action-ch4/">ch.4 Events are where it happens!</a>&nbsp;<br />
events的操作</p>
<p><a style="font-weight:bold;" target="_blank" href="http://blog.hsin.tw/2009/jquery-in-action-ch5/">ch.5 Sprucing up with animations and effects</a>&nbsp;<br />
動畫及效果</p>
<p><a style="font-weight:bold;" target="_blank" href="http://blog.hsin.tw/2009/jquery-in-action-ch-6/">ch.6 jQuery utility functions</a>&nbsp;<br />
通用函式</p>
<p><a style="font-weight:bold;" target="_blank" href="http://blog.hsin.tw/2009/jquery-in-action-ch-7/">ch.7 Extending jQuery with custom plugins</a>&nbsp;<br />
自訂擴充plugin</p>
<p><a style="font-weight:bold;" target="_blank" href="http://blog.hsin.tw/2009/jquery-in-action-ch8/">ch.8 Talk to the server with Ajax</a>&nbsp;<br />
ajax介紹</p>
<p><b>ch.9 Prominent, powerful,and practical plugins</b><br />
plugin介紹<br />
<a href="http://docs.jquery.com/Plugins" target="_blank">http://docs.jquery.com/Plugins</a>&nbsp;<br />
<a href="http://jquery.com/plugins/most_popular" target="_blank">http://jquery.com/plugins/most_popular</a>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hsin.tw/2009/jquery-in-action/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQuery in Action Ch.8 筆記</title>
		<link>http://blog.hsin.tw/2009/jquery-in-action-ch8/</link>
		<comments>http://blog.hsin.tw/2009/jquery-in-action-ch8/#comments</comments>
		<pubDate>Tue, 30 Jun 2009 12:05:45 +0000</pubDate>
		<dc:creator>hsin</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[html]]></category>

		<guid isPermaLink="false">http://blog.hsin.tw/?p=323</guid>
		<description><![CDATA[ch.8 Talk to the server with Ajax .method{background-color:#ffffcc;color:#000000;margin:10px;width:250px;text-align:center;} .title{background-color:#dddddd;color:#000000;margin-top:25px;} .subtitle{background-color:#eeeeee;color:#000000;;margin-top:10px;} 8.1 Brushing up on Ajax 簡單地說明了ajax運作的過程 8.2 Loading content into elements 8.2.1 Loading content with jQuery 首先先介紹jQuery中ajax最簡單的一個command load(url,parameters,callback) url是要求的網址 parameters是以object形式帶入的參數 如果有值是使用POST method，省略的話則是使用GET method callback是當load好的值已經被放入elements後執行的function 這個function有三個參數 response text、the status code跟the XHR &#8230; <a href="http://blog.hsin.tw/2009/jquery-in-action-ch8/">繼續閱讀 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>ch.8 Talk to the server with Ajax<br />
<span id="more-323"></span></p>
<style>
.method{background-color:#ffffcc;color:#000000;margin:10px;width:250px;text-align:center;}
.title{background-color:#dddddd;color:#000000;margin-top:25px;}
.subtitle{background-color:#eeeeee;color:#000000;;margin-top:10px;}
</style>
<div class="title">8.1 Brushing up on Ajax</div>
<p><!--div class="subtitle">8.1.1 Creating an XHR instance</div>
<div class="subtitle">8.1.2 Initiating the request</div>
<div class="subtitle">8.1.3 Keeping track of progress</div>
<div class="subtitle">8.1.4 Getting the response</div-->
簡單地說明了ajax運作的過程</p>
<div class="title">8.2 Loading content into elements</div>
<div class="subtitle">8.2.1 Loading content with jQuery</div>
<p>首先先介紹jQuery中ajax最簡單的一個command</p>
<div class="method">load(url,parameters,callback)</div>
<p>url是要求的網址<br />
parameters是以object形式帶入的參數<br />
如果有值是使用POST method，省略的話則是使用GET method<br />
callback是當load好的值已經被放入elements後執行的function<br />
這個function有三個參數 response text、the status code跟the XHR instance</p>
<pre class="brush: jscript; title: ; notranslate">
$('.injectMe').load('/someResource #div');
</pre>
<p>這個例子會讀取/someResource頁面的東西<br />
並將內容填入所有class=injectMe的elements中<br />
有一點可以提的是 在url這個參數中 如果只是要取得該頁面上部份的內容時<br />
可以在後面加上selector<br />
像這個例子就是取得/someResource中&lt;div>裡的內容</p>
<div class="method">serialize()</div>
<p>而如果要使用表單中的值帶入參數<br />
可以利用serialize()來將要傳送的值轉成query string</p>
<pre class="brush: xml; title: ; notranslate">
&lt;form id=&quot;form1&quot; name=&quot;form1&quot;&gt;
&lt;input type=&quot;text&quot; name=&quot;myname&quot; value=&quot;joe&quot;&gt;
&lt;input type=&quot;text&quot; name=&quot;age&quot; value=&quot;18&quot;&gt;
&lt;input type=&quot;text&quot; name=&quot;city&quot; value=&quot;taipei&quot;&gt;
&lt;/form&gt;
</pre>
<pre class="brush: jscript; title: ; notranslate">
var str = $(&quot;#form1&quot;).serialize();
//str會轉成這樣
// myname=joe&amp;age=18&amp;city=taipei
</pre>
<div class="method">serializeArray()</div>
<p>而serializeArray()則是會返回一個object</p>
<pre class="brush: jscript; title: ; notranslate">
var myobj = $(&quot;#form1&quot;).serializeArray();
</pre>
<p>myobj會轉成這樣<br />
[{name: 'myname', value:'joe'},{name: 'age', value:'18'},{name: 'city', value:'taipei'}]</p>
<div class="subtitle">8.2.2 Loading dynamic inventory data</div>
<p>舉一個賣鞋的頁面來練習load()</p>
<div class="title">8.3 Making GET and POST requests</div>
<div class="subtitle">8.3.1 Getting data with jQuery</div>
<div class="method">$.get(url,parameters,callback)</div>
<p>以get method連線</p>
<pre class="brush: jscript; title: ; notranslate">
$.get(
	'getmydata.php',
	{a:1, b:2, c:3},
	function(data){alert(data);}
);
</pre>
<p>url是要求的網址<br />
parameters是參數(Object或是字串)<br />
callback是返回的function 這個function可以有兩個參數 第一個是返回的內容 第二個是status</p>
<div class="subtitle">8.3.2 Getting JSON data</div>
<div class="method">$.getJSON(url,parameters,callback)</div>
<p>url是要求的網址<br />
parameters是參數(Object或是字串)<br />
callback是返回的function 這個function可以有兩個參數 第一個是返回的內容 第二個是status<br />
與$.get()相同 但是是返回JSON形式的值</p>
<div class="subtitle">8.3.3 Making POST requests</div>
<div class="method">$.post(url,parameters,callback)</div>
<p>以post method連線<br />
url是要求的網址<br />
parameters是參數(Object或是字串)<br />
callback是返回的function 這個function可以有兩個參數 第一個是返回的內容 第二個是status</p>
<div class="title">8.4 Taking full control of an Ajax request</div>
<p>前一節介紹的是簡易的ajax連線方式<br />
這節則是會介紹比較詳細 可以設定較多細節的方式</p>
<div class="subtitle">8.4.1 Making Ajax requests with all the trimmings</div>
<div class="method">$.ajax(options)</div>
<p>可以帶的參數很多<br />
這裡舉較常使用的三個<br />
其他的可以到<a href="http://docs.jquery.com/Ajax/jQuery.ajax#toptions" target="_blank">docs</a>看</p>
<pre class="brush: jscript; title: ; notranslate">
$.ajax({
  url: &quot;test.js&quot;,
  type: &quot;GET&quot;,
  dataType: &quot;script&quot;
});
</pre>
<p>url是要求的網址<br />
type是POST或是GET<br />
dataType是返回值的形式 可以填入的有xml、xml、xml、json、jsonp、text</p>
<div class="subtitle">8.4.2 Setting request defaults</div>
<div class="method">$.ajaxSetup(properties)</div>
<p>$.ajaxSetup()設定同一個頁面中$.ajax()可以共用的參數<br />
可以帶入的參數也就是前一小節(8.4.1)所說的參數<br />
這個不會影響到load()<br />
而設定type時也不會影響到$.get()跟$.post()</p>
<div class="subtitle">8.4.3 Global functions</div>
<p>除了可以用$.ajaxSetup()預設參數外<br />
還有在ajax連線中的不同階段可以使用的function<br />
ajaxStart()、ajaxSend()、ajaxSuccess()、ajaxError()、ajaxComplete()、ajaxStop()<br />
可以到<a href="http://docs.jquery.com/Ajax" target="_blank">docs</a>看</p>
<div class="title">8.5 Putting it all together</div>
<p>是一個綜合練習的例子</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hsin.tw/2009/jquery-in-action-ch8/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQuery in Action Ch.7 筆記</title>
		<link>http://blog.hsin.tw/2009/jquery-in-action-ch-7/</link>
		<comments>http://blog.hsin.tw/2009/jquery-in-action-ch-7/#comments</comments>
		<pubDate>Tue, 23 Jun 2009 12:03:52 +0000</pubDate>
		<dc:creator>hsin</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[瀏覽器]]></category>

		<guid isPermaLink="false">http://blog.hsin.tw/?p=316</guid>
		<description><![CDATA[ch.7 Extending jQuery with custom plugins .method{background-color:#ffffcc;color:#000000;margin:10px;width:200px;text-align:center;} .title{background-color:#dddddd;color:#000000;margin-top:25px;} .subtitle{background-color:#eeeeee;color:#000000;;margin-top:10px;} 7.1 Why extend? 使用自訂擴充的plugin可以讓程式及設計有一致性 而且建立重複使用的設計有很多優點 繼承進而擴充了jQuery裡原本就存在的功能更是可以讓事情變得更簡單 7.2 The jQuery plugin authoring guidelines 要建立自訂擴充的plugin需要一定的規範及規則 以確保可以與其他plugin甚至是其他js lib正常地運作 Extending jQuery包含了像是Utility functions或是Methods兩種形式 7.2.1 Naming files and functions 為了避免plugin的檔名與原本已經在使用或是其他人建立的檔名重複 這邊提了三點建議 1.以jquery為開頭(可以避免與不是以jQuery為基礎的其他js檔重複) 2.接著可以寫這個plugin的名字 3.最後以.js結尾 以書中的例子來說 如果要寫一個名為Fred的plugin 其檔名可以命名為jquery.fred.js &#8230; <a href="http://blog.hsin.tw/2009/jquery-in-action-ch-7/">繼續閱讀 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>ch.7 Extending jQuery with custom plugins<br />
<span id="more-316"></span></p>
<style>
.method{background-color:#ffffcc;color:#000000;margin:10px;width:200px;text-align:center;}
.title{background-color:#dddddd;color:#000000;margin-top:25px;}
.subtitle{background-color:#eeeeee;color:#000000;;margin-top:10px;}
</style>
<div class="title">7.1 Why extend?</div>
<p>使用自訂擴充的plugin可以讓程式及設計有一致性<br />
而且建立重複使用的設計有很多優點<br />
繼承進而擴充了jQuery裡原本就存在的功能更是可以讓事情變得更簡單</p>
<div class="title">7.2 The jQuery plugin authoring guidelines</div>
<p>要建立自訂擴充的plugin需要一定的規範及規則<br />
以確保可以與其他plugin甚至是其他js lib正常地運作<br />
Extending jQuery包含了像是Utility functions或是Methods兩種形式</p>
<div class="subtitle">7.2.1 Naming files and functions</div>
<p>為了避免plugin的檔名與原本已經在使用或是其他人建立的檔名重複<br />
這邊提了三點建議<br />
1.以jquery為開頭(可以避免與不是以jQuery為基礎的其他js檔重複)<br />
2.接著可以寫這個plugin的名字<br />
3.最後以.js結尾<br />
以書中的例子來說<br />
如果要寫一個名為Fred的plugin<br />
其檔名可以命名為<b>jquery.fred.js</b></p>
<p>另一個有用的方法 可以上<a href="http://docs.jquery.com/Plugins">jQuery收集plugin的地方</a>找找看<br />
如果看到相同的名字就可以避免重複囉</p>
<p>同樣的避免function名字與別人重複到<br />
也是一樣的方法</p>
<div class="subtitle">7.2.2 Beware the $</div>
<pre class="brush: jscript; title: ; notranslate">
jQuery('#myitem').show();
</pre>
<p>如果是自己在寫jQuery的script時<br />
常常會使用$來代替jQuery的寫法<br />
但是在寫plugin時<br />
則是可以使用jQuery來寫<br />
以避免不確定性(例如同頁面有使用prototype.js)囉<br />
或是如前一章6.2所提的</p>
<pre class="brush: jscript; title: ; notranslate">
(function($){
//
// 在這裡使用$
//
})(jQuery);
</pre>
<p>寫在這裡面時就可以用$囉</p>
<div class="subtitle">7.2.3 Taming complex parameter lists</div>
<p>在使用plugin時可能會需要傳入不同的參數來運用<br />
但是有時只需要用預設值就好了</p>
<pre class="brush: jscript; title: ; notranslate">
//例如有一個function有7個參數
function complex(p1,p2,p3,p4,p5,p6,p7) {/* ... */}
//
//但有時只需要填入p1或是p7的值來使用
complex(valueA,null,null,null,null,null,valueB);
//
//甚或是這樣
complex(valueA,null,valueC,valueD,null,null,valueB);
</pre>
<p>這樣會造成傳入及讀取參數的複雜度<br />
所以可以使用下面的方法來取代</p>
<pre class="brush: jscript; title: ; notranslate">
complex(valueA, {
  p3: valueC,
  p4: valueD,
  p7: valueB
});
</pre>
<p>將一定要傳入的參數如同之前一樣的設定置放<br />
而把其他有時候可以省略的參數合併放在一個object中<br />
這樣便不用在意是第幾個參數省略<br />
或是傳入了多少個參數了</p>
<p>在plugin裡要使用參數的時候<br />
可以利用6.3.6講到的$.extend()</p>
<pre class="brush: jscript; title: ; notranslate">
function complex(p1,options){
  var settings = $.extend({
    option1: defaultValue1,
    option2: defaultValue2,
    option3: defaultValue3,
    option4: defaultValue4,
    option5: defaultValue5,
    option6: defaultValue6
  },options||{});
  //其他script
}
</pre>
<p>因為$.extend()裡排在後面的object會把前面的object中有相同的property值蓋過去<br />
所以如果有填入參數 就會使用填入的參數<br />
不然就是使用預設的參數<br />
而有一點要注意的是<b>||{}</b>這個地方<br />
當完全沒有填入參數時<br />
就都使用plugin中的預設值</p>
<div class="title">7.3 Writing custom utility functions</div>
<pre class="brush: jscript; title: ; notranslate">
(function($){
//
// 在這裡使用$
//
})(jQuery);
</pre>
<p>就如同7.2.2講的<br />
如果在plugin中有大量使用到jQuery自己本身的method<br />
可以使用上面這樣的方法<br />
就可以在裡面使用$ 而不受到干擾</p>
<div class="subtitle">7.3.1 Creating a data manipulation utility function</div>
<div class="subtitle">7.3.2 Writing a date formatter</div>
<p>這兩小節各別有一個Utility functions類型的自訂擴充練習</p>
<div class="title">7.4 Adding new wrapper methods</div>
<p>要建立wrapper methods是使用<b>$.fn</b><br />
下面是一個簡單的例子</p>
<pre class="brush: jscript; title: ; notranslate">
(function($){
  $.fn.makeItBlue = function() {
    return this.css('color','blue');
  }
})(jQuery);
</pre>
<p>通常來說 除非是特殊需要<br />
否則return的值仍是該wrapped set<br />
這樣才能繼續在chain中使用這組elements</p>
<div class="subtitle">7.4.1 Applying multiple operations in a wrapper method</div>
<div class="subtitle">7.4.2 Retaining state within a wrapper method</div>
<p>這兩小節各別有一個wrapper method類型的自訂擴充練習</p>
<pre class="brush: jscript; title: ; notranslate">
(function($){
  //將settings定義在這裡 才能讓其他的methods(如下面的showPhoto)使用到
  var settings;
  //主要的plugin
  $.fn.photomatic = function(callerSettings) {
    //如同7.2.3所講的參數用法一樣
    settings = $.extend({
      photoElement: '#photomaticPhoto',
      lastControl: null
    }, callerSettings || {});
    //plugin所執行的功能
    settings.thumbnails = this.filter('img');
    settings.thumbnails.click(function(){ showPhoto(this.index); });
    //如果有需要 可以給一個初始值
    showPhoto(0);
    //返回同樣的wrapped set
    return this;
  };
  //將重複性的功能另外寫一個method
  var showPhoto = function(index) {
    settings.photoElement
      .attr('src',settings.transformer(settings.thumbnails[index].src));
    settings.current = index;
  };
})(jQuery);
</pre>
<p>在7.4.2中 講解的例子架構大概是上面這樣(有刪掉部份的東西)</p>
<p><!--<br />
-本章小節-<br />
自己寫plugin我還沒嘗試過<br />
下次來踹踹<br />
(有結跟沒結一樣...)<br />
--></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hsin.tw/2009/jquery-in-action-ch-7/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>jQuery in Action Ch.6 筆記</title>
		<link>http://blog.hsin.tw/2009/jquery-in-action-ch-6/</link>
		<comments>http://blog.hsin.tw/2009/jquery-in-action-ch-6/#comments</comments>
		<pubDate>Fri, 19 Jun 2009 12:11:36 +0000</pubDate>
		<dc:creator>hsin</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[瀏覽器]]></category>

		<guid isPermaLink="false">http://blog.hsin.tw/?p=304</guid>
		<description><![CDATA[ch.6 jQuery utility functions .method{background-color:#ffffcc;color:#000000;margin:10px;width:200px;text-align:center;} .title{background-color:#dddddd;color:#000000;margin-top:25px;} .subtitle{background-color:#eeeeee;color:#000000;;margin-top:10px;} 這章會介紹除了操作elements外的utility functions 6.1 Using the jQuery flags 這節要介紹三個jQuery flags $.browser $.boxModel $.styleFloat 6.1.1 Detecting the user agent (jQuery1.3已經不建議使用$.browser，而有新增一個新的物件$.support) 檢測使用者所用的瀏覽器 一開始是先介紹使用判斷method的方法 而這個可能發生的問題是 method可以使用 但是裡面帶的參數因為不同的瀏覽器而有不同的意義 所以jQuery提供了一個辨識瀏覽器的方法 $.browser 會有下面幾個值 $.browser.msie $.browser.mozilla $.browser.safari $.browser.opera $.browser.version 前面四個返回的是boolean值 是將瀏覽器歸類到四大類 &#8230; <a href="http://blog.hsin.tw/2009/jquery-in-action-ch-6/">繼續閱讀 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>ch.6 jQuery utility functions<br />
<span id="more-304"></span></p>
<style>
.method{background-color:#ffffcc;color:#000000;margin:10px;width:200px;text-align:center;}
.title{background-color:#dddddd;color:#000000;margin-top:25px;}
.subtitle{background-color:#eeeeee;color:#000000;;margin-top:10px;}
</style>
<p>這章會介紹除了操作elements外的utility functions</p>
<div class="title">6.1 Using the jQuery flags</div>
<p>這節要介紹三個jQuery flags<br />
$.browser<br />
$.boxModel<br />
$.styleFloat</p>
<div class="subtitle">6.1.1 Detecting the user agent</div>
<div style="color:#cc0000;">(jQuery1.3已經不建議使用$.browser，而有新增一個新的物件<a href="http://docs.jquery.com/Utilities/jQuery.support" target="_blank">$.support</a>)</div>
<p>檢測使用者所用的瀏覽器<br />
一開始是先介紹使用判斷method的方法</p>
<pre class="brush: jscript; title: ; notranslate">
if (element.attachEvent) {
  element.attachEvent('onclick',someHandler);
}
else if (element.addEventListener) {
  element.addEventListener('click',someHandler);
}
else {
  throw new Error('event handling not supported');
}
</pre>
<p>而這個可能發生的問題是 method可以使用<br />
但是裡面帶的參數因為不同的瀏覽器而有不同的意義<br />
所以jQuery提供了一個辨識瀏覽器的方法</p>
<div class="method">$.browser</div>
<pre class="brush: jscript; title: ; notranslate">
if($.browser.msie){
	alert('這是IE瀏覽器');
}
</pre>
<p>會有下面幾個值<br />
$.browser.msie<br />
$.browser.mozilla<br />
$.browser.safari<br />
$.browser.opera<br />
$.browser.version<br />
前面四個返回的是boolean值<br />
是將瀏覽器歸類到四大類<br />
如果為該類即返回true<br />
其餘會是false<br />
而有些瀏覽器因為版本不同 也可能會有差異 所以$.browser.version是使用的版本</p>
<p>建議是method方法也無法判別了才使用$.browser</p>
<div class="subtitle">6.1.2 Determining the box model</div>
<div style="color:#cc0000;">(jQuery1.3已經不建議使用$.boxModel，而有新增一個新的物件<a href="http://docs.jquery.com/Utilities/jQuery.support" target="_blank">$.support</a>)</div>
<div class="method">$.boxModel</div>
<p>$.boxModel返回一個boolean值<br />
當是使用W3C standard box model時返回true<br />
而使用IE box model(或是說traditional box model)時返回false<br />
這個需要用到的時機<br />
書中提到的是關於width跟height的解釋<br />
使用W3C standard box model時<br />
計算width跟height不會包含padding跟border的pixels<br />
而IE box model則會包含<br />
所以可能會造成elements的大小在不同瀏覽器看起來會不太一樣</p>
<div class="subtitle">6.1.3 Detecting the correct float style to use</div>
<div class="method">$.styleFloat</div>
<p>在不同的瀏覽器對於float有不同的名字<br />
在IE是styleFloat 其他的則是cssFloat<br />
所以使用$.styleFloat就不用擔心這個問題了</p>
<pre class="brush: jscript; title: ; notranslate">
element.style[$.styleFloat] = 'left';
</pre>
<p>不過通常使用css(&#8216;float&#8217;)就可以了<br />
$.styleFloat主要是給plugins或是extensions製作的人使用</p>
<div class="title">6.2 Using other libraries with jQuery</div>
<div class="method">$.noConflict()</div>
<p>在Ch1有稍微提到<br />
如果在同個頁面上要使用其他的javascript library<br />
可以使用$.noConflict()來避免衝突</p>
<pre class="brush: jscript; title: ; notranslate">
var $j = jQuery.noConflict();
</pre>
<p>這樣就可以使用$j來代替jQuery或是$了</p>
<p>或是可以使用下面這樣</p>
<pre class="brush: jscript; title: ; notranslate">
//要注意有帶參數$喔
(function($) { /* function body here */ })(jQuery);
//或是下面這個ready function
jQuery(function($){alert('$ = '+ $);});
</pre>
<p>在裡面就還是可以使用$來操作囉</p>
<div class="title">6.3 Manipulating JavaScript objects and collections</div>
<div class="subtitle">6.3.1 Trimming strings</div>
<div class="method">$.trim(value)</div>
<pre class="brush: jscript; title: ; notranslate">
$('#someField').val($.trim($('#someField').val()));
</pre>
<p>就像PHP中trim()的函式<br />
將字串前後的空白都消除掉<br />
在表單驗證中很常用到</p>
<div class="subtitle">6.3.2 Iterating through properties and collections</div>
<div class="method">$.each(container,callback)</div>
<p>對一個array或object中的值依序作處理</p>
<pre class="brush: jscript; title: ; notranslate">
var anArray = ['one','two','three'];
$.each(anArray,function(n,value) {
  //do something here
});
var anObject = {one:1, two:2, three:3};
$.each(anObject,function(name,value) {
  //do something here
});
</pre>
<p>container是要處理的array或是object<br />
callback是作處理的function<br />
這個function會有兩個參數 第一個是index 第二個是value</p>
<div class="subtitle">6.3.3 Filtering arrays</div>
<div class="method">$.grep(array,callback,invert)</div>
<p>以某個條件過濾一個array以生成另一個新的array </p>
<pre class="brush: jscript; title: ; notranslate">
var arr = [ 1, 9, 3, 8, 6, 1, 5, 9, 4, 7, 3, 8, 6, 9, 1 ];
var newarr = $.grep(arr, function(n, i){
					      return (n &gt; 5);
					    });
//新生成的newarr會是 [9, 8, 6, 9, 7, 8, 6, 9]
</pre>
<p>第一個參數array很明顯的就是要處理的array<br />
第二個參數callback是作處理的function 會有兩個參數 第一個是value 第二個是index<br />
第三個參數invert是個boolean值<br />
如果省略invert或是填寫false時 當callback返回值為true的話 就會將這個值放進新生成的array中<br />
如果invert填入true 則當callback返回值為false才會將這個值放進新生成的array中</p>
<pre class="brush: jscript; title: ; notranslate">
var bigNumbers = $.grep(originalArray,'a&gt;100');
//這時jQuery會自己建立一個function
function(a,i){return a&gt;100;}
//而a就是value ,i就是index
</pre>
<p>如上所示 callback也可以簡寫為一個string</p>
<div class="subtitle">6.3.4 Translating arrays</div>
<div class="method">$.map(array,callback)</div>
<p>對一個array作處理並生成為一個新array<br />
第一個參數array是要處理的array<br />
第二個參數callback是作處理的function 會有兩個參數 第一個是value 第二個是index</p>
<pre class="brush: jscript; title: ; notranslate">
//將array中的每個值都+1
var oneBased = $.map([0,1,2,3,4],function(value){return value+1;});
//callback如同$.grep()一樣 也是可以寫成一個string
var oneBased = $.map([0,1,2,3,4],'a+1');
</pre>
<p>而有一點要注意的是<br />
如果callback返回值為null或是undefined<br />
則這個值就不會被放進新array中<br />
所以新的array元素個數是有可能比原本的array少</p>
<pre class="brush: jscript; title: ; notranslate">
var characters = $.map(
  ['that','other thing'],
  function(value){return value.split('');}
);
//characters會是['t','h','a','t','o','t','h','e','r',' ','t','h','i','n','g']
</pre>
<p>如上所示 另一個可以提的是<br />
如果callback處理值完之後 回傳的是一個array<br />
則會將這些所有回傳的array都和在同一個新的array中</p>
<div class="subtitle">6.3.5 More fun with JavaScript arrays</div>
<div class="method">$.inArray(value,array)</div>
<p>判斷一個array中有沒有某個值</p>
<pre class="brush: jscript; title: ; notranslate">
var index = $.inArray(2,[1,2,3,4,5]);
//會返回1
</pre>
<p>第一個參數value是要判斷的值<br />
當第二個參數array中遇到第一個值為value的時候 會返回其index<br />
找不到的時候則會返回-1</p>
<div class="method">$.makeArray(object)</div>
<pre class="brush: jscript; title: ; notranslate">
var images = document.getElementsByTagName(&quot;img&quot;);
//這樣是一個NodeList
</pre>
<p>將一個array-like object(像是一個NodeList)轉換成array</p>
<div class="method">$.unique(array)</div>
<p>將array中相同的值剔除掉</p>
<div class="subtitle">6.3.6 Extending objects</div>
<div class="method">$.extend(target,source1,source2, &#8230; sourceN)</div>
<p>將數個object合併<br />
下面是一個簡單的例子</p>
<pre class="brush: jscript; title: ; notranslate">
var target =  { a: 1, b: 2, c: 3 };
var source1 = { c: 4, d: 5, e: 6 };
var source2 = { e: 7, f: 8, g: 9 };
$.extend(target,source1,source2);
</pre>
<p>如果沒有返回給一個新的object<br />
則是會合併在第一個參數target<br />
而這個例子中 target會變為{a: 1, b: 2, c: 4, d: 5, e: 7, f: 8, g: 9}<br />
有一點要注意的是<br />
如果objects中有相同的property 則後面的object的會蓋過前面的<br />
(這個例子就是source1的c:4會蓋過target的c:4，source2的e:7會蓋過source1的e:6)</p>
<div class="title">6.4 Dynamically loading scripts</div>
<div class="method">$.getScript(url,callback)</div>
<p>依據條件或是情況下再讀取其他的外部script 而不是在頁面load時就讀取script<br />
第一個參數url是要讀取的script的路徑<br />
第二個參數是讀取script完成後會執行的function</p>
<p><!--[本章小結]<br />
我以前比較少用到utility functions的東西<br />
所以這章講的東西大多都是第一次見到<br />
有些東西看起來<br />
用了應該是可以省很多力氣的~<br />
但是還是要多想多練習才知道哪裡需要用或是用得到--></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hsin.tw/2009/jquery-in-action-ch-6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQuery in Action Ch.5 筆記</title>
		<link>http://blog.hsin.tw/2009/jquery-in-action-ch5/</link>
		<comments>http://blog.hsin.tw/2009/jquery-in-action-ch5/#comments</comments>
		<pubDate>Tue, 16 Jun 2009 11:50:49 +0000</pubDate>
		<dc:creator>hsin</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[html]]></category>

		<guid isPermaLink="false">http://blog.hsin.tw/?p=297</guid>
		<description><![CDATA[ch.5 Sprucing up with animations and effects .method{background-color:#ffffcc;color:#000000;margin:10px;width:200px;text-align:center;} .title{background-color:#dddddd;color:#000000;margin-top:25px;} .subtitle{background-color:#eeeeee;color:#000000;;margin-top:10px;} 5.1 Showing and hiding elements 要簡單地顯示或隱藏elements 是使用show()以及hide()這兩個方法 這裡還有提到一點就是 如果頁面上某個element要預設成隱藏 書裡推薦的是在頁面load完後再使用hide()將他隱藏 會比直接在style裡加display:none;好 5.1.1 Implementing a collapsible list 這個小節利用一個巢狀列表 以顯示或是隱藏裡面的資訊來練習show()及hide() 5.1.2 Toggling the display state of elements 還有一個可以切換顯示或是隱藏elements的方法 toggle() 當elements是隱藏的時候 使用toggle()會將他顯示 相反也是一樣 &#8230; <a href="http://blog.hsin.tw/2009/jquery-in-action-ch5/">繼續閱讀 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>ch.5 Sprucing up with animations and effects<br />
<span id="more-297"></span></p>
<style>
.method{background-color:#ffffcc;color:#000000;margin:10px;width:200px;text-align:center;}
.title{background-color:#dddddd;color:#000000;margin-top:25px;}
.subtitle{background-color:#eeeeee;color:#000000;;margin-top:10px;}
</style>
<div class="title">5.1 Showing and hiding elements</div>
<p>要簡單地顯示或隱藏elements 是使用<b>show()</b>以及<b>hide()</b>這兩個方法</p>
<pre class="brush: jscript; title: ; notranslate">
$(&quot;#myimg&quot;).hide();
$(&quot;#myimg&quot;).show();
</pre>
<p>這裡還有提到一點就是<br />
如果頁面上某個element要預設成隱藏<br />
書裡推薦的是在頁面load完後再使用hide()將他隱藏<br />
會比直接在style裡加display:none;好</p>
<div class="subtitle">5.1.1 Implementing a collapsible list</div>
<p>這個小節利用一個巢狀列表 以顯示或是隱藏裡面的資訊來練習show()及hide()</p>
<div class="subtitle">5.1.2 Toggling the display state of elements</div>
<p>還有一個可以切換顯示或是隱藏elements的方法 <b>toggle()</b></p>
<pre class="brush: jscript; title: ; notranslate">
$(&quot;#myimg&quot;).toggle();
</pre>
<p>當elements是隱藏的時候 使用toggle()會將他顯示 相反也是一樣</p>
<div class="title">5.2 Animating the display state of elements</div>
<p>這節是要介紹比較不突兀的顯示或隱藏elements的方法<br />
利用一些effect來讓這個動作比較平滑</p>
<div class="subtitle">5.2.1 Showing and hiding elements gradually</div>
<div class="method">hide(speed,callback)</div>
<pre class="brush: jscript; title: ; notranslate">
$(&quot;#myimg&quot;).show('fast');
$(&quot;#myimg&quot;).hide(2000);
</pre>
<p>第一個參數speed可以填入數字(以毫秒為單位)或是字串(slow、normal、fast)<br />
如果省略的話 則是會像上節講的一樣直接隱藏<br />
第二個參數callback是擺一個function 當這個動作完成時會執行</p>
<div class="method">show(speed,callback)</div>
<div class="method">toggle(speed,callback)</div>
<p>同樣的 show()跟toggle()的用法也是一樣<br />
第一個參數speed可以填入數字(以毫秒為單位)或是字串(slow、normal、fast)<br />
第二個參數callback是擺一個function 當這個動作完成時會執行</p>
<div class="subtitle">5.2.2 Fading elements into and out of existence</div>
<p>另一種顯示或隱藏的方法是改變elements的透明度直到完全透明或是完全顯示<br />
<b>fadeIn()</b>跟<b>fadeOut()</b></p>
<div class="method">fadeOut(speed,callback)</div>
<div class="method">fadeIn(speed,callback)</div>
<pre class="brush: jscript; title: ; notranslate">
$(&quot;#myimg&quot;).fadeOut('fast');
</pre>
<p>(與show()、hide()、toggle()的參數用法一樣)<br />
第一個參數speed可以填入數字(以毫秒為單位)或是字串(slow、normal、fast) 沒填入的話預設是normal<br />
第二個參數callback是擺一個function 當這個動作完成時會執行</p>
<p>另一個方法<b>fadeTo()</b>則是可以調整elements的透明度</p>
<div class="method">fadeTo(speed,opacity,callback)</div>
<pre class="brush: jscript; title: ; notranslate">
$(&quot;#myimg&quot;).fadeTo('fast',0.5);
</pre>
<p>第一個參數speed可以填入數字(以毫秒為單位)或是字串(slow、normal、fast) 沒填入的話預設是normal<br />
第二個參數opacity是透明度 他的範圍可以填入0.0 ~ 1.0<br />
第三個參數callback是擺一個function 當這個動作完成時會執行</p>
<div class="subtitle">5.2.3 Sliding elements up and down</div>
<p>還有另一種顯示或隱藏的方法是將elements慢慢向上收回或是慢慢向下展開<br />
<b>slideDown()</b>跟<b>slideUp()</b>及切換的<b>slideToggle()</b></p>
<div class="method">slideDown(speed,callback)</div>
<div class="method">slideUp(speed,callback)</div>
<div class="method">slideToggle(speed,callback)</div>
<pre class="brush: jscript; title: ; notranslate">
$(&quot;#myimg&quot;).slideDown(1000);
$(&quot;#myimg&quot;).slideToggle('slow');
</pre>
<p>(與show()、hide()、toggle()的參數用法一樣)<br />
第一個參數speed可以填入數字(以毫秒為單位)或是字串(slow、normal、fast) 沒填入的話預設是normal<br />
第二個參數callback是擺一個function 當這個動作完成時會執行</p>
<div class="subtitle">5.2.4 Stopping animations</div>
<div class="method">stop()</div>
<p>當要停止某個elements的動作時 要使用stop()</p>
<div class="title">5.3 Creating custom animations</div>
<p>jQuery提供了一個方法<b>animate()</b> 可以讓我們自己設計想要elements作的動作</p>
<div class="method" style="width:300px;">animate(properties,duration,easing,callback)</div>
<div class="method">animate(properties,options)</div>
<pre class="brush: jscript; title: ; notranslate">
$('#animateMe').animate(
	{opacity:0,top:0}
  ,'slow'
  ,function(){ $(this).hide(); }
);
</pre>
<p>properties是填入一個object 而這個object要包含所有最後要達到css stlye<br />
(例如elements的寬度要達到600px 之類的)<br />
duration可以填入數字(以毫秒為單位)或是字串(slow、normal、fast) 沒填入的話預設是normal<br />
easing是漸變的方式 有兩種內建的方式linear(線性)、swing(搖擺)<br />
callback是擺一個function 當這個動作完成時會執行<br />
options是填入一個object 而這個object則是可以填入上面講過的duration、easing跟complete(也就是上面說的callback)<br />
還有另一個可以填入的是queue 如果設定為false 則這個動作會立即被執行(也就是如果後面也跟著另一個animate() 這個動作會同時執行)<br />
<b>[update]</b><br />
如果要設定顏色的漸變 還要再裝<a href="http://plugins.jquery.com/project/color" target="_blank">plugin</a></p>
<div class="subtitle">5.3.1 A custom scale animation</div>
<p>先介紹一個改變尺寸的例子</p>
<pre class="brush: jscript; title: ; notranslate">
$('.animateMe').each(function(){
	$(this).animate(
		{
			width: $(this).width() * 2,
			height: $(this).height() * 2
		},
		2000
	);
});
</pre>
<p>將class=animateMe的elements在2秒(2000毫秒)的時間內將長寬都各別變大為兩倍</p>
<div class="subtitle">5.3.2 A custom drop animation</div>
<p>介紹一個drop的例子</p>
<pre class="brush: jscript; title: ; notranslate">
$('.animateMe').each(function(){
	$(this)
		.css('position','relative')
		.animate(
			{
				opacity: 0,
				top: $(window).height() - $(this).height() - $(this).position().top
			},
			'slow',
			function(){ $(this).hide(); });
});
</pre>
<p>要先將elements的position設定為relative(因為這樣才能動)<br />
改變class=animateMe的elements的透明度及高度<br />
最後會被移到畫面的底部 並且透明度會變0(也就是完全透明)<br />
然後再將elements隱藏起來</p>
<p>有一點可以提的是<br />
如果將opacity:0改成opacity:"hide"<br />
這個動作最後完成時會直接將elements隱藏<br />
同時也不需要最後的callback的function</p>
<div class="subtitle">5.3.3 A custom puff animation</div>
<p>一個擴散並消失的例子<br />
將前兩小節的功能結合在一起</p>
<pre class="brush: jscript; title: ; notranslate">
$('.animateMe').each(function(){
	var position = $(this).position();
	$(this)
		.css({position:'absolute',top:position.top,
					left:position.left})
		.animate(
			{
        opacity: 'hide',
        width: $(this).width() * 5,
        height: $(this).height() * 5,
        top: position.top - ($(this).height() * 5 / 2),
        left: position.left - ($(this).width() * 5 / 2)
      },
      'normal');
});
</pre>
<p>因為在擴散的過程中 elements的位置會向右下方長大<br />
所以同時也要改變位置 讓看起來的位置像沒有變一樣(真繞舌)<br />
首先要改變position為absolute 並給定目前的top跟left<br />
然後最終要到達的狀態是<br />
opacity就跟前一小節講的一樣 hide的意思就是最後會隱藏起來<br />
寬度跟高度則是變為原來的五倍<br />
top跟left則是要計算成會讓elements的中心點像是沒有變一樣(也就是向四方擴散)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hsin.tw/2009/jquery-in-action-ch5/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>jQuery in Action Ch.4 筆記</title>
		<link>http://blog.hsin.tw/2009/jquery-in-action-ch4/</link>
		<comments>http://blog.hsin.tw/2009/jquery-in-action-ch4/#comments</comments>
		<pubDate>Wed, 10 Jun 2009 11:08:02 +0000</pubDate>
		<dc:creator>hsin</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[html]]></category>

		<guid isPermaLink="false">http://blog.hsin.tw/?p=272</guid>
		<description><![CDATA[ch4 Events are where it happens! .method{background-color:#ffffcc;color:#000000;margin:10px;width:200px;text-align:center;} .title{background-color:#dddddd;color:#000000;margin-top:25px;} .subtitle{background-color:#eeeeee;color:#000000;;margin-top:10px;} 4.1 Understanding the browser event models 4.1.1 The DOM Level 0 Event Model 4.1.2 The DOM Level 2 Event Model 4.1.3 The Internet Explorer Event Model 解釋了DOM中event操作的方式 以及IE自己獨到的model 那就是這樣了 繼續讀下去 絕對不是我翻不出來XD &#8230; <a href="http://blog.hsin.tw/2009/jquery-in-action-ch4/">繼續閱讀 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>ch4 Events are where it happens!<br />
<span id="more-272"></span></p>
<style>
.method{background-color:#ffffcc;color:#000000;margin:10px;width:200px;text-align:center;}
.title{background-color:#dddddd;color:#000000;margin-top:25px;}
.subtitle{background-color:#eeeeee;color:#000000;;margin-top:10px;}
</style>
<div class="title">4.1 Understanding the browser event models</div>
<p>4.1.1 The DOM Level 0 Event Model<br />
4.1.2 The DOM Level 2 Event Model<br />
4.1.3 The Internet Explorer Event Model<br />
解釋了DOM中event操作的方式<br />
以及IE自己<del datetime="2009-06-10T09:08:13+00:00">獨到</del>的model<br />
那就是這樣了 繼續讀下去<br />
<del datetime="2009-06-10T09:08:13+00:00">絕對不是我翻不出來XD</del></p>
<div class="title">4.2 The jQuery Event Model</div>
<p>jQuery提供了統一的event操作方式</p>
<div class="subtitle">4.2.1 Binding event handlers using jQuery</div>
<p>jQuery要對element綁定event是使用bind()</p>
<pre class="brush: jscript; title: ; notranslate">
$(&quot;img&quot;).bind('click',function(event){alert('Hi there!');});
</pre>
<p>當按下&lt;img>時 會觸發參數中的函式</p>
<div class="method">bind(eventType,data,listener)</div>
<p>eventType是event的類型(click、focus這些)<br />
data是帶給listener的參數 可以省略<br />
listener是觸發後執行的函式 如果第二個參數data省略的話 這就會變成第二個參數</p>
<p>而對於常用的event jQuery也提供了各自的方法<br />
例如click event 如下</p>
<pre class="brush: jscript; title: ; notranslate">
$(&quot;img&quot;).click(function(){alert('Hi there!');});
</pre>
<p>按下圖片時會alert<br />
其他可以看<a href="http://docs.jquery.com/Events" target="_blank">官網</a></p>
<p>另一個跟bind()很像的是one()</p>
<div class="method">one(eventType,data,listener)</div>
<p>用法跟bind()一樣<br />
但是當這個函式被觸發一次之後 就會被自動地移除掉</p>
<div class="subtitle">4.2.2 Removing event handlers</div>
<p>而要移除的話是用unbind()</p>
<div class="method">unbind(eventType,listener)</div>
<p>如果兩個參數都省略的話 就是移除掉這個element所有的event<br />
有寫eventType的話 是看要移除哪個event<br />
listener則是移除掉bind()所建立的函式</p>
<div class="subtitle">4.2.3 Inspecting the Event instance</div>
<p>jQuery在event觸發後的函式中<br />
也有可以觀察頁面上的方法<br />
如要檢查有沒有按下ctrl鍵、alt鍵或是任何的數字字母鍵<br />
以及滑鼠目前的座標等等<br />
可是我找不到官網文件哪裡有寫 ._.</p>
<pre class="brush: jscript; title: ; notranslate">
$(&quot;img&quot;).keypress(function(e){alert(e.keyCode);});
</pre>
<p>判斷按下了哪個鍵(該鍵的keyCode)</p>
<div class="subtitle">4.2.4 Affecting the event propagation</div>
<p>event的stopPropagation()<br />
是阻止這個event往父節點的方向越往外觸發event<br />
preventDefault()<br />
則是停止這個event預設的任何動作<br />
(這兩個應該是這樣吧 總覺得好像解釋的不太對= =a js真是博大精深XD)</p>
<div class="subtitle">4.2.5 Triggering event handlers</div>
<div class="method">trigger(eventType)</div>
<p>觸發element的event</p>
<pre class="brush: jscript; title: ; notranslate">
$(&quot;form:first&quot;).trigger(&quot;submit&quot;);
</pre>
<p>像是可以submit而不用按按鍵</p>
<div class="method">eventName()</div>
<p>jQuery同樣的也提供了多個簡便的使用方法<br />
如click()、focus()、blur()<br />
可以像使用trigger()一樣的觸發特定的event</p>
<pre class="brush: jscript; title: ; notranslate">
$(&quot;input&quot;).click();
</pre>
<p>按下&lt;input>時會觸發click event(可以先用bind()綁定click event)</p>
<div class="subtitle">4.2.6 Other event-related commands</div>
<p>另外兩個跟操作event有關的method</p>
<div class="method">toggle(listenerOdd,listenerEven)</div>
<p>交互觸發不同的listener<br />
下面是一個簡單的例子 顯示或隱藏一個id=say的element</p>
<pre class="brush: jscript; title: ; notranslate">
$('#btn').toggle(
	function(event){
		$(&quot;#say&quot;).show();
	},
	function(event){
		$(&quot;#say&quot;).hide();
	}
);
</pre>
<p>按第一下會顯示 按第二下會隱藏 依序循環</p>
<div class="method">hover(overListener,outListener)</div>
<p>另一個常用的event是當滑鼠移入跟移出element時要觸發的event<br />
移入時是overListener<br />
移出時則是outListener</p>
<pre class="brush: jscript; title: ; notranslate">
$('#myimg').hover(reportover,reportout);
</pre>
<p>有一點要注意的是<br />
element裡面如果有child elements時 是不會造成移出的效果<br />
而是要移出該element才會有</p>
<div class="title">4.3 Putting events (and more) to work</div>
<p>這節是運用前面所學到的知識作一個綜合運用<br />
一個點菜菜單<br />
其中有一個用法可以看一下</p>
<pre class="brush: jscript; title: ; notranslate">
$(':checkbox').click(function(){
	$('div',$(this).parents('div:first'))
	.css('display','block');
});
</pre>
<p>這個element <b>$(&#8216;div&#8217;,$(this).parents(&#8216;div:first&#8217;))</b> 指的是<br />
往this的parents(也就是從父層開始往外推出去)找第一個遇到的div<br />
而這個找到的div中的div為返回的elements<br />
(很繞舌XD)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hsin.tw/2009/jquery-in-action-ch4/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>jQuery in Action Ch.3 筆記</title>
		<link>http://blog.hsin.tw/2009/jquery-in-action-ch3/</link>
		<comments>http://blog.hsin.tw/2009/jquery-in-action-ch3/#comments</comments>
		<pubDate>Tue, 26 May 2009 13:01:13 +0000</pubDate>
		<dc:creator>hsin</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[html]]></category>

		<guid isPermaLink="false">http://blog.hsin.tw/?p=246</guid>
		<description><![CDATA[ch3 Bringing pages to life with jQuery .method{background-color:#ffffcc;color:#000000;margin:10px;width:200px;text-align:center;} .title{background-color:#dddddd;color:#000000;margin-top:30px;} .subtitle{background-color:#eeeeee;color:#000000;margin-top:20px;} 3.1 Manipulating element properties and attributes img是tag name 其他id、src、alt、class、title是attributes 而瀏覽器會將這些轉變成DOM中的element 而且會建立一個NodeList object並指派一組properties給這個element 這個element的attributes跟properties是可以動態變化的 而且通常也會保持一致 不過有時候也會不一樣 像是當給定src的attribute為image.gif 而property則會給完整的路徑 如http://localhost/image.gif attributes跟properties的名字大部分也是一樣的 少部份如attributes中的class 在properties中則是稱為className 3.1.1 Manipulating element properties each() 在each()中 會依序操作selectors所取得的elements，會由零開始(zero-based) 在裡面可以使用this這個property來表示這個element並操作 依序修改每個&#60;img>的alt值 &#8230; <a href="http://blog.hsin.tw/2009/jquery-in-action-ch3/">繼續閱讀 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>ch3 Bringing pages to life with jQuery<br />
<span id="more-246"></span></p>
<style>
.method{background-color:#ffffcc;color:#000000;margin:10px;width:200px;text-align:center;}
.title{background-color:#dddddd;color:#000000;margin-top:30px;}
.subtitle{background-color:#eeeeee;color:#000000;margin-top:20px;}
</style>
<div class="title">3.1 Manipulating element properties and attributes</div>
<pre class="brush: xml; title: ; notranslate">
&lt;img id=&quot;myImage&quot; src=&quot;image.gif&quot; alt=&quot;An image&quot; class=&quot;someClass&quot; title=&quot;This is an image&quot;/&gt;
</pre>
<p>img是tag name<br />
其他id、src、alt、class、title是attributes<br />
而瀏覽器會將這些轉變成DOM中的element<br />
而且會建立一個NodeList object並指派一組properties給這個element<br />
這個element的attributes跟properties是可以動態變化的<br />
而且通常也會保持一致<br />
不過有時候也會不一樣<br />
像是當給定src的attribute為image.gif<br />
而property則會給完整的路徑 如http://localhost/image.gif</p>
<p>attributes跟properties的名字大部分也是一樣的<br />
少部份如attributes中的class 在properties中則是稱為className</p>
<div class="subtitle">3.1.1 Manipulating element properties</div>
<div class="method">each()</div>
<p>在each()中 會依序操作selectors所取得的elements，會由零開始(zero-based)<br />
在裡面可以使用this這個property來表示這個element並操作</p>
<pre class="brush: jscript; title: ; notranslate">
$('img').each(function(n){
  this.alt='This is image['+n+'] with an id of '+this.id;
});
</pre>
<p>依序修改每個&lt;img>的alt值</p>
<p>而如果只是要取得其中一個的值 可以使用array的index方式取得(因為selectors所取得的elements也可以當作array來使用)</p>
<pre class="brush: jscript; title: ; notranslate">
var altValue = $('#myImage')[0].alt;
</pre>
<div class="subtitle">3.1.2 Fetching attribute values</div>
<div class="method">attr(name)</div>
<p>獲得element的屬性值</p>
<pre class="brush: xml; title: ; notranslate">
&lt;img id=&quot;myImage&quot; src=&quot;image.gif&quot; alt=&quot;An image&quot; class=&quot;someClass&quot; title=&quot;This is an image&quot; custom=&quot;some value&quot;/&gt;
</pre>
<p>這裡以這個img作為例子 可以看到他的屬性有一項為custom="some value"</p>
<pre class="brush: jscript; title: ; notranslate">
$(&quot;#myImage&quot;).attr(&quot;custom&quot;)
</pre>
<p>可以使用attr()來取得屬性的值(這裡會取得"some value")<br />
不過要注意的是 如果使用不是標準的屬性名稱(也就是這裡的custom) 可能會導致網頁無法正確解析或是無法取得該值</p>
<div class="subtitle">3.1.3 Setting attribute values</div>
<div class="method">attr(name,value)</div>
<p>設定element的屬性值</p>
<pre class="brush: jscript; title: ; notranslate">
$('*').attr('title',function(index) {
  return 'I am element ' + index + ' and my name is ' +
         (this.id ? this.id : 'unset');
});
</pre>
<p>除了可以在第二個參數直接填入要放的值<br />
也可以填入一個function 再將這個function的返回值填入</p>
<div class="method">attr(attributes)</div>
<p>attr()也可以一次設定多個屬性值</p>
<pre class="brush: jscript; title: ; notranslate">
$('input').attr(
  { value: 'v', title: 'Please enter a value' }
);
</pre>
<p>裡面放的是一個object<br />
這樣就可以一次設定element的value值跟title值了<br />
這邊要注意的是IE沒辦法改變&lt;input>的name值<br />
所以要在IE中改變的話 要直接建立一個新的&lt;input> 並取代原本的</p>
<div class="subtitle">3.1.4 Removing attributes</div>
<div class="method">removeAttr(name)</div>
<p>移除element的屬性<br />
使用的方式跟attr()一樣 不過這邊就是移除這個屬性<br />
要注意的是 這邊移除的是attribute 而property仍然會存在的(但是值可能會變)<br />
例如將readonly attribute移除<br />
那這個element的property可能會由true變為false 但是他仍然會存在</p>
<div class="subtitle">3.1.5 Fun with attributes</div>
<p>這小節舉了兩個運用attr()的例子</p>
<pre class="brush: jscript; title: ; notranslate">
$(&quot;a[href^=http://]&quot;).attr(&quot;target&quot;,&quot;_blank&quot;);
</pre>
<p>將頁面中所有的連結加上開啟在新頁面的功能</p>
<pre class="brush: jscript; title: ; notranslate">
$(&quot;form&quot;).submit(function() {
  $(&quot;:submit&quot;,this).attr(&quot;disabled&quot;, &quot;disabled&quot;);
});
</pre>
<p>對於頁面上所有表單的送出鍵 當他們被按下第一次之後 便變成disabled<br />
(也就是只能按一次送出)</p>
<div class="title">3.2 Changing element styling</div>
<p>要改變一個element的外觀(style)有兩個方式<br />
增加或拿掉css class<br />
或是直接更改這個element的style</p>
<div class="subtitle">3.2.1 Adding and removing class names</div>
<div class="method">addClass(names)</div>
<p>很容易可以瞭解這個method的用法<br />
就是對取得的elements加上一個class<br />
如果一次要加上多個 就以空格區隔開各class</p>
<div class="method">removeClass(names)</div>
<p>拿掉這個class<br />
如果一次要拿掉多個 就以空格區隔開各class</p>
<p>還有一個有用的method就是可以切換class</p>
<div class="method">toggleClass(names)</div>
<p>如果已經有這個class了 就拿掉這個class<br />
如果尚未有 則是加上這個class<br />
(在一組取得的elements裡 有可能有些element有這個class 有些沒有)</p>
<pre class="brush: jscript; title: ; notranslate">
function swap(){
  $('tr').toggleClass('striped');
}
</pre>
<p>這樣可以對table中單數雙數的tr給予不同的class 來達到明顯各row區隔的效果</p>
<div class="subtitle">3.2.2 Getting and setting styles</div>
<div class="method">css(name,value)</div>
<p>只改變一種(或是某幾種)style需要用到css()這個method<br />
例如將所有&lt;div>裡面的字都變成黑色</p>
<pre class="brush: jscript; title: ; notranslate">
$('div').css('color','#000000');
</pre>
<p>第二個參數除了可以擺string、number 也可以擺一個function<br />
例如將所有class=expandable的&lt;div>的寬度都再加20px</p>
<pre class="brush: jscript; title: ; notranslate">
$(&quot;div.expandable&quot;).css(&quot;width&quot;,function(){
   return $(this).width() + 20 + &quot;px&quot;;
});
</pre>
<p>就如同attr()一樣 css()也可以一次設定多個style</p>
<pre class="brush: jscript; title: ; notranslate">
$(&quot;p&quot;).css({color:&quot;#ff0011&quot;,&quot;background-color&quot;:&quot;blue&quot;});
</pre>
<p>name如果有 &#8211; 的話要加引號(ex: background-color)</p>
<p>如果要取得element的style值則是如下<br />
取得class=title的&lt;div>的寬度</p>
<pre class="brush: jscript; title: ; notranslate">
$(&quot;div.title&quot;).css(&quot;width&quot;);
</pre>
<p>這個返回值永遠是string型態<br />
所以如果是要其他如number型態的就還要再轉換</p>
<p>jQuery也提供了兩個方便的method</p>
<div class="method">width(value)</div>
<div class="method">height(value)</div>
<p>顧名思義 這就是設定element的寬度跟高度</p>
<pre class="brush: jscript; title: ; notranslate">
$(&quot;div.title&quot;).width(500);
$(&quot;div.title&quot;).css(&quot;width&quot;,&quot;500px&quot;);
</pre>
<p>這兩行的意義是一樣的</p>
<p>而沒加參數的則是取得寬度及高度</p>
<pre class="brush: jscript; title: ; notranslate">
$(&quot;div.title&quot;).width();
$(&quot;div.title&quot;).height();
</pre>
<div class="subtitle">3.2.3 More useful style-related commands</div>
<div class="method">hasClass(name)</div>
<p>另外還有一個method是可以取得elements是否有這個class<br />
如果有的話會返回true 反之則是false</p>
<pre class="brush: jscript; title: ; notranslate">
$(&quot;p:first&quot;).hasClass(&quot;surpriseMe&quot;);
</pre>
<p>其實就等同於ch2提到的is()的一個用法</p>
<pre class="brush: jscript; title: ; notranslate">
$(&quot;p:first&quot;).is(&quot;.surpriseMe&quot;);
</pre>
<p>不過就字面上來講 hasClass()可以較清楚的知道這個method的意義 </p>
<p>如果要取得elements的所有class 在書中有提供了一個寫法</p>
<pre class="brush: jscript; title: ; notranslate">
$.fn.getClassNames = function() {
  if (name = this.attr(&quot;className&quot;)) {
  	return name.split(&quot; &quot;);
  }
  else {
    return [];
  }
};
</pre>
<p>新增一個名叫getClassNames的method<br />
他會返回一個包含所有class的array<br />
如果沒有class的話 則是一個空的array</p>
<div class="title">3.3 Setting element content</div>
<div class="subtitle">3.3.1 Replacing HTML or text content</div>
<div class="method">html(text)</div>
<p>取得或是改變elements中的內容<br />
如果有參數的話就是改變內容<br />
沒有參數的話就是取得內容<br />
這個用法跟innerHTML是一樣的</p>
<div class="method">text(content)</div>
<p>另一個可以獲得內容的method是text()<br />
同樣的 有參數是改變內容 沒有的話則是取得內容<br />
而這個取得的內容會將tag都去掉<br />
下面是範例</p>
<pre class="brush: xml; title: ; notranslate">
&lt;ul id=&quot;theList&quot;&gt;
  &lt;li&gt;One&lt;/li&gt;
  &lt;li&gt;Two&lt;/li&gt;
  &lt;li&gt;Three&lt;/li&gt;
  &lt;li&gt;Four&lt;/li&gt;
&lt;/ul&gt;
</pre>
<pre class="brush: jscript; title: ; notranslate">
var text = $('#theList').text();
//這會取得將tag都去掉的字串：OneTwoThreeFour
</pre>
<p>如果是要改變內容<br />
會將新內容中的&lt;跟&gt;轉換成&amp;lt;跟&amp;gt;<br />
這樣就會將內容都顯示出來</p>
<div class="subtitle">3.3.2 Moving and copying elements</div>
<div class="method">append(content)</div>
<p>將字串、element或是object加到elements的後面(tag裡內容的後面 不是tag的後面)<br />
下面是個簡單的例子 將一段html碼加到每個&lt;p>內容的後面</p>
<pre class="brush: jscript; title: ; notranslate">
$('p').append('&lt;b&gt;some text&lt;b&gt;');
</pre>
<p>而將其他的element加到elements的後面則是下面這樣</p>
<pre class="brush: jscript; title: ; notranslate">
$(&quot;p.appendToMe&quot;).append($(&quot;a.appendMe&quot;));
</pre>
<p>對於append()中的elements的處理有一點要注意的是<br />
如果目標elements( 在這裡是$("p.appendToMe") )只有一個element<br />
則會把append()中取得的elements整個搬過去(也就是move過去)<br />
而如果有多個elements的話 則是每個目標element都複製一個<br />
而且原本的elements還是會留著</p>
<div class="method">appendTo(target)</div>
<p>還有另一個跟append()相反用法的method<br />
這是將elements加到目標elements的後面<br />
可以對照append()來看</p>
<pre class="brush: jscript; title: ; notranslate">
$(&quot;a.appendMe&quot;).appendTo($(&quot;p.appendToMe&quot;));
</pre>
<p>同樣的 如果目標只有一個 就會move過去<br />
目標有很多個的話 就會各複製一個 並且原本的也會留著</p>
<p>有將內容加到後面 當然也有加到前面的</p>
<div class="method">prepend()</div>
<p>這個則是加到內容的前面 其餘用法跟append()一樣</p>
<div class="method">prependTo()</div>
<p>這個則是加到內容的前面 其餘用法跟appendTo()一樣</p>
<p>前面4個method說的是在目標tag中的內容<br />
而要放置在tag之外前面或後面也有另外的method可以使用</p>
<div class="method">before()</div>
<p>將內容加到目標elements的tag前面</p>
<div class="method">insertBefore()</div>
<p>就跟append()與appendTo()的關係一樣<br />
這是跟before()相反</p>
<div class="method">after()</div>
<p>將內容加到目標elements的tag後面</p>
<div class="method">insertAfter()</div>
<p>就跟append()與appendTo()的關係一樣<br />
這是跟after()相反</p>
<div class="subtitle">3.3.3 Wrapping elements</div>
<div class="method">wrap(wrapper)</div>
<p>在elements外再包一層tag(前後都加上tag)</p>
<pre class="brush: jscript; title: ; notranslate">
$(&quot;a.surprise&quot;).wrap(&quot;&lt;div class='hello'&gt;&lt;/div&gt;&quot;);
</pre>
<p>將class=surprise的&lt;a>的外面包一層&lt;div></p>
<pre class="brush: xml; title: ; notranslate">
&lt;a class=&quot;surprise&quot; href=&quot;#&quot;&gt;here&lt;/a&gt;
會變成
&lt;div class='hello'&gt;&lt;a class=&quot;surprise&quot; href=&quot;#&quot;&gt;here&lt;/a&gt;&lt;/div&gt;
</pre>
<div class="method">wrapAll(wrapper)</div>
<p>wrap()是將elements中每個element都包一層<br />
而wrapAll()則是對整個elements包一層</p>
<div class="method">wrapInner(wrapper)</div>
<p>將elements中的內容包一層</p>
<div class="subtitle">3.3.4 Removing elements</div>
<div class="method">remove()</div>
<p>將elements從DOM中移除<br />
但是之後還是可以拿來使用(例如利用appendTo(),prependTo()來繼續使用這組elements)</p>
<div class="method">empty()</div>
<p>將elements中的內容清除</p>
<div class="subtitle">3.3.5 Cloning elements</div>
<div class="method">clone(copyHandlers)</div>
<p>複製這組elements來使用<br />
參數copyHandlers是個boolean<br />
如果這個參數為true的話 那就會連操作事件也一起複製<br />
如果為false或是省略 則是只有複製elements</p>
<div class="title">3.4 Dealing with form element values</div>
<div class="method">val(value)</div>
<p>當value省略時 是取得form中elements的值<br />
而有值是設定這個element的值</p>
<div class="method">val(values)</div>
<p>還有另一個用法是<br />
將所有符合的elements選取(也就是設定為checked或selected)</p>
<pre class="brush: jscript; title: ; notranslate">
$('input,select').val(['one','two','three']);
</pre>
<p>搜尋頁面上所有的&lt;input> (即type=checkbox或type=radio)跟&lt;select><br />
如果他們的值為one、two或是three<br />
則將他們選取</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hsin.tw/2009/jquery-in-action-ch3/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>jQuery in Action Ch.2 筆記</title>
		<link>http://blog.hsin.tw/2009/jquery-in-action-ch2-creating-the-wrapped-element-set/</link>
		<comments>http://blog.hsin.tw/2009/jquery-in-action-ch2-creating-the-wrapped-element-set/#comments</comments>
		<pubDate>Wed, 13 May 2009 13:14:35 +0000</pubDate>
		<dc:creator>hsin</dc:creator>
				<category><![CDATA[jquery]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://blog.hsin.tw/?p=231</guid>
		<description><![CDATA[Ch.2 Creating the wrapped element set .method{background-color:#ffffcc;color:#000000;margin:10px;width:200px;text-align:center;} .title{background-color:#dddddd;color:#000000;margin-top:25px;} .subtitle{background-color:#eeeeee;color:#000000;;margin-top:10px;} 第二章會詳細介紹$()的兩個常用的功能: selectors 跟 創建新的DOM elements 2.1 Selecting elements for manipulation 在操作任何動作前 都必須要先會取得自己需要操作的elements 這邊有提供一個可以下載來練習selectors的Selectors Lab網頁 可以在原文版的首頁下載得到 (找到一個名字為Source code的連結下載) 2.1.1 Using basic CSS selectors 一開始先講解幾個基本的css selectors 這可以咕狗研究一下 而jQuery就是在$()裡使用selectors 2.1.2 Using child, container, and &#8230; <a href="http://blog.hsin.tw/2009/jquery-in-action-ch2-creating-the-wrapped-element-set/">繼續閱讀 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Ch.2 Creating the wrapped element set<br />
<span id="more-231"></span></p>
<style>
.method{background-color:#ffffcc;color:#000000;margin:10px;width:200px;text-align:center;}
.title{background-color:#dddddd;color:#000000;margin-top:25px;}
.subtitle{background-color:#eeeeee;color:#000000;;margin-top:10px;}
</style>
<p>第二章會詳細介紹$()的兩個常用的功能: selectors 跟 創建新的DOM elements</p>
<div class="title">2.1 Selecting elements for manipulation</div>
<p>在操作任何動作前 都必須要先會取得自己需要操作的elements<br />
這邊有提供一個可以下載來練習selectors的Selectors Lab網頁<br />
可以在<a href="http://www.manning.com/bibeault/" target="_blank">原文版的首頁下載得到</a><br />
(找到一個名字為Source code的連結下載)</p>
<div class="subtitle">2.1.1 Using basic CSS selectors</div>
<p>一開始先講解幾個基本的css selectors<br />
這可以<a href="http://www.google.com.tw/search?q=css+%E9%81%B8%E6%93%87%E5%99%A8&#038;ie=utf-8&#038;oe=utf-8&#038;aq=t&#038;rls=org.mozilla:zh-TW:official&#038;client=firefox-a" target="_blank">咕狗研究一下</a><br />
而jQuery就是在$()裡使用selectors</p>
<pre class="brush: jscript; title: ; notranslate">
//這個就是取得&lt;p&gt;中有class=specialClass的&lt;a&gt;
$(&quot;p a.specialClass&quot;)
</pre>
<div class="subtitle">2.1.2 Using child, container, and attribute selectors</div>
<p>而當需要取得更精細更複雜的selectors 時<br />
就可以用到jQuery內建的功能</p>
<p>首先以child selectors來說<br />
大意就是說 如果要取得特定的elements<br />
ul.mylist > li > a 可以比 ul.mylist li a取得更精確的elements<br />
有包含 > 的是指有上下層關係(也就是parents跟child的關係) li一定在ul下面一層 而a一定在li下面一層<br />
沒有 > 的就是指所有包在裡面的都算在內 不管隔了幾層</p>
<p>而attribute selectors就是<br />
可以對各tag的屬性再做篩選 挑出所需要的elements</p>
<pre class="brush: jscript; title: ; notranslate">
//所有&lt;a&gt;中 屬性href的開頭為http://的&lt;a&gt;
a[href^=http://]
//所以這邊使用 ^ 來代表字的開頭的意思 跟正規表達式的一樣
</pre>
<p>以下是幾個用法</p>
<pre class="brush: jscript; title: ; notranslate">
//取得所有 type=text的&lt;input&gt;
input[type=text]

//取得所有 title的開頭為my的&lt;div&gt;
div[title^=my]

//取得所有 href的結尾為.pdf的&lt;a&gt; (這也與正規表達式的 $ 一樣)
a[href$=.pdf]

//取得所有 href的值中有包含jquery.com字串的&lt;a&gt;
a[href*=jquery.com]
</pre>
<p>而container selector指的是有包含所指定的selector</p>
<pre class="brush: jscript; title: ; notranslate">
//取得 含有&lt;a&gt;的&lt;li&gt;
li:has(a)

//但是要注意這個只能夠使用一層 如果是下面這樣
foo:not(bar:has(baz))
//或是
foo:not(bar:has(baz:eq(2)))
//都是無法使用的
</pre>
<p>然後書中有附一張簡表 說明各用法<br />
也可以在<a href="http://docs.jquery.com/Selectors" target="_blank">官網的documentation</a>中找得到</p>
<div class="subtitle">2.1.3 Selecting by position</div>
<p>jQuery也可以依據elements間的位置關係取得所需要的elements</p>
<pre class="brush: jscript; title: ; notranslate">
//取得 第一個&lt;a&gt;
a:first

//取得 所有奇數的&lt;p&gt; (也就是第1,3,5,7 ...個的&lt;p&gt;)
p:odd
//當然也可以取得偶數的
p:even

//取得 &lt;li&gt;中最後一個child element (也就是&lt;li&gt;下一層中 最後一個element)
li:last-child
</pre>
<p>這邊也有附一個簡表 詳情請看<a href="http://docs.jquery.com/Selectors" target="_blank">官網的documentation</a></p>
<p>而這邊有一點要注意的是<br />
使用:nth-child(n)的時候 這個n是從1開始算起 (1-based)<br />
而其他的如 :eq(n) 或是 :gt(n) 這些是從0開始算起 (0-based)<br />
所以使用:nth-child(2)會等於使用:eq(1)</p>
<div class="subtitle">2.1.4 Using custom jQuery selectors</div>
<p>這小節主要是介紹除了css中可以使用的selectors之外<br />
jQuery自己內建的filter selectors<br />
(filter就是過濾器、過濾、篩選的意思)<br />
這邊也有附一個簡表 詳情請看<a href="http://docs.jquery.com/Selectors" target="_blank">官網的documentation</a></p>
<p>這些filter selectors大部分都是跟form有關的<br />
下面舉幾個例子</p>
<pre class="brush: jscript; title: ; notranslate">
//取得正在作特效(animations and effects)的elements
:animated

//取得checkbox (這裡就等於input[type=checkbox])
:checkbox

//取得內容有child elements(只有文字也算)的elements (也就是還有下一層)
:parent

//這些selectors也可以連著用
:checkbox:checked:enabled
</pre>
<p>如果想要選擇與selectors的規則相反的filter<br />
可以使用:not</p>
<pre class="brush: jscript; title: ; notranslate">
//取得不是checkbox的input
input:not(:checkbox)
</pre>
<p>:not這個filter selector中 只能放filter</p>
<pre class="brush: jscript; title: ; notranslate">
//例如下面這樣是不行的
div :not(p:hidden)

//而這樣是ok的
div p:not(:hidden)
</pre>
<div class="title">2.2 Generating new HTML</div>
<p>建立新的html elements<br />
這裡還有提到一個簡略的方法<br />
如果是要建立一個空的element</p>
<pre class="brush: jscript; title: ; notranslate">
//這個的用法
$(&quot;&lt;div&gt;&quot;)
//會與下面這兩個一樣
$(&quot;&lt;div&gt;&lt;/div&gt;&quot;)
$(&quot;&lt;div/&gt;&quot;)
</pre>
<div class="title">2.3 Managing the wrapped element set</div>
<p>操作取得的elements<br />
這邊提供了另一個Selectors Lab可以練習<br />
可以在<a href="http://www.manning.com/bibeault/" target="_blank">原文版的首頁下載得到</a><br />
(找到一個名字為Source code的連結下載)</p>
<div class="subtitle">2.3.1 Determining the size of the wrapped set</div>
<div class="method">size()</div>
<p>取得selector所會操作的elements個數 使用size()</p>
<pre class="brush: jscript; title: ; notranslate">
$('a').size()
</pre>
<p>例如取得頁面上有幾個連結(也就是&lt;a>)</p>
<div class="subtitle">2.3.2 Obtaining elements from the wrapped set</div>
<div class="method">get()</div>
<p>因為jQuery可以把一個取得的elements當作一個array來使用<br />
所以如果要取得特定的element 可以依照他的index獲得<br />
例如要取得第一個element</p>
<pre class="brush: jscript; title: ; notranslate">
//可以使用
$('img[alt]')[0]
//而如果要用method來取得的話 可以使用get()
$('img[alt]').get(0)
</pre>
<p>如果沒有填入index值的話 則會返回一個含有所有的elements的array</p>
<div class="method">index()</div>
<p>而要取得某一個element在 一個selector中取得的elements 裡的index<br />
(也就是排序的位置 第一個就是0 第二個就是1)<br />
可以使用index()</p>
<pre class="brush: jscript; title: ; notranslate">
//取得 bid=findMe的&lt;img&gt; 在所有&lt;img&gt;中的index
var n = $('img').index($('img#findMe')[0]);
</pre>
<p>如果要取得index的element不在這些elements裡 則會返回-1</p>
<div class="subtitle">2.3.3 Slicing and dicing the wrapped element set</div>
<div class="method">add()</div>
<p>在已經取得的elements之外 再取得另外的elements一起作操作</p>
<pre class="brush: jscript; title: ; notranslate">
//對含有alt屬性的&lt;img&gt;操作
$('img[alt]')
//除了含有alt的&lt;img&gt;之外 再加上含有title的&lt;img&gt; 再一起對這些符合條件的elements操作
$('img[alt]').add('img[title]')
//當然在這個例子中 如果使用下面這樣也是可以
$('img[alt],img[title]')
//但是如果要先對含有alt的&lt;img&gt;操作 再對這兩種elements操作
//就必須要用到add()了
//
//在add()裡也可以加入新建立的html elements(像是2.2講的那樣)
$('p').add('&lt;div&gt;Hi there!&lt;/div&gt;')
</pre>
<div class="method">not()</div>
<p>可以加入特定的elements 同樣的也是可以減少<br />
這邊使用的not() 有點類似前面講的:not<br />
而這個not()的使用的方法就跟add()一樣</p>
<pre class="brush: jscript; title: ; notranslate">
//取得有title屬性 但是title值不包含puppy這個字串的&lt;img&gt;
$('img[title]').not('[title*=puppy]')
</pre>
<div class="method">filter()</div>
<p>除了add()跟not()之外<br />
如果需要更多條件來挑出需要的elements<br />
可以使用filter()</p>
<pre class="brush: jscript; title: ; notranslate">
//取得所有innerHTML為數字的&lt;td&gt;
$('td').filter(function(){return this.innerHTML.match(/^d+$/)})
</pre>
<p>filter()跟not()的用法有點類似<br />
但是條件剛好是相反的</p>
<pre class="brush: jscript; title: ; notranslate">
//這裡是指篩選出title值含有dog字串的
$('img').addClass('seeThrough').filter('[title*=dog]').addClass('thickBorder')
//但如果是not() 就是把title值含有dog字串的拿掉
$('img').addClass('seeThrough').not('[title*=dog]').addClass('thickBorder')
</pre>
<p>add()、not()、filter()三種method可以很靈活的增減所需要的elements</p>
<div class="method">slice(begin,end)</div>
<p>取得elements中特定的index的element(例如index為2~5的elements)<br />
slice()有兩個參數 型態都是數字 皆由0開始算(zero-based)<br />
第1個參數begin 為開始取得的index值 如果為負數就是由尾巴開始取值<br />
第2個參數end 就是要取到第幾個為止 如果省略的話就是取到最後(這個參數所指的該index不會被取得 只會到前一個)</p>
<pre class="brush: jscript; title: ; notranslate">
//取得頁面上前4個elements
$('*').slice(0,4);
//取得頁面上除了前4個elements之外的elements 也就是從第5個element開始取得 到最後1個
$('*').slice(4);
</pre>
<div class="subtitle">2.3.4 Getting wrapped sets using relationships</div>
<p>這邊有一個簡表列出其他可以篩選出elements的methods<br />
詳情請看<a href="http://docs.jquery.com/Traversing" target="_blank">官網的documentation</a><br />
這些methods返回的都是新的一組elements 不會影響到原本的elements<br />
下面舉幾個例子</p>
<pre class="brush: jscript; title: ; notranslate">
//取得該elements所有的child elements
children()
//取得該elements的下一個同一層的element
next()
//取得該elements之後所有同一層的elements
nextAll()
//取得該elements的所有同一層不重複的elements
siblings()
</pre>
<p>這些methods除了contents()之外 其他的都可以再在裡面用字串來篩選出elements</p>
<div class="subtitle">2.3.5 Even more ways to use a wrapped set</div>
<div class="method">find()</div>
<p>對一組已經篩選出的elements作另一個selectors的篩選</p>
<pre class="brush: jscript; title: ; notranslate">
//取得在&lt;p&gt;中的&lt;span&gt;
$(&quot;p&quot;).find(&quot;span&quot;)
</pre>
<p>雖然上面這個例子跟$(&#8216;p span&#8217;)的用法一樣<br />
但是如果需要在chains中使用 就必須用到find()</p>
<div class="method">contains()</div>
<pre class="brush: jscript; title: ; notranslate">
//取得在&lt;p&gt;中有包含'Lorem ipsum'這個字串的elements
$('p').contains('Lorem ipsum')
</pre>
<p>對一組已經篩選出的elements作字串的篩選</p>
<div class="method">is()</div>
<p>對一組已經篩選出的elements作另一個selectors的查找 是否有包含此selectors</p>
<pre class="brush: jscript; title: ; notranslate">
//檢查頁面上是否有至少一個&lt;img&gt;
var hasImage = $('*').is('img');
</pre>
<p>返回值是個boolean<br />
如果有找到就是返回true 反之則是false</p>
<div class="subtitle">2.3.6 Managing jQuery chains</div>
<p>這小節會說明2個在chain中變換<b>可以操作的elements</b>的method</p>
<div class="method">end()</div>
<p>在一個chain中如果先變換了操作的elements<br />
但是在後面又要操作原本的elements<br />
就要使用到end()<br />
(clone()在ch3會講 這是一個複製elements的method)</p>
<pre class="brush: jscript; title: ; notranslate">
$('img').clone().appendTo('#somewhere').end().addClass('beenCloned');
</pre>
<p>先對所有的&lt;img>作複製<br />
再把這些複製的elements加到id=somewhere的element中<br />
而因為要再對原本的elements(所有&lt;img>)加上class=beenCloned<br />
所以加上end()後再加上addClass(&#8216;beenCloned&#8217;)<br />
如果沒有end() 而直接加addClass(&#8216;beenCloned&#8217;)<br />
那就是會加到複製的elements上 而不是原本的elements</p>
<div class="method">andSelf()</div>
<p>在一個chain中如果先變換了操作的elements<br />
但是在後面又要對原本的elements一起操作<br />
就要使用到andSelf()</p>
<pre class="brush: jscript; title: ; notranslate">
$(&quot;div&quot;).find(&quot;p&quot;).andSelf().addClass(&quot;border&quot;);
</pre>
<p>如果沒有加上andSelf() 就是只有&lt;div>中的&lt;p>會加上class=border<br />
如果加上了 就是 &lt;div> 跟 &lt;div>中的&lt;p> 都會加上class=border</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hsin.tw/2009/jquery-in-action-ch2-creating-the-wrapped-element-set/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

