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

<channel>
	<title>礁湖星云 &#187; jQuery</title>
	<atom:link href="http://www.icyfire.me/tag/jquery/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.icyfire.me</link>
	<description>太阳底下没有新鲜事。</description>
	<lastBuildDate>Tue, 31 Jan 2012 02:50:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>[翻译]jQuery的show/hide性能测试</title>
		<link>http://www.icyfire.me/2010/07/jquery-showhide-performance/</link>
		<comments>http://www.icyfire.me/2010/07/jquery-showhide-performance/#comments</comments>
		<pubDate>Mon, 26 Jul 2010 10:38:02 +0000</pubDate>
		<dc:creator>icyfire</dc:creator>
				<category><![CDATA[网站前端]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://www.icyfire.me/?p=927</guid>
		<description><![CDATA[这篇文章是jQuery各种show/hide方式的性能测试。作者之所以测试这个源于Robert Duffy在San Francisco举行的jQuery大会上的一句话：“.hide()和.show()的执行速度会比直接改变css慢”。但由于未能找Robert Duffy问明原因，所以作者就自己去做了这个测试。下面的翻译并不是全文翻译，只节选了一些重点。

用作测试的是一个含有100个div的HTML页面，div带有class和一些内容。为了排除掉寻找这些div所花费的时间，所以把选择器$('div')缓存起来了。用作测试的jQuery版本是1.4.2，所以测试结果也只是针对这个版本，在其他版本可能就不是这些结果了。

测试的jQuery方法分别是：
<ul>
<li>.toggle()</li>
<li>.show() 和 .hide()</li>
<li>.css({'display':'none'}) 和 .css({'display':'block'})</li>
<li>.addClass('hide') 和 .removeClass('hide')</li>
<li>改变&#60;style&#62;元素的一个属性</li>
</ul> <a href="http://www.icyfire.me/2010/07/jquery-showhide-performance/">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div style="font-size:12px;">
这篇文章是jQuery各种show/hide方式的性能测试。作者之所以测试这个源于Robert Duffy在San Francisco举行的jQuery大会上的一句话：“.hide()和.show()的执行速度会比直接改变css慢”。但由于未能找Robert Duffy问明原因，所以作者就自己去做了这个测试。下面的翻译并不是全文翻译，只节选了一些重点。</p>
<p>用作测试的是一个含有100个div的HTML页面，div带有class和一些内容。为了排除掉寻找这些div所花费的时间，所以把选择器$('div')缓存起来了。用作测试的jQuery版本是1.4.2，所以测试结果也只是针对这个版本，在其他版本可能就不是这些结果了。</p>
<p>测试的jQuery方法分别是：</p>
<ul>
<li>.toggle()</li>
<li>.show() 和 .hide()</li>
<li>.css({'display':'none'}) 和 .css({'display':'block'})</li>
<li>.addClass('hide') 和 .removeClass('hide')</li>
<li>改变&lt;style&gt;元素的一个属性</li>
</ul>
<h2>.show() 和 .hide()</h2>
<p><strong>在所有浏览器中，这两个方法在隐藏DOM元素上相对来说比较慢。</strong>主要原因在于.hide()方法必须先保存元素的"display"属性，这样.show()才能把元素恢复到原来的状态。这里用到了.data()这个jQuery方法，把信息保存在DOM元素上。为了达到这个目的，.hide()在每个元素上循环了两次，一次用来保存当前的"display"值，一次用来更新样式"display"为"none"。根据源代码上的注释，这样做是为了防止浏览器在每个循环上进行重新渲染（reflow）。.hide()方法还会检查你是否传递了使用动画效果的参数，就算传入一个"0"也会让性能大打折扣。在第一次调用.hide()的时候性能最慢，在之后再调用则会变快。</p>
<table class="mytable" cellspacing="0" style="width:100%;margin-bottom:10px;">
<tr>
<th scope="row" class="left top">Browser</th>
<th scope="col">hide/show</th>
</tr>
<tr>
<td class="spec">FireFox 3.6</td>
<td>29ms / 10ms</td>
</tr>
<tr>
<td class="spec">Safari 4.05</td>
<td>6ms / 1ms</td>
</tr>
<tr>
<td class="spec">Opera 10.10</td>
<td>9ms / 1ms</td>
</tr>
<tr>
<td class="spec">Chrome 5.0.3</td>
<td>5ms / 1ms</td>
</tr>
<tr>
<td class="spec">IE 6.0</td>
<td>31ms / 16ms</td>
</tr>
<tr>
<td class="spec">IE 7.0</td>
<td>15ms / 16ms</td>
</tr>
</table>
<h2>.toggle()</h2>
<p><strong>这个方法是最慢的。</strong>它会检查选择器返回的每一个元素当前是否可见，如果可见的话就调用.hide()方法，不可见则调用.show()方法。不但如此，它不仅会检查你是否传递了一个boolean值进去阻止.hide()或者.show()的执行，还会检查看你是否传入了function来进行切换（toggle）而不是对可见性进行切换。看起来这个方法还有很大的改善空间，例如可以先一次过把隐藏的元素select出来，然后调用.show()方法，同时把其余的元素select出来调用.hide()方法。</p>
<table class="mytable" cellspacing="0" style="width:100%;margin-bottom:10px;">
<tr>
<th scope="row" class="left top">Browser</th>
<th scope="col">hide/show</th>
</tr>
<tr>
<td class="spec">FireFox 3.6</td>
<td>80ms / 59ms</td>
</tr>
<tr>
<td class="spec">Safari 4.05</td>
<td>24ms / 30ms</td>
</tr>
<tr>
<td class="spec">Opera 10.10</td>
<td>67ms / 201ms</td>
</tr>
<tr>
<td class="spec">Chrome 5.0.3</td>
<td>55ms / 20ms</td>
</tr>
<tr>
<td class="spec">IE 6.0</td>
<td>296ms / 78ms</td>
</tr>
<tr>
<td class="spec">IE 7.0</td>
<td>328ms / 47ms</td>
</tr>
</table>
<h2>.addClass() 和 .removeClass()</h2>
<p>这是两个很漂亮的隐藏/显示DOM元素方法。<b>在Firefox上它的速度是.show()和.hide()的两倍，而在Safari上则是三倍。不过在IE6，IE7，Chrome和Opera上，两种方法几乎没什么差别。</b>值得一提的是，对于100个DOM节点来说，两种方法在Firefox上相差18ms，在Safari相差4ms，速度的差异只会体现在大量节点选择的时候。不过增加和移除class需要你花费更多的工作，因为你需要创建一个用于隐藏的class，然后还要时刻关注着这个class的优先级以保证DOM能隐藏。jQuery增加和移除class是通过字符串操作的，所以我觉得随着元素上class数量的增加，这个方法会变慢，但是我还没对此进行测试过。</p>
<table class="mytable" cellspacing="0" style="width:100%;margin-bottom:10px;">
<tr>
<th scope="row" class="left top">Browser</th>
<th scope="col">hide/show</th>
</tr>
<tr>
<td class="spec">FireFox 3.6</td>
<td>11ms / 11ms</td>
</tr>
<tr>
<td class="spec">Safari 4.05</td>
<td>2ms / 2ms</td>
</tr>
<tr>
<td class="spec">Opera 10.10</td>
<td>6ms / 3ms</td>
</tr>
<tr>
<td class="spec">Chrome 5.0.3</td>
<td>3ms / 1ms</td>
</tr>
<tr>
<td class="spec">IE 6.0</td>
<td>47ms / 32ms</td>
</tr>
<tr>
<td class="spec">IE 7.0</td>
<td>15ms / 16ms</td>
</tr>
</table>
<h2>.css({'display':'none'}) 和 .css({'display':'block'})</h2>
<p>这两个方法也很漂亮。<b>相对于.addClass()和.removeClass()，IE6/7和Opera上的速度都得到了提升，而在其他浏览器上则能保持水准。</b>当你知道要改变的元素的当前display样式，或者没有通过inline的方式去改变元素的display样式时，这两个方法很好用。如果你通过inline的方式改变了display样式，那么你需要确保在使得元素重新可见时display值要设置正确。如果你只是使用了元素的默认display值或者在css里设置display值，那么你只需要用类似.css({'display':''})的方法移除样式，元素就会恢复到它在css上的样式或者默认display值。作为一个类库，jQuery不能假定元素的display不是通过inline方式设置的，所以它需要被人手的去确定。不过既然你知道你不会去inline的设置display，那么你就可以去避免这个造成缓慢的主要因素。</p>
<table class="mytable" cellspacing="0" style="width:100%;margin-bottom:10px;">
<tr>
<th scope="row" class="left top">Browser</th>
<th scope="col">hide/show</th>
</tr>
<tr>
<td class="spec">FireFox 3.6</td>
<td>14ms / 12ms</td>
</tr>
<tr>
<td class="spec">Safari 4.05</td>
<td>2ms / 1ms</td>
</tr>
<tr>
<td class="spec">Opera 10.10</td>
<td>2ms / 2ms</td>
</tr>
<tr>
<td class="spec">Chrome 5.0.3</td>
<td>2ms / 1ms</td>
</tr>
<tr>
<td class="spec">IE 6.0</td>
<td>16ms / 16ms</td>
</tr>
<tr>
<td class="spec">IE 7.0</td>
<td>0ms / 0ms  // 少于15ms会变成0ms，具体看<a href="http://ejohn.org/blog/accuracy-of-javascript-time/">这里<br />
</a></td>
</tr>
</table>
<h2>禁止样式表</h2>
<p>纯粹为了好玩，我想：如果我们不在每个dom节点上花功夫，而是去捣鼓样式表会怎样呢？这样会提高速度吗？其实就日常使用来说，上面的测试用到的方法已经足够快了，但是如果页面上有10000个节点需要进行隐藏和显示呢？只是把它们全部选择出来就已经够慢了。如果我可以控制样式表，那么就可以完全避免这些时间花费了。不过我得告诉你，这个方法是有很大风险的。</p>
<p>风险在于控制样式表时的跨浏览器问题。首先，我尝试能不能通过jQuery插入一个带有class的"style"标签，但是却出现了跨浏览器问题。然后我尝试用javascript去创建stylesheet节点和class，但是实在有太多的API了，要搞清楚需要花不少的时间。最后，放弃了编程的方式，我在head区里写了一个带有class的style标签。通过编程的方式来创建stylesheet实在是太慢了，但是如果它一旦被创建好，那么给它一个ID和使用它的"disabled"属性就是轻而易举的事情了。</p>
<pre class="brush: html; gutter: true">
<style id="special_hide">.special_hide { display: none; }</style>

<!--  ...  -->
<div class="special_hide">Special hide DIV</div>
</pre>
<p>然后在javascript里：</p>
<pre class="brush: javascript; gutter: true">
$('#special_hide').attr('disabled', 'true');
</pre>
<p>搞定！所有带有"special_hide"这个class的元素都显示出来了。要隐藏它们，你只需要……</p>
<pre class="brush: css; gutter: true">
$('#special_hide').attr('disabled', 'false');
</pre>
<p>现在它们全部都隐藏了。<strong>总的javascript耗时在所有浏览器上都是0-1ms。</strong>你的javascript只是用来改变一个属性。当然，浏览器还是需要花费时间去重新渲染页面的，但是实际上你已经避免了javascript的处理时间。如果你调用了.toggle()，.hide()或者 .css()这几个方法，那么这个方法就会失效。因为那几个方法会通过内联方式设置css样式，这些样式有更高的优先级。要重新使这个方法生效，只需调用.css('display', '') 把内联的样式移除掉。这个方法同样需要花费你更多的精力，因为那需要去定义class，同时把这些class赋给页面上需要进行显示/隐藏的元素，但是如果你所要处理的元素数量是极其庞大的话，那么这也许是值得的。</p>
<p>简要回顾一下，下面是改变元素显示状态的方法，按照最快到最慢的次序排列：</p>
<ul>
<li style="list-style-type:decimal;">禁用/启用样式表</li>
<li style="list-style-type:decimal;">.css('display', ''), .css('display', 'none')</li>
<li style="list-style-type:decimal;">.addClass(), .removeClass()</li>
<li style="list-style-type:decimal;">.show(), .hide()</li>
<li style="list-style-type:decimal;">.toggle()</li>
</ul>
<p>需要注意的是，在大多数的情况下，这些方法都足够的快了。当你要操作很大的jQuery集合时，那么.show() 和 .hide()方法在IE下就会变得很慢了，这是你可能要用addClass() 或者 .removeClass()方法。 禁用/启用样式表的方法只有在很极端的情况下才有必要用到。</p>
<p>Updated @ 2011.08.30<br />
今天看回这篇文章，发现jQuery跟浏览器的版本都升了不少了，于是产生了重新测试的念头。jQuery使用目前最新的1.6.2版本。</p>
<h2>.show() 和 .hide()</h2>
<table class="mytable" cellspacing="0" style="width:100%;margin-bottom:10px;">
<tr>
<th scope="row" class="left top">Browser</th>
<th scope="col">hide/show</th>
</tr>
<tr>
<td class="spec">FireFox 6.0</td>
<td>10ms / 3ms</td>
</tr>
<tr>
<td class="spec">Safari 5.1</td>
<td>8ms / 6ms</td>
</tr>
<tr>
<td class="spec">Opera 11.50</td>
<td>19ms / 19ms</td>
</tr>
<tr>
<td class="spec">Chrome 13.0.7</td>
<td>7ms / 7ms</td>
</tr>
<tr>
<td class="spec">IE 8.0</td>
<td>7ms / 5ms</td>
</tr>
<tr>
<td class="spec">IE 9.0</td>
<td>2ms / 12ms</td>
</tr>
</table>
<h2>.toggle()</h2>
<table class="mytable" cellspacing="0" style="width:100%;margin-bottom:10px;">
<tr>
<th scope="row" class="left top">Browser</th>
<th scope="col">hide/show</th>
</tr>
<tr>
<td class="spec">FireFox 6.0</td>
<td>55ms / 64ms</td>
</tr>
<tr>
<td class="spec">Safari 5.1</td>
<td>25ms / 27ms</td>
</tr>
<tr>
<td class="spec">Opera 11.50</td>
<td>48ms / 40ms</td>
</tr>
<tr>
<td class="spec">Chrome 13.0.7</td>
<td>22ms / 25ms</td>
</tr>
<tr>
<td class="spec">IE 8.0</td>
<td>55ms / 71ms</td>
</tr>
<tr>
<td class="spec">IE 9.0</td>
<td>32ms / 35ms</td>
</tr>
</table>
<h2>.addClass() 和 .removeClass()</h2>
<table class="mytable" cellspacing="0" style="width:100%;margin-bottom:10px;">
<tr>
<th scope="row" class="left top">Browser</th>
<th scope="col">hide/show</th>
</tr>
<tr>
<td class="spec">FireFox 6.0</td>
<td>7ms / 7ms</td>
</tr>
<tr>
<td class="spec">Safari 5.1</td>
<td>1ms / 1ms</td>
</tr>
<tr>
<td class="spec">Opera 11.50</td>
<td>1ms / 1ms</td>
</tr>
<tr>
<td class="spec">Chrome 13.0.7</td>
<td>1ms / 1ms</td>
</tr>
<tr>
<td class="spec">IE 8.0</td>
<td>2ms / 2ms</td>
</tr>
<tr>
<td class="spec">IE 9.0</td>
<td>1ms / 1ms</td>
</tr>
</table>
<h2>.css({'display':'none'}) 和 .css({'display':'block'})</h2>
<table class="mytable" cellspacing="0" style="width:100%;margin-bottom:10px;">
<tr>
<th scope="row" class="left top">Browser</th>
<th scope="col">hide/show</th>
</tr>
<tr>
<td class="spec">FireFox 6.0</td>
<td>8ms / 8ms</td>
</tr>
<tr>
<td class="spec">Safari 5.1</td>
<td>1ms / 1ms</td>
</tr>
<tr>
<td class="spec">Opera 11.50</td>
<td>1ms / 1ms</td>
</tr>
<tr>
<td class="spec">Chrome 13.0.7</td>
<td>1ms / 1ms</td>
</tr>
<tr>
<td class="spec">IE 8.0</td>
<td>2ms / 2ms</td>
</tr>
<tr>
<td class="spec">IE 9.0</td>
<td>1ms / 1ms</td>
</tr>
</table>
<h2>禁止样式表</h2>
<table class="mytable" cellspacing="0" style="width:100%;margin-bottom:10px;">
<tr>
<th scope="row" class="left top">Browser</th>
<th scope="col">hide/show</th>
</tr>
<tr>
<td class="spec">FireFox 6.0</td>
<td>1ms / 1ms</td>
</tr>
<tr>
<td class="spec">Safari 5.1</td>
<td>1ms / 1ms</td>
</tr>
<tr>
<td class="spec">Opera 11.50</td>
<td>1ms / 1ms</td>
</tr>
<tr>
<td class="spec">Chrome 13.0.7</td>
<td>1ms / 1ms</td>
</tr>
<tr>
<td class="spec">IE 8.0</td>
<td>1ms / 1ms</td>
</tr>
<tr>
<td class="spec">IE 9.0</td>
<td>1ms / 1ms</td>
</tr>
</table>
<p>.toggle()方法依然是最慢的，禁用样式表的方法依然是最快的。.addClass()跟.css()旗鼓相当，当然如何把测试的div再增加点，应该还是能分高下的。另外让我比较意外的是Firefox在这两个方法里的表现实在弱爆了……</p>
</div>
<p>Translated by <a href="http://www.icyfire.me/">icyfire</a> @ company Jul 26, 2010<br />
Updated 2011.08.30<br />
源文：<a href="http://www.learningjquery.com/2010/05/now-you-see-me-showhide-performance">Now you see me… show/hide performance</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.icyfire.me/2010/07/jquery-showhide-performance/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[转]jQuery中10个非常有用的遍历函数</title>
		<link>http://www.icyfire.me/2010/03/10-really-helpful-traversing-functions-in-jquery/</link>
		<comments>http://www.icyfire.me/2010/03/10-really-helpful-traversing-functions-in-jquery/#comments</comments>
		<pubDate>Sun, 28 Mar 2010 16:23:56 +0000</pubDate>
		<dc:creator>icyfire</dc:creator>
				<category><![CDATA[网站前端]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://www.icyfire.me/?p=919</guid>
		<description><![CDATA[使用jQuery，可以很容易的选择HTML元素。但有些时候，在HTML结构较为复杂时，提炼我们选择的元素就是一件麻烦的事情。在这篇教程中，我们将探讨十种方法去精炼和扩展我们将要操作的集合。

<div style="width:528px;text-align:center;"><img src="http://www.icyfire.me/wp-content/uploads/2010/03/10rhtfij/00_doms.gif" alt="" /></div> <a href="http://www.icyfire.me/2010/03/10-really-helpful-traversing-functions-in-jquery/">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div style="font-size:12px;">
使用jQuery，可以很容易的选择HTML元素。但有些时候，在HTML结构较为复杂时，提炼我们选择的元素就是一件麻烦的事情。在这篇教程中，我们将探讨十种方法去精炼和扩展我们将要操作的集合。</p>
<h2>HTML</h2>
<p>首先，让我们看看下图显示的简单的页面，通过这个教程我们将选择这些元素。</p>
<ul>
<li style="list-style:decimal outside none;"><strong>div.container</strong>是包裹元素；</li>
<li style="list-style:decimal outside none;"><strong>div.photo</strong>、<strong>div.title</strong>、<strong>div.rating</strong>是<strong>div.container</strong>的直接子级；</li>
<li style="list-style:decimal outside none;">每个<strong>div.star</strong>是<strong>div.rating</strong>的子级；</li>
<li style="list-style:decimal outside none;">当<strong>div.star</strong>的class为“on”时，它是一个完整的star。</li>
</ul>
<div style="width:528px;text-align:center;"><img src="http://www.icyfire.me/wp-content/uploads/2010/03/10rhtfij/00_doms.gif" alt="" /></div>
<h2>为什么要遍历？</h2>
<blockquote><p>为什么我们要进一步提炼一系列元素，难道是jQuery选择语法不够强大？</p></blockquote>
<p>好，让我们从示例开始。在上面提到的网页中，当一个star被点击时，我们需要给它以及左边的每个star添加class“on”。与此同时，我们要改变所有star父元素的背景颜色，因此，我们的代码如下：</p>
<pre lang="css" line="1">
$('.star').click(function(){
    $(this).addClass('on');
//  如何选取当前对象的父元素？
//  如何获得当前star左侧所有的star？
});
</pre>
<p>在第二行，我们得到了我们点击的当前对象。但是，如何得到stars的父级？即<strong>div.rating</strong>。但是，在一个页面中，有很多<strong>div.rating</strong>。哪一个是我们想要的？如何获得“<strong>this</strong>”左边所有的star？</p>
<p>可喜的是，jQuery允许我们基于这些基层关系，在现存集合的基础上获得新的元素集合。而这些正是遍历函数发挥作用的地方。</p>
<h2>1、children</h2>
<p>这个函数得到一组元素的直接子级。</p>
<p>在很多情况下会很方便，看看下面这张图：</p>
<ul style="list-style-type:decimal;">
<li>开始的时候容器中的star全部被选择；</li>
<li>给children()传递一个选择表达式将选择结果缩小至选中的star；</li>
<li>如果chilidren()每接受任何参数，将返回所有直接子级；</li>
<li>不返回孙级元素。</li>
</ul>
<div style="width:528px;text-align:center;"><img src="http://www.icyfire.me/wp-content/uploads/2010/03/10rhtfij/01_children.gif" alt="" /></div>
<h2>2、filter</h2>
<p>这个函数通过传递的选择表达式从一个集合中过滤元素。任何不匹配这个表达式的元素将从选择的集合中移除。</p>
<p>下面的这个例子直截了当。从 5个star中过滤出class为“on”的star。</p>
<div style="width:528px;text-align:center;"><img src="http://www.icyfire.me/wp-content/uploads/2010/03/10rhtfij/02_filter.gif" alt="" /></div>
<h2>3、not</h2>
<p>与filter恰恰相反，not()从集合中移除匹配的元素。</p>
<p>看下面这个例子。偶数列的star从选择集合中移除，留下的是奇数行的star。</p>
<div style="width:528px;text-align:center;"><img src="http://www.icyfire.me/wp-content/uploads/2010/03/10rhtfij/03_not.gif" alt="" /></div>
<blockquote><p>注意：’Even’和’odd’选择器是从0开始的，从0开始计数，不是从1。</p></blockquote>
<h2>4、add</h2>
<p>如果我们想在集合中增加一些元素怎么办？add()函数正是做这件事的。</p>
<p>同样简单明了，photo盒子被添加到集合中。</p>
<div style="width:528px;text-align:center;"><img src="http://www.icyfire.me/wp-content/uploads/2010/03/10rhtfij/04_add.gif" alt="" /></div>
<h2>5、slice</h2>
<p>有时候，我们需要根据元素在集合的位置获取集合的子集。sliece()正是做这个的。</p>
<ul>
<li>第一个参数是从零开始的第一个元素的位置，它包含在返回的片段中；</li>
<li>第二个参数是从零开始的第一个元素的索引。不包含在返回的片段中。如果省略，将延伸至集合的末尾；</li>
<li>所以，<strong>slice(0,2)</strong>将选取前两个star。</li>
</ul>
<div style="width:528px;text-align:center;"><img src="http://www.icyfire.me/wp-content/uploads/2010/03/10rhtfij/05_slice.gif" alt="" /></div>
<h2>6、parent</h2>
<p>parent()函数选取一系列元素的直接父级。</p>
<p>正如下图所示，第一个star的直接父级被选中。非常方便，应当指出，它仅仅返回直接父级，为什么很奇特？因为没有祖父元素或祖先元素被选中。</p>
<div style="width:528px;text-align:center;"><img src="http://www.icyfire.me/wp-content/uploads/2010/03/10rhtfij/06_parent.gif" alt="" /></div>
<h2>7、parents</h2>
<p>这是复数形式，parents()选择集合的所有祖先元素。我的意思是所有祖先元素包括直接父级到“<strong>body</strong>”和“<strong>html</strong>”元素。所以最好通过传递表达式缩小选择结果。</p>
<p>通过给parents()传递<strong>.container</strong>参数，<strong>div.container</strong>将被选中，它实际上第一个star的祖父。</p>
<div style="width:528px;text-align:center;"><img src="http://www.icyfire.me/wp-content/uploads/2010/03/10rhtfij/07_parents.gif" alt="" /></div>
<h2>8、siblings</h2>
<p>这个函数选择一组元素的所有兄弟姐妹，传递一个表达式可以筛选结果。</p>
<p>看看这个例子：</p>
<ul>
<li>谁是第一个star的兄弟节点？其它的四个，对不？</li>
<li>如图所示，“odd”的节点被选中。索引是从零开始的，看看下面star的红色数字。</li>
</ul>
<div style="width:528px;text-align:center;"><img src="http://www.icyfire.me/wp-content/uploads/2010/03/10rhtfij/08_siblings.gif" alt="" /></div>
<h2>9、prev &#038; prevAll</h2>
<p>prev()函数选择前一个兄弟节点。prevAll()选择一个元素集合前面所有的兄弟节点。</p>
<p>如果你正在构建一个星级部件，这将相当方便。第三个star前面的兄弟节点被选中。</p>
<div style="width:528px;text-align:center;"><img src="http://www.icyfire.me/wp-content/uploads/2010/03/10rhtfij/09_prevAll.gif" alt="" /></div>
<h2>10、next &#038; nextAll</h2>
<p>这些函数与prev和prevAll工作方式相同，不过它选择的是下一个兄弟姐妹。</p>
<div style="width:528px;text-align:center;"><img src="http://www.icyfire.me/wp-content/uploads/2010/03/10rhtfij/10_nextAll.gif" alt="" /></div>
<h2>结论</h2>
<p>最后，让我们来看看如何利用这些函数来解决现实世界中令我们头痛的问题。</p>
<pre lang="css" line="1">
$('.star').click(function(){
    $(this).addClass('on');  

//  如何取得当前对象的父级?
    $(this).parent().addClass('rated');  

//  如何获得当前对象左侧的star?
    $(this).prevAll().addClass('on');
    $(this).nextAll().removeClass('on');
});
</pre>
<p>这就是这篇教程中早期提到的问题，对吗？在这几行代码中我们使用了这几个遍历函数。</p>
<ul>
<li>在第5行，看看parent()函数，啊哈，真简单。</li>
<li>在第8行和9行，prevAll()和nextAll().选择填充的star和空的star。</li>
</ul>
<p>现在，遍历函数是做么的方便。当在一起使用时，它们将更加强大。也就是说，一个函数的输出是另一个函数的输入，它们是链式的。</p>
<p>谢谢你的拜读，希望这篇教程在你通过jQuery选择html元素时更容易。你有什么想法？哪个遍历函数是我们遗漏的？</p>
<p>转自：<a href="http://www.denisdeng.com/?p=695">Denis' Blog</a><br />
原文：<a href="http://net.tutsplus.com/tutorials/javascript-ajax/10-super-helpful-traversing-functions-in-jquery/">10 Really Helpful Traversing Functions in jQuery</a>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.icyfire.me/2010/03/10-really-helpful-traversing-functions-in-jquery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[jQuery]怎样开发一个jQuery插件</title>
		<link>http://www.icyfire.me/2009/10/how-to-develop-a-jquery-plugin/</link>
		<comments>http://www.icyfire.me/2009/10/how-to-develop-a-jquery-plugin/#comments</comments>
		<pubDate>Wed, 28 Oct 2009 15:35:00 +0000</pubDate>
		<dc:creator>icyfire</dc:creator>
				<category><![CDATA[网站前端]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[插件]]></category>

		<guid isPermaLink="false">http://www.icyfire.me/?p=882</guid>
		<description><![CDATA[<img src="http://www.icyfire.me/wp-content/uploads/2009/10/114-jquery-plugin.jpg" alt="" />

<a href="http://jquery.com/" target="_blank">jQuery</a>是当前最为流行的JavaScript库，许多网站使用它来实现一些动态效果和Ajax功能。然而，很少的开发者会深入去研究插件的开发。

在这篇教程里，我们将会创建一个简单的插件来解释一些基础。这个插件的作用是将一个或者多个选择的节点的文本翻转。

<b>Translated by icyfire @ Canaand on Wed, 28th Oct.</b>
<font color="#ffffff">看得懂代表你理解能力强，看不懂代表我翻译能力烂……</font> <a href="http://www.icyfire.me/2009/10/how-to-develop-a-jquery-plugin/">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://jquery.com/" target="_blank">jQuery</a>是当前最为流行的JavaScript库，许多网站使用它来实现一些动态效果和Ajax功能。然而，很少的开发者会深入去研究插件的开发。</p>
<p>在这篇教程里，我们将会创建一个简单的插件来解释一些基础。这个插件的作用是将一个或者多个选择的节点的文本翻转（<a href="http://blogs.sitepointstatic.com/examples/tech/jquery-plugin/index.html" target="_blank">示例页面</a>）。</p>
<h2 style="color:#003366;">为什么要创建jQuery插件？</h2>
<p>总而言之，一个词：重用。通过扩展jQuery，你可以创建一个可以在其他任何网页上使用的可重用组件。你的代码会被封装起来，减少了在其他地方函数名冲突的风险。</p>
<h2 style="color:#003366;">jQuery的工作原理</h2>
<p>jQuery传递DOM元素或者一个包含CSS选择器的字符串到其核心函数，然后返回一个jQuery对象，这个对象是一个类似数组的DOM节点集合。这些节点关联了一个或者多个的方法。例如：</p>
<pre class="brush: javascript; gutter: true">
// color all &lt;p&gt; tags red
$("p").css("color", "red");
</pre>
<p>注意：虽然jQuery库的名字是"jQuery"，但是它提供了一个快捷的变量"$"来引用它。需要注意的是，其他的JS库也有可能会使用"$"。</p>
<h2 style="color:#003366;">jQuery插件的工作原理</h2>
<p>jQuery允许添加方法到它的库里。当这些方法被调用的时候，jQuery对象会被传递过去。DOM节点可以根据需要随意操作，同时方法应该返回"this"以便链式调用其他的方法。</p>
<p>我们的示例插件会以以下的形式调用：</p>
<pre class="brush: javascript; gutter: true">
// reverse the text in all &lt;p&gt; tags
$("p").reverseText();
</pre>
<p>我们还会增加两个可选的参数，minlenght和maxlength。当这两个参数被使用的时候，字符串的长度必须在这两个参数的值之间翻转才会发生。</p>
<h2 style="color:#003366;">插件的声明</h2>
<p>插件的定义使用到了jQuery的fn方法，例如：</p>
<pre class="brush: javascript; gutter: true">
jQuery.fn.reverseText = function(params) { ... };
</pre>
<p>之所以使用"jQuery"而不是"$"是想确保不会跟其他的JS库冲突。我们所有的内部代码也都应该这样。但是，我们可以通过使用匿名方法（anonymous function）来帮我们少打几个字和减少文件的大小：</p>
<pre class="brush: javascript; gutter: true">
(function($) {
	$.fn.reverseText = function(params) { ... };
})(jQuery);
</pre>
<p>这个函数会立刻被执行，它传递jQuery作为一个命名为"$"的参数。因为"$"是局部变量，所以我们可以假定它一直作为jQuery的引用而不是其他库的一个全局变量。</p>
<h2 style="color:#003366;">插件参数</h2>
<p>我们为我们的插件设置两个参数：minlength和maxlenght。最简单的方法是把它们作为函数的变量，例如：</p>
<pre class="brush: javascript; gutter: true">
(function($) {
	$.fn.reverseText = function(minlength, maxlength) { ... };
})(jQuery);

// example
$("p").reverseText(0, 100);
</pre>
<p>但是如果我们之后想增加参数呢？我们的插件可能会有很多的选项，变量处理在这种情况下很快就会变得复杂。作为一个替代方案，我们可以传递一个JSON对象给方法：</p>
<pre class="brush: javascript; gutter: true">
(function($) {
	$.fn.reverseText = function(params) { ... }
})(jQuery);

// example
$("p").reverseText( { minlength: 0, maxlength: 100 } );
</pre>
<p>reverseText函数的第一行应该定义一组默认参数，用户可以自定义这些参数的值去覆盖它们。jQuery的extend函数可以帮我们实现：</p>
<pre class="brush: javascript; gutter: true">
// merge default and user parameters
params = $.extend( {minlength: 0, maxlength: 99999}, params);
</pre>
<p>这里，<strong>params.minlength</strong>等于0，而<strong>params.maxlength</strong>等于99999，直到调用时被新的值覆盖。</p>
<h2 style="color:#003366;">插件代码</h2>
<p>我们可以开始写我们的主要代码了：</p>
<pre class="brush: javascript; gutter: true">
// traverse all nodes
this.each(function() {

	// express a single node as a jQuery object
	var $t = $(this);

	// find text
	var origText = $t.text(), newText = '';

	// text length within defined limits?
	if (origText.length >= params.minlength &#038;&  origText.length <= params.maxlength) {

		// reverse text
		for (var i = origText.length-1; i >= 0; i--) newText += origText.substr(i, 1);
		$t.text(newText);

	}

});
</pre>
<p>解释：</p>
<ul>
<li>方法this.each遍历了所有的jQuery DOM节点，并调用了一个匿名函数。</li>
<li>在这个匿名函数里，'this'代表了一个节点。我们把这个jQuery的节点集合赋值予$t，这样我们就能使用jQuery的方法了。</li>
<li>变量origText被赋予了节点的文本值，而变量newText则被设为一个空的字符串。</li>
<li>如果origText的长度介于params.minlength和params.maxlength之间，那么通过一个循环，我们把它的值进行了翻转。然后，我们相应的更新了DOM节点的文本值。</li>
</ul>
<h2 style="color:#003366;">别破坏连锁！</h2>
<p>最后，切记要返回一个jQuery对象，这样其他方法可以进行链式调用了：</p>
<pre class="brush: javascript; gutter: true">
return this;
</pre>
<h2 style="color:#003366;">完整的代码</h2>
<p>我们的插件代码终于完成了：</p>
<pre class="brush: javascript; gutter: true">
(function($) {

    // jQuery plugin definition
    $.fn.reverseText = function(params) {

	// merge default and user parameters
	params = $.extend( {minlength: 0, maxlength: 99999}, params);

	// traverse all nodes
	this.each(function() {

	    // express a single node as a jQuery object
	    var $t = $(this);

	    // find text
	    var origText = $t.text(), newText = '';

	    // text length within defined limits?
	    if (origText.length >= params.minlength &#038;&  origText.length <= params.maxlength) {

		// reverse text
		for (var i = origText.length-1; i >= 0; i--) newText += origText.substr(i, 1);
		    $t.text(newText);

	    }

	});

	// allow jQuery chaining
	return this;
    };

})(jQuery);
</pre>
<p>文件保存为：jquery.reversetext.js。之后在HTML页面里我们可以在加载jQuery后引入它：</p>
<pre class="brush: html; gutter: true">
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="en">
<head>

</head>
<body>
<h1>jQuery plugin: reverseText</h1>

This jQuery plugin reverses all the text in the selected nodes.
<ul>
<li>This text will be reversed</li>
<li>This text will not be reversed</li>
<li>reversed</li>
<li>not reversed</li>
</ul>

<script type="text/javascript" src="jquery-1.3.2.min.js"></script>
<script type="text/javascript" src="jquery.reversetext.js"></script>
<script type="text/javascript">
// reverse even-numbered LI tag text
$("ul li:even").reverseText();
</script>

</body>
</html>
</pre>
<p>现在这个页面的list的第一行和第三行都被翻转了（记住，第一项是从0开始）：<br />
<img src="http://www.icyfire.me/wp-content/uploads/2009/10/114-jquery-plugin-example.png" alt="" /><br />
<strong>资源：</strong></p>
<ul>
<li><a href="http://blogs.sitepointstatic.com/examples/tech/jquery-plugin/index.html" target="_blank"><strong>查看插件示例页面</strong></a></li>
<li><a href="http://blogs.sitepointstatic.com/examples/tech/jquery-plugin/jquery.reversetext.js" target="_blank">查看插件代码</a></li>
<li><a href="http://blogs.sitepointstatic.com/examples/tech/jquery-plugin/jquery.reversetext.zip" target="_blank">现在插件和实例代码</a></li>
</ul>
<p>现在你应该对jQuery插件开发有不错的了解了。<a href="http://www.sitepoint.com/forums//forumdisplay.php?f=15" target="_blank">SitePoint JavaScript forum</a>也是一个学习的好地方。</p>
<p><strong>Translated by icyfire @ Canaand on Wed, 28th Oct.</strong></p>
<p>作者：<a href="http://www.sitepoint.com/articlelist/560">Craig Buckler</a><br />
原文：<a href="http://www.sitepoint.com/blogs/2009/07/22/how-to-develop-a-jquery-plugin/">How To Develop a jQuery Plugin</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.icyfire.me/2009/10/how-to-develop-a-jquery-plugin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[jQuery]FancyBox</title>
		<link>http://www.icyfire.me/2009/07/jqueryfancybox/</link>
		<comments>http://www.icyfire.me/2009/07/jqueryfancybox/#comments</comments>
		<pubDate>Wed, 29 Jul 2009 10:33:08 +0000</pubDate>
		<dc:creator>icyfire</dc:creator>
				<category><![CDATA[网站前端]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Lightbox]]></category>

		<guid isPermaLink="false">http://www.icyfire.me/?p=852</guid>
		<description><![CDATA[<img src="/wp-content/uploads/2009/07/jquery_fancybox.gif" alt="Fancybox" />

又一个实现Lightbox效果的jQuery插件，不过采用了Mac系统的样式。它主要有以下功能：
<ul>
	<li>弹出的窗口有很漂亮的阴影效果。</li>
	<li>关联的对象（就是rel标签的值一样）会成组显示，上面还有导航的按钮（上一项，下一项）。</li>
	<li>可以显示图片、内联、ajax和iframe内容。</li>
	<li>可以通过设置参数和CSS定制效果。</li>
	<li>通过easing插件可以实现fancy transitions效果（就是一些动画效果）。</li>
</ul> <a href="http://www.icyfire.me/2009/07/jqueryfancybox/">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><strong>作者：</strong>Janis Skarnelis<br />
<strong>网站：</strong><a href="http://fancybox.net/" target="_blank">http://fancybox.net/</a><br />
<strong>版本：</strong>1.2.1<br />
<strong>授权：</strong><a href="http://en.wikipedia.org/wiki/MIT_License" target="_blank">MIT License</a> </p>
<h2 style="border-bottom:1px solid #CDCDCD;padding-bottom:5px;" id="intro">介绍</h2>
<p>又一个实现Lightbox效果的jQuery插件，不过采用了Mac系统的样式。它主要有以下功能：</p>
<ul>
<li>弹出的窗口有很漂亮的阴影效果。</li>
<li>关联的对象（就是rel标签的值一样）会成组显示，上面还有导航的按钮（上一项，下一项）。</li>
<li>可以显示图片、内联、ajax和iframe内容。</li>
<li>可以通过设置参数和CSS定制效果。</li>
<li>通过easing插件可以实现fancy transitions效果（就是一些动画效果）。</li>
</ul>
<h2 style="border-bottom:1px solid #CDCDCD;padding-bottom:5px;" id="demo">演示</h2>
<link rel="stylesheet" type="text/css" href="/wp-example/js/fancybox/jquery.fancybox/jquery.fancybox.css" media="screen" /><script type="text/javascript" src="/wp-example/js/fancybox/jquery.fancybox/jquery-1.3.2.min.js"></script><script type="text/javascript" src="/wp-example/js/fancybox/jquery.fancybox/jquery.easing.1.3.js"></script><script type="text/javascript" src="/wp-example/js/fancybox/jquery.fancybox/jquery.fancybox-1.2.1.pack.js"></script><script type="text/javascript">
$(document).ready(function() {
$("a#single_1").fancybox();
$("a#single_2").fancybox({
'zoomOpacity' : true,
'overlayShow' : false,
'zoomSpeedIn' : 500,
'zoomSpeedOut' : 500
});
$("a#single_3").fancybox({
'overlayShow' : false,
'zoomSpeedIn' : 600,
'zoomSpeedOut' : 500,
'easingIn' : 'easeOutBack',
'easingOut' : 'easeInBack'
});
$("a.group").fancybox({
'hideOnContentClick': false
});
}); 
</script><br />
<style>
a {
	outline: none;	
}
div#wrap {
	width: 528px;
	margin: 0px auto;	
}
div#wrap img {
	border: 1px solid #CCC;
	padding: 2px;	
	margin: 10px 10px 10px 0;
}
</style>
<div id="wrap">
<p>
		Single image <br />	<br />
		<a id="single_1" title="Sample title" href="/wp-example/js/fancybox/example/1_b.jpg"><img src="/wp-example/js/fancybox/example/1_s.jpg" /></a><a id="single_2" href="/wp-example/js/fancybox/example/3_b.jpg"><img src="/wp-example/js/fancybox/example/3_s.jpg" /></a><a id="single_3" href="/wp-example/js/fancybox/example/4_b.jpg"><img src="/wp-example/js/fancybox/example/4_s.jpg" /></a>
	</p>
<p>
		Image group <br />	<br />
		<a class="group" rel="group" title="Group title #1" href="/wp-example/js/fancybox/example/2_b.jpg"><img src="/wp-example/js/fancybox/example/2_s.jpg" /></a><a class="group" rel="group" title="Group title #2" href="/wp-example/js/fancybox/example/3_b.jpg"><img src="/wp-example/js/fancybox/example/3_s.jpg" /></a><a class="group" rel="group" href="/wp-example/js/fancybox/example/4_b.jpg"><img src="/wp-example/js/fancybox/example/4_s.jpg" /></a>
	</p>
</div>
<h2 style="border-bottom:1px solid #CDCDCD;padding-bottom:5px;" id="usage">用法</h2>
<p><strong>1.引入必须的js库</strong></p>
<pre lang="javascript">
<script type="text/javascript" src="path-to-file/jquery.js"></script>
<script type="text/javascript" src="path-to-file/jquery.fancybox.js">
</script>
</pre>
<p>如果要使用一些动画效果，还要引入以下js</p>
<pre lang="javascript">
<script type="text/javascript" src="path-to-file/jquery.easing.js">
</script>
</pre>
<p><strong>2.导入CSS文件，由于CSS里使用的图片默认跟CSS是放在同一个目录下的，所以如果你的CSS跟图片分开放，记得修改CSS里的图片路径。</strong></p>
<pre lang="html4strict">
<link rel="stylesheet" href="path-to-file/fancybox.css" type="text/css" media="screen">
</pre>
<p><strong>3.创建一个链接元素</strong>。<br />
图片</p>
<pre lang="html4strict">
<a id="single_image" href="image_big.jpg"><img src="image_small.jpg" alt=""/></a>
</pre>
<p>inline内容</p>
<pre lang="html4strict">
<a id="inline" href="#data">This shows content of element who has id="data"</a>
</pre>
<p>iframe框架</p>
<pre lang="html4strict">
<a href="http://www.example?iframe">This goes to iframe</a>
<!--or-->
<a class="iframe" href="http://www.example">This goes to iframe</a>
</pre>
<p>Ajax</p>
<pre lang="html4strict">
<a href="http://www.example/data.php">This takes content using ajax</a>
</pre>
<p>可选项：如果要显示标题，可以通过设置a里的<em>title</em>属性实现。<br />
注意：如果显示的为iframe或者inline内容而且在他们里面包含有可以点击的对象，那么把<strong>hideOnContentClick</strong>属性设为<strong>false</strong>，不然那个点击就会跟hideOnContentClick这个效果冲突了。<br />
<strong>4.使用jQuery选择器调用功能。</strong><br />
例如：</p>
<pre lang="css">
$(document).ready(function() {

	/* This is basic - uses default settings */

	$("a#single_image").fancybox();

	/* Using custom settings */

	$("a#inline").fancybox({
		'hideOnContentClick': true
	});

	$("a.group").fancybox({
		'zoomSpeedIn':		300,
		'zoomSpeedOut':	        300,
		'overlayShow':		false
	});
});
</pre>
<p>相册效果需要把同一个相册的相片的"<strong>rel</strong>"属相设为一样的值。</p>
<h2 style="border-bottom:1px solid #CDCDCD;padding-bottom:5px;" id="config">参数</h2>
<table width="100%" border="0" cellpadding="0" cellspacing="0">
<tr>
<td width="45%" style="border-bottom:1px solid #CFCCC2;padding:5px 15px 5px 3px;">padding</td>
<td style="border-bottom:1px solid #CFCCC2;padding:5px 15px 5px 3px;">跟CSS里的padding差不多一个意思</td>
</tr>
<tr>
<td style="border-bottom:1px solid #CFCCC2;padding:5px 15px 5px 3px;">imageScale</td>
<td style="border-bottom:1px solid #CFCCC2;padding:5px 15px 5px 3px;">如果为true，则图片会被缩放以适应窗口</td>
</tr>
<tr>
<td style="border-bottom:1px solid #CFCCC2;padding:5px 15px 5px 3px;">zoomOpacity</td>
<td style="border-bottom:1px solid #CFCCC2;padding:5px 15px 5px 3px;">如果为true，则在动画过程中内容的透明度会改变</td>
</tr>
<tr>
<td style="border-bottom:1px solid #CFCCC2;padding:5px 15px 5px 3px;">zoomSpeedIn</td>
<td style="border-bottom:1px solid #CFCCC2;padding:5px 15px 5px 3px;">zooming-in动画时的速度，单位为毫秒。0的话动画将不会出现</td>
</tr>
<tr>
<td style="border-bottom:1px solid #CFCCC2;padding:5px 15px 5px 3px;">zoomSpeedOut</td>
<td style="border-bottom:1px solid #CFCCC2;padding:5px 15px 5px 3px;">zooming-out动画时的速度，单位为毫秒。0的话动画将不会出现</td>
</tr>
<tr>
<td style="border-bottom:1px solid #CFCCC2;padding:5px 15px 5px 3px;">zoomSpeedChange</td>
<td style="border-bottom:1px solid #CFCCC2;padding:5px 15px 5px 3px;">切换图片时的动画速度，单位为毫秒。值为0的话将不会出现动画</td>
</tr>
<tr>
<td style="border-bottom:1px solid #CFCCC2;padding:5px 15px 5px 3px;">easingIn, easingOut, easingChange</td>
<td style="border-bottom:1px solid #CFCCC2;padding:5px 15px 5px 3px;">决定动画使用何种easing效果</td>
</tr>
<tr>
<td style="border-bottom:1px solid #CFCCC2;padding:5px 15px 5px 3px;">frameWidth</td>
<td style="border-bottom:1px solid #CFCCC2;padding:5px 15px 5px 3px;">iframe和inline框口的默认宽度</td>
</tr>
<tr>
<td style="border-bottom:1px solid #CFCCC2;padding:5px 15px 5px 3px;">frameWidth</td>
<td style="border-bottom:1px solid #CFCCC2;padding:5px 15px 5px 3px;">iframe和inline框口的默认宽度</td>
</tr>
<tr>
<td style="border-bottom:1px solid #CFCCC2;padding:5px 15px 5px 3px;">frameHeight</td>
<td style="border-bottom:1px solid #CFCCC2;padding:5px 15px 5px 3px;">iframe和inline框口的默认高度</td>
</tr>
<tr>
<td style="border-bottom:1px solid #CFCCC2;padding:5px 15px 5px 3px;">overlayShow</td>
<td style="border-bottom:1px solid #CFCCC2;padding:5px 15px 5px 3px;">如果值为true的话，则显示遮罩，默认为false。遮罩的颜色可以在CSS里定义</td>
</tr>
<tr>
<td style="border-bottom:1px solid #CFCCC2;padding:5px 15px 5px 3px;">overlayOpacity</td>
<td style="border-bottom:1px solid #CFCCC2;padding:5px 15px 5px 3px;">遮罩的透明度。值为0到1.</td>
</tr>
<tr>
<td style="border-bottom:1px solid #CFCCC2;padding:5px 15px 5px 3px;">hideOnContentClick</td>
<td style="border-bottom:1px solid #CFCCC2;padding:5px 15px 5px 3px;">值为true的话，则在点击Fancybox对象时，Fancybox会被隐藏</td>
</tr>
<tr>
<td style="border-bottom:1px solid #CFCCC2;padding:5px 15px 5px 3px;">centerOnScroll</td>
<td style="border-bottom:1px solid #CFCCC2;padding:5px 15px 5px 3px;">值为true时，当用户滚动页面时，内容会一直居中显示</td>
</tr>
<tr>
<td style="border-bottom:1px solid #CFCCC2;padding:5px 15px 5px 3px;">itemArray</td>
<td style="border-bottom:1px solid #CFCCC2;padding:5px 15px 5px 3px;">可选项，可以设置自定义数组（事实上我还不知道用来干嘛的= =有空再研究下代码）</td>
</tr>
<tr>
<td style="border-bottom:1px solid #CFCCC2;padding:5px 15px 5px 3px;">callbackOnStart</td>
<td style="border-bottom:1px solid #CFCCC2;padding:5px 15px 5px 3px;">可选项，在Fancybox启动时会被调用</td>
</tr>
<tr>
<td style="border-bottom:1px solid #CFCCC2;padding:5px 15px 5px 3px;">callbackOnShow</td>
<td style="border-bottom:1px solid #CFCCC2;padding:5px 15px 5px 3px;">可选项，在Fancybox显示内容时会被调用</td>
</tr>
<tr>
<td style="border-bottom:1px solid #CFCCC2;padding:5px 15px 5px 3px;">callbackOnClose</td>
<td style="border-bottom:1px solid #CFCCC2;padding:5px 15px 5px 3px;">可选项，在Fancybox关闭时会被调用</td>
</tr>
</table>
<h2 style="border-bottom:1px solid #CDCDCD;padding-bottom:5px;" id="compatibility">兼容性</h2>
<p>支持最新版本的FireFox, Safari 和 Opera ，还有 IE6 和 IE7。另外稍微测试了下，Chrome也支持。</p>
<h2 style="border-bottom:1px solid #CDCDCD;padding-bottom:5px;" id="download">下载</h2>
<p>请到<a href="http://code.google.com/p/fancybox/downloads/list" target="_blank">Google Code</a>下载。文件包含了Fancybox这个插件以及实例。另外jQuery和easing这个插件也包含在里面。</p>
<h2 style="border-bottom:1px solid #CDCDCD;padding-bottom:5px;" id="faq">FAQ</h2>
<p><strong>1.根本就运行不了。图片在新的窗口打开了。出了虾米错？</strong><br />
检查下你是否已经导入了所有的文件以及设置正不正确。<br />
<strong>2.Fancybox可以在flash内容上面显示吗？</strong><br />
可以。看<a href="http://www.communitymx.com/content/article.cfm?cid=E5141" target="_blank">这里</a>。<br />
<strong>3.可以在iframe里调用代码吗？</strong><br />
因为Fancybox这个插件是依附在页面body上的，所以不能这样调用。如有需要请修改Fancybox的代码。<br />
<strong>4.有没有Wordpress上可以使用的插件？</strong><br />
有一些，你可以试试<a href="http://wordpress.org/extend/plugins/fancybox-for-wordpress/" target="_blank">这个</a>。<br />
<strong>5.怎样在其他元素上关闭Fancybox？</strong><br />
调用<em>$.fn.fancybox.close()</em>就行了。</p>
<p>以上内容基本都来自或者翻译自官网<a href="http://fancybox.net/" target="_blank">http://fancybox.net/</a>。<br />
这个东西其实在很早前就被我运用于项目了，当时还是1.0版本左右，后来作者很久没更新了，直到jQuery出了1.3后作者立刻就出了新版本了～<br />
icyfire 2009-07-29</p>
]]></content:encoded>
			<wfw:commentRss>http://www.icyfire.me/2009/07/jqueryfancybox/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[jQuery]Airport - Information board text effect</title>
		<link>http://www.icyfire.me/2009/07/jquery-airport-information-board-text-effect/</link>
		<comments>http://www.icyfire.me/2009/07/jquery-airport-information-board-text-effect/#comments</comments>
		<pubDate>Thu, 16 Jul 2009 07:47:33 +0000</pubDate>
		<dc:creator>icyfire</dc:creator>
				<category><![CDATA[网站前端]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Text Effect]]></category>
		<category><![CDATA[文字效果]]></category>

		<guid isPermaLink="false">http://www.icyfire.me/?p=848</guid>
		<description><![CDATA[<div style="width:528px;text-align:center;"><img src="/wp-content/uploads/2009/07/jquery_airport.jpg" alt="" /></div>

好久没更新啦，找个几分钟就能写完的充下数…… <a href="http://www.icyfire.me/2009/07/jquery-airport-information-board-text-effect/">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><iframe width="528" height="35" frameborder="0" scrolling="no" src="/wp-example/js/airport/index.html"></iframe></p>
<p>这个小插件（灰常小）实现了类似机场里信息板的文字效果。</p>
<p><strong>官网：</strong><a href="http://www.unwrongest.com/projects/airport/" target="_blank">http://www.unwrongest.com/projects/airport/</a></p>
<p><strong>下载</strong>也请到上面网站。</p>
<p><strong>用法：</strong></p>
<pre lang="html4strict" line="1">
<script type="text/javascript" src="jquery-1.3.2.min.js"></script>
<script type="text/javascript" src="jquery.airport-1.1.js"></script> 
<div id="stuff"></div>

<script type="text/javascript"> 
$('#stuff').airport(['moscow','berlin','stockholm']); 
</script>
</pre>
<p><strong>问题：</strong><br />
1.只支持英文，外加一个连字符。看代码就知道怎么回事了。<br />
2.另外，大写英文也没用，它会帮你转为小写。<br />
3.会发现字符转换时会有类似抖动的效果，那是因为字符在某些字体下的宽度是不同的。解决方法有两个，那么设font-family:monospace;要么为装载字符的span加上样式设置宽度，例如：(#stuff span { width: 20px; float: left; display: block;text-align: center;}。<br />
4.你会发现，就算有些地方是空白，它还是会在转动，那是转换字符的区域的长度就是传入参数里的字符串的最大长度。难道机场的也是这样的？没什么印象了。</p>
<p>--by icyfire 2009.07.16 @company</p>
]]></content:encoded>
			<wfw:commentRss>http://www.icyfire.me/2009/07/jquery-airport-information-board-text-effect/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[jQuery]Blackbird</title>
		<link>http://www.icyfire.me/2009/06/jqueryblackbird/</link>
		<comments>http://www.icyfire.me/2009/06/jqueryblackbird/#comments</comments>
		<pubDate>Fri, 19 Jun 2009 09:53:40 +0000</pubDate>
		<dc:creator>icyfire</dc:creator>
				<category><![CDATA[网站前端]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Javascript库]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://www.icyfire.me/?p=832</guid>
		<description><![CDATA[<img src="/wp-content/uploads/2009/06/blackbird.jpg" />

<blockquote><a href="http://www.gscottolson.com/blackbirdjs/" target="_blank">Blackbird</a> offers a dead-simple way to log messages in JavaScript and an attractive console to view and filter them. You might never use alert() again.</blockquote> <a href="http://www.icyfire.me/2009/06/jqueryblackbird/">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><iframe width="528" height="500" frameborder="0" scrolling="no" src="/wp-example/js/blackbird/index.html"></iframe></p>
<p>已经厌烦了用alert去调试js吗？那别错过这个js了。先不说啥了，点击上面的代码看看效果吧。<br />
利用这个js，你可以轻松的在js输出任何信息不同的信息会有不同的图标表示。而且不像alert，blackbird不会中断js的执行。</p>
<p>首先介绍下官网：<br />
<a href="http://www.gscottolson.com/blackbirdjs/" target="_blank">http://www.gscottolson.com/blackbirdjs/</a><br />
我上面的demo以及下面将会说到的都是来源自这个网站。</p>
<p><strong>下载：</strong><br />
先把需要用到的文件下载下来，可以点击<a href="http://blackbirdjs.googlecode.com/files/blackbirdjs-1.0.zip" target="_blank">这里</a>下载。下载下来的zip会解压出很多文件，你会看到它还提供MAC OSX版本的文件。我们需要用到的是：<strong>blackbird.js</strong>，<strong>blackbird.css</strong>以及<strong>blackbird_icons.png</strong>和<strong>blackbird_panel.png</strong>两张图片，另外由于Blackbird是基于jQuery的，所以还需要下载jquery，请自行到<a href="http://docs.jquery.com/Downloading_jQuery" target="_blank">jQuery网站</a>下载。需要注意到是Blackbird用到是1.2.6版本。</p>
<p><strong>配置：</strong><br />
然后在页面引用这些资源：</p>
<pre lang="html4strict">
<script type="text/javascript" src="scripts/jquery-1.2.6.js"></script>
<script type="text/javascript" src="scripts/blackbird.js"></script>
<link rel="stylesheet" href="css/blackbird.css" type="text/css" />
</pre>
<p>需要注意到是两种图片的位置必须放置正确，默认是跟css同目录下，如有需要自行修改css文件</p>
<p><strong>使用方法</strong>：<br />
添加log的方法很简单，看demo那里的代码就清楚了：</p>
<pre lang="javascript">
log.debug( 'this is a debug message' );
log.info( 'this is an info message' );
log.warn( 'this is a warning message' );
log.error( 'this is an error message' );
</pre>
<p>从上面代码可以看出，log可以分为4种类型：<strong>debug</strong>、<strong>info</strong>、<strong>warn</strong>跟<strong>error</strong>，在输出面板上分别会用不同的icon表示。</p>
<p>另外你还能使用<strong>profile</strong>方法记录代码的执行时间，代码就不贴了，请参见demo里关于profile方法的代码。作为profile方法的那个字符串将作为一个标识，如果在第二次调用profile方法时使用相同的字符串的话，则两次调用profile方法之间的时间间隔会被记录下来。跟上面4种类型的log一样，profile在显示面板上也有专属的icon。</p>
<p><strong>API：</strong><br />
除了上面提高过的几个方法外，Blackbird提供其他很多方法供调用。</p>
<table>
<tr>
<td width="120">log.toggle()</td>
<td>隐藏/显示Blackbird面板</td>
</tr>
<tr>
<td valign="top">log.move()</td>
<td>移动面板，但是移动的位置是固定的，会在左上，右上，左下，右下之间循环切换。</td>
</tr>
<tr>
<td>log.resize()</td>
<td>放大或者缩小Blackbird面板。其实就是在两个大小之间切换。</td>
</tr>
<tr>
<td>log.clear()</td>
<td>清楚面板上的log记录。</td>
</tr>
<tr>
<td>log.debug(message)</td>
<td>记录debug信息。</td>
</tr>
<tr>
<td>log.info(message)</td>
<td>记录info信息。</td>
</tr>
<tr>
<td>log.warn(message)</td>
<td>记录warning信息。</td>
</tr>
<tr>
<td>log.error(message)</td>
<td>记录error信息。</td>
</tr>
<tr>
<td valign="top">llog.profile(label)</td>
<td>开始或结束一个计时器，这个方法会把输入的参数作为一个标识，如果两次调用这个方法使用的参数一样，则两次调用方法之间的时间间隔就会记录下来。</td>
</tr>
</table>
<p><strong>键盘控制：</strong><br />
可以通过键盘上的快捷键控制面板。<br />
<strong>F2</strong>用来显示或者隐藏面板，相当于toggle()方法。<br />
<strong>Shift + F2</strong>用来移动面板，相当于move()方法。<br />
<strong>Alt + Shift + F2</strong>是清除功能，相当于clear()方法。</p>
<p><strong>图标解释</strong>：<br />
Blackbird的控制台面板上有很多图标，左边5个分别为：debug信息的开关，info信息的开关，warning信息的开关，error信息的开关，profile信息的开服按。而右边5个则分别为：切换面板大小，清除log，关闭面板。关闭面板并不会把上面的log清除。<br />
另外可以通过<strong>Alt + 点击</strong>信息图标来单独显示那个图标对应的信息。</p>
<p><strong>修改命名空间：</strong><br />
如果有其他的js使用了跟Blackbird相同的命名空间（namespace），则可以通过修改以下的代码来修改命名空间：<br />
var NAMESPACE = 'log';<br />
修改了命名空间后，则调用方法也需要作相应的改变。例如var NAMESPACE = 'myCustomLog';以log.debug()<br />
为例，则需要改为myCustomLog.debug()。</p>
<p><strong>浏览器兼容性：</strong><br />
IE 6+，FF 2+，Safari 2+，Opera 9.5<br />
另外我在Chrome 2测试也没问题。</p>
<p><strong>补充：</strong><br />
面板上有个Visible on page load的功能，就是用来开关加载页面后显不显示的功能。实现方法是通过cookie。详情可以看下载回来的demo页面代码。<br />
另外个人觉得这个Blackbird并不能完全代替alert功能，因为毕竟它要在页面插入自己的代码，这样就会破坏了页面原有的DOM结构，可能会影响到某些需要对DOM进行操作的js。</p>
<p>更多的详情也请到<a href="http://www.gscottolson.com/blackbirdjs/" target="_blank">官网</a>进行查看。</p>
<p>--by icyfire @Home on 2009.06.19</p>
]]></content:encoded>
			<wfw:commentRss>http://www.icyfire.me/2009/06/jqueryblackbird/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[javascript]AJAX Queue/Synch/Abort/Block Manager</title>
		<link>http://www.icyfire.me/2009/03/javascriptajax-queuesynchabortblock-manager/</link>
		<comments>http://www.icyfire.me/2009/03/javascriptajax-queuesynchabortblock-manager/#comments</comments>
		<pubDate>Sat, 21 Mar 2009 11:20:29 +0000</pubDate>
		<dc:creator>icyfire</dc:creator>
				<category><![CDATA[网站前端]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Javascript库]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://www.icyfire.me/?p=784</guid>
		<description><![CDATA[<pre lang="javascript" line="1">
var ajaxManager1 = $.manageAjax({manageType: 'abortOld', maxReq: 0}); 
ajaxManager1.add({   
  success: function(html) {       
    $('ul').append('<li>'+html+'</li>');   
  },   
  url: 'test.html' });
</pre>
现在网站用ajax的频率越来越高了，特别是一些网页游戏，到处都能看到ajax的运用。
这个javascript库是用来管理ajax的调用，包括请求（request）和回应（response），使得ajax的调用更加的有可控性。

详情参见正文。 <a href="http://www.icyfire.me/2009/03/javascriptajax-queuesynchabortblock-manager/">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>这个js库可以实现对ajax调用的管理，例如ajax队列，中断调用，阻塞调用等等。<br />
首先来看下示范代码：</p>
<pre lang="javascript" line="1">
var ajaxManager1 = $.manageAjax({manageType: 'abortOld', maxReq: 0});
ajaxManager1.add({
  success: function(html) {
    $('ul').append('
<li>'+html+'</li>

');
  },
  url: 'test.html' });
</pre>
<div style="line-height:23px;">
要使用这个js，首先你要调用$.manageAjax这个方法（先在header包含js文件就不用说了吧）。这个方法接受以下的参数：</p>
<ul>
<li><strong>jQuery Ajax</strong>的参数，详情点击<a href="http://docs.jquery.com/Ajax/jQuery.ajax#options">这里</a>。</li>
<li><strong>manageType:(string)</strong>：指定ajax队列的行为。它可以接受如下几个值：
<ul>
<li><strong>'sync'</strong>：这个参数表示ajax的response顺序将会跟request时的顺序一样。</li>
<li><strong>'queue'</strong>：这个参数表示ajax的request将会排成队列顺序执行。就是说第二个请求的response会在第一个请求的response之后。要使用这个参数必须指定maxReq。</li>
<li><strong>'abortOld'</strong>：如果有一个较新的request的response，则旧的就会被中断掉。</li>
<li><strong>'normal'</strong>：普通的ajax行为。</li>
</ul>
</li>
<li><strong>maxReq:(number)</strong>：这个参数用来限制队列里ajax请求的处理个数。如果你的manageType不是设为'queue'，那么较早的请求将会被终止。（默认值为0，表示不限制队列的请求个数。）</li>
<li><strong>blockSameRequest:(boolean)</strong>：如果为true，则相同的请求将不会被执行。默认为false。</li>
</ul>
<p>在创建了$.ajaxManager对象后，有两个方法供调用：</p>
<ul>
<li>$.ajaxManager.prototype.<strong>add</strong>:(options)：用这个方法可以添加一个ajax请求。方法将返回请求的索引值。options为以下值：
<ul>
<li>普通的<strong>jQuery Ajax Options</strong>。详情点击<a href="http://docs.jquery.com/Ajax/jQuery.ajax#options">这里</a>。</li>
<li><strong>'abort'</strong>: ([function])：请求被终止时，将会调用指定的方法。</li>
</ul>
</li>
<li>$.ajaxManager.prototype.<strong>abort</strong>: ([number])：用来终止队列里的ajax请求。如果指定索引值的话，则只会终止该索引对应的请求。</li>
</ul>
<p>Demo可以到<a href="http://www.protofunc.com/scripts/jquery/ajaxManager/">官网</a>进行查看。如果你使用FF的话，还可以用firebug进行追踪，看看每种manageType具体是怎么运作的。下面是我就网站里的demo的一些测试结果：<br />
<strong>{manageType: 'sync', maxReq: 0}</strong><br />
各个请求将会按照请求顺序进行返回。假如先后有两个请求：3 secounds delay和2 secounds delay。虽然2 secounds delay的回应回比3 secounds delay要快，但是首先调用callback的会是3 secounds delay。<br />
<strong>{manageType: 'abortOld', maxReq: 0}  </strong><br />
照上面的解释，如果后面的请求的回应比先前的早，那么先前的请求将被abort。而且maxReq为0，所以这里的Demo貌似看不出什么效果……<br />
<strong>{maxReq: 2}</strong><br />
同时只能对两个请求进行管理。较早的请求将会被终止。例如前后调用了2 secounds delay，3 secounds delay，2 secounds delay，则回应的会是3 secounds delay及后面那个2 secounds delay，第一个2 secounds delay将不会执行到callback。<br />
<strong>{manageType: 'abortOld', maxReq: 2, blockSameRequest: true}</strong><br />
这个demo的结果有点莫名其妙。举个例子。假如先后调用了3 secounds delay，2 secounds delay和1 secound delay，有时3 secounds delay和2 secounds delay会被abort，有时只有3 secounds delay被abort。其他的情况也会出现不同的结果，有待测试= =<br />
<strong>{manageType: 'queue', maxReq: 2, blockSameRequest: true}</strong><br />
这个也有点问题。假如调用顺序为2，2，2，则只会执行一个2，这个没什么问题。但是假如调用顺序为3，2，3，有时则以2，3的顺序回调，有时则以3，2的顺序回调。搞不懂= =</p>
<p>大概我还没搞清楚blockSameRequest的效果吧，毕竟block跟abort是不同的。</p>
<p>详情内容及下载请到官网：<br />
<a href="http://www.protofunc.com/scripts/jquery/ajaxManager/">http://www.protofunc.com/scripts/jquery/ajaxManager/</a>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.icyfire.me/2009/03/javascriptajax-queuesynchabortblock-manager/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

