<?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>IInterest &#187; Javascript</title>
	<atom:link href="http://www.iinterest.net/category/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.iinterest.net</link>
	<description>关注移动互联网 &#38; HTML5</description>
	<lastBuildDate>Sat, 07 Jan 2012 08:07:27 +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>Mac下安装node.js以及部署UglifyJS</title>
		<link>http://www.iinterest.net/2011/04/09/mac-node-js-uglifyjs/</link>
		<comments>http://www.iinterest.net/2011/04/09/mac-node-js-uglifyjs/#comments</comments>
		<pubDate>Sat, 09 Apr 2011 08:10:03 +0000</pubDate>
		<dc:creator>Bell</dc:creator>
				<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://www.iinterest.net/?p=1165</guid>
		<description><![CDATA[最近UglifyJS比较火，原因是jquery1.5放弃Google Closure Compiler而改用UglifyJS来作为代码压缩工具，为了体验下UglifyJS，趁周末花了几个小时来折腾。 这里记录的是Mac下的安装过程，Ubuntu下也类似，而windows下可能就更复杂一些，需要cygwin。 1.安装Xcode 因为已安装过Xcode所以不知道这一步是不是必要，目前Xcode4是最新版需要在App store中购买。 2.安装git 详细的安装步骤可以看这里：http://help.github.com/mac-set-up-git/ 注意的地方：你需要一个github.com的账号。 3.安装node.js UglifyJS需要在node.js环境下运行。 详细步骤在这里：https://github.com/joyent/node/wiki/Installation 安装好后可以通过hello_node.js来验证安装是否正确： var http = require(&#8216;http&#8217;); http.createServer(function (request, response) { response.writeHead(200, {&#8216;Content-Type&#8217;: &#8216;text/html&#8217;}); response.end(&#8216;Hello World&#8216;); }).listen(8124); console.log(&#8216;Server running at http://127.0.0.1:8124/&#8217;); 在终端中运行这段代码： node hello_node.js 然后用浏览器打开 http://127.0.0.1:8124/ ， 成功的话可以看到Hello World页面。 &#8230; <a href="http://www.iinterest.net/2011/04/09/mac-node-js-uglifyjs/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>最近UglifyJS比较火，原因是jquery1.5放弃Google Closure Compiler而改用UglifyJS来作为代码压缩工具，为了体验下UglifyJS，趁周末花了几个小时来折腾。<br />
这里记录的是Mac下的安装过程，Ubuntu下也类似，而windows下可能就更复杂一些，需要cygwin。<br />
<span id="more-1165"></span></p>
<h3>1.安装Xcode</h3>
<p>因为已安装过Xcode所以不知道这一步是不是必要，目前Xcode4是最新版需要在App store中购买。</p>
<h3>2.安装git</h3>
<p>详细的安装步骤可以看这里：<a href="http://help.github.com/mac-set-up-git/">http://help.github.com/mac-set-up-git/</a><br />
注意的地方：你需要一个<a href="https://github.com">github.com</a>的账号。</p>
<h3>3.安装node.js</h3>
<p>UglifyJS需要在node.js环境下运行。<br />
详细步骤在这里：<a href="https://github.com/joyent/node/wiki/Installation">https://github.com/joyent/node/wiki/Installation</a><br />
安装好后可以通过hello_node.js来验证安装是否正确：</p>
<blockquote><p>
var http = require(&#8216;http&#8217;);<br />
http.createServer(function (request, response) {<br />
  response.writeHead(200, {&#8216;Content-Type&#8217;: &#8216;text/html&#8217;});<br />
  response.end(&#8216;<b>Hello World</b>&#8216;);<br />
}).listen(8124);<br />
console.log(&#8216;Server running at http://127.0.0.1:8124/&#8217;);
</p></blockquote>
<p>在终端中运行这段代码：</p>
<blockquote><p>
node hello_node.js
</p></blockquote>
<p>然后用浏览器打开 http://127.0.0.1:8124/ ， 成功的话可以看到Hello World页面。</p>
<h3>4.安装UglifyJS</h3>
<p>安装步骤：<a href="https://github.com/mishoo/UglifyJS">https://github.com/mishoo/UglifyJS</a><br />
安装好后进入UglifyJS的目錄</p>
<blockquote><p>
cd UglifyJS/
</p></blockquote>
<p>測試執行</p>
<blockquote><p>
./bin/uglifyfs
</p></blockquote>
<p>通常情况下会发生错误： Cannot find module &#8216;ulify-js&#8217;<br />
最简单的解决方法：<br />
将UglifyJS文件夹下的所有文件复制一份到.node_libraries文件夹下，然后将UglifyJS/bin下的uglifyjs复制一份到usr/local/bin文件夹下。<br />
这是UglifyJS就安装完毕了。<br />
可以通过命令来压缩js了</p>
<blockquote><p>
uglifyjs example.js  > example.min.js
</p></blockquote>
<p>测试了下，一个6.09kb的js用yui compressor压缩后大小为4.26kb，而uglifyjs压缩后为3.68k，很给力。</p>
<p>参考文章：<br />
<a href="http://blog.miniasp.com/post/2011/02/04/How-to-install-and-use-UglifyJS-to-compress-Javascript-files.aspx">如何在 node.js 執行 UglifyJS 對 JavaScript 進行壓縮或美化</a><br />
<a href="http://blog.miniasp.com/post/2011/02/03/Getting-Started-with-NodeJS-on-Windows-using-Cygwin.aspx">如何在 Windows 作業系統安裝 Node.js 執行環境 (Cygwin)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.iinterest.net/2011/04/09/mac-node-js-uglifyjs/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[译]在WebKit中并行加载外部脚本</title>
		<link>http://www.iinterest.net/2010/10/27/running-scripts-in-webkit/</link>
		<comments>http://www.iinterest.net/2010/10/27/running-scripts-in-webkit/#comments</comments>
		<pubDate>Wed, 27 Oct 2010 02:56:20 +0000</pubDate>
		<dc:creator>Bell</dc:creator>
				<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://www.iinterest.net/?p=1020</guid>
		<description><![CDATA[作者：Tony Gentilcore 原文：http://webkit.org/blog/1395/running-scripts-in-webkit/ WebKit 正式版已经正式支持HTML5中&#60;script&#62;标签的 async 和 defer 属性了。如此一来，我们就能在不阻塞网页中其它元素下载的情况下，以异步方式下载JavaScript，从而大大提高了网页加载速度。 正常情况下，网页分析器检测到有外部脚本时，会暂停解析，并发起一个请求去下载该脚本，一直到这个脚本完全下载并执行之后解析才会继续进行。 &#60;script src="myBlockingScript.js"&#62;&#60;/script&#62; 在下载脚本时，浏览器会被阻塞，不做其它任何事情（比如解析HTML，执行其它脚本以及渲染网页布局等）。尽管通过WebKit的预加载扫描器能够利用网页显示的空闲时间预先下载资源，在一定程度上改善了浏览器的阻塞状况，但是网络延迟依然会导致网页加载缓慢。 虽然围绕性能优化的问题已经有了很多不错的技术（参见：延迟加载，异步加载），但是他们都无法避免地引入了额外的代码，或是针对浏览器的Hacks写法。作为更好的办法，现在我们可以把不需要以同步方式执行的脚本标记为 async 或者 defer。以下是具体的做法： &#60;script async src="myAsyncScript.js" onload="myInit()"&#62;&#60;/script&#62; &#60;script defer src="myDeferScript.js" onload="myInit()"&#62;&#60;/script&#62; 标记为 async 或者 defer 的脚本都会立刻开始下载，不阻塞浏览器的其它解析工作，而且它们都支持可选的 onload 事件，这样就能在脚本加载完成时开始执行依赖于该脚本的代码。async 和 defer 之间的不同之处在于执行的时机。async 脚本会在自身被下载完、window.load 事件执行前立刻被执行，这意味着 async 脚本有可能（应该说很可能）不会按照它们在页面中出现的顺序被执行；而 defer &#8230; <a href="http://www.iinterest.net/2010/10/27/running-scripts-in-webkit/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>作者：<strong>Tony Gentilcore<br />
</strong>原文：<a href="http://webkit.org/blog/1395/running-scripts-in-webkit/">http://webkit.org/blog/1395/running-scripts-in-webkit/</a></p>
<p>WebKit 正式版已经正式支持HTML5中&lt;script&gt;标签的 async 和 defer 属性了。如此一来，我们就能在不阻塞网页中其它元素下载的情况下，以异步方式下载JavaScript，从而大大提高了网页加载速度。</p>
<p>正常情况下，网页分析器检测到有外部脚本时，会暂停解析，并发起一个请求去下载该脚本，一直到这个脚本完全下载并执行之后解析才会继续进行。<br />
<span id="more-1020"></span><br />
<code>&lt;script src="myBlockingScript.js"&gt;&lt;/script&gt;</code></p>
<p>在下载脚本时，浏览器会被阻塞，不做其它任何事情（比如解析HTML，执行其它脚本以及渲染网页布局等）。尽管通过WebKit的预加载扫描器能够利用网页显示的空闲时间预先下载资源，在一定程度上改善了浏览器的阻塞状况，但是网络延迟依然会导致网页加载缓慢。</p>
<p>虽然围绕性能优化的问题已经有了很多不错的技术（参见：<a rel="reference" href="http://www.stevesouders.com/blog/2009/04/27/loading-scripts-without-blocking/">延迟加载</a>，<a href="http://css.dzone.com/news/lazy-loading-asyncronous">异步加载</a>），但是他们都无法避免地引入了额外的代码，或是针对浏览器的Hacks写法。作为更好的办法，现在我们可以把不需要以同步方式执行的脚本标记为 async 或者 defer。以下是具体的做法：</p>
<p><code>&lt;script async src="myAsyncScript.js" onload="myInit()"&gt;&lt;/script&gt;</code></p>
<p><code>&lt;script defer src="myDeferScript.js" onload="myInit()"&gt;&lt;/script&gt;</code></p>
<p>标记为 async 或者 defer 的脚本都会立刻开始下载，不阻塞浏览器的其它解析工作，而且它们都支持可选的 onload 事件，这样就能在脚本加载完成时开始执行依赖于该脚本的代码。async 和 defer 之间的不同之处在于执行的时机。async 脚本会在自身被下载完、window.load 事件执行前立刻被执行，这意味着 async 脚本有可能（应该说很可能）不会按照它们在页面中出现的顺序被执行；而 defer 脚本则一定是按照它们在页面中出现的先后顺序执行，准确地说，是在整个页面被解析完成之后，文档的DOMContentLoaded事件之前执行。</p>
<p>这里有个<a href="http://stevesouders.com/cuzillion/?c0=hj1hfff1_0_f&amp;c1=hb0hfff0_1_f">例子</a>，在这个例子中一个外部脚本下载需要1秒钟，紧跟在这个外部脚本后面是一段执行需要1秒钟的内嵌脚本。我们可以看到这个页面加载花费了2秒钟时间。</p>
<p><a href="http://webkit.org/blog-files/timeline-blocking-script.png"><img style="border: 0px initial initial;" title="timeline-blocking-script" src="http://file.wukangrui.com/attachments/2010/10/timeline-blocking-script_thumb.png" border="0" alt="timeline-blocking-script" width="657" height="156" /></a></p>
<p>还是同一个<a rel="nofollow" href="http://stevesouders.com/cuzillion/?c0=hj1hfft1_0_f&amp;c1=hb0hfff0_1_f">例子</a>，只是是其中的外部脚本被标记为 defer。由于签入的脚本可以在外部脚本被下载的同时执行，因此我们看到这个页面加载的速度大约比之前快两倍。</p>
<p><a href="http://webkit.org/blog-files/timeline-defer-script.png"><img style="border: 0px initial initial;" title="timeline-defer-script" src="http://file.wukangrui.com/attachments/2010/10/timeline-defer-script_thumb.png" border="0" alt="timeline-defer-script" width="657" height="156" /></a></p>
<p>除了WebKit核心的浏览器以外，Firefox早就支持 defer 和 onload 属性，async 属性从 3.6 版本开始支持。 IE浏览器也很早就支持 defer 属性，IE9 增加了对 onload 属性的支持，但是 async 属性依然还不支持。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.iinterest.net/2010/10/27/running-scripts-in-webkit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[转]14条关于jQuery的知识</title>
		<link>http://www.iinterest.net/2010/09/27/%e8%bd%ac14%e6%9d%a1%e5%85%b3%e4%ba%8ejquery%e7%9a%84%e7%9f%a5%e8%af%86/</link>
		<comments>http://www.iinterest.net/2010/09/27/%e8%bd%ac14%e6%9d%a1%e5%85%b3%e4%ba%8ejquery%e7%9a%84%e7%9f%a5%e8%af%86/#comments</comments>
		<pubDate>Mon, 27 Sep 2010 02:24:38 +0000</pubDate>
		<dc:creator>Bell</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://www.iinterest.net/?p=1013</guid>
		<description><![CDATA[以下是译文 如果说jQuery也有缺点，那就是它太容易上手了，所以吸引了大量没有任何JavaScript的新手来使用。一方面来说，这真的很神奇。另一方面，这也导致了一大堆糟糕的代码诞生（有一些是出自我手！） 但是没关系，糟糕的代码是你的成年礼，关键是要越过这道坎，这就是今天要讨论的内容。 1.一些方法会返回jQuery对象 大多数方法会返回jQuery对象。这是很棒的特性，使得我们的代码可以像锁链一样从头到尾链起来。 $someDiv .attr('class', 'someClass') .hide() .html('new stuff'); 这样做的好处是：1.代码更加简洁 2.减少了我们必须遍历整个DOM来寻找这个元素的时间 2.The Find Selector 只要你的选择符不要烂的跟屎一样，jQuery都能帮你方便地找到需要的元素，你不需要操心细节。但是有一些细节你可以注意一下，以此来提高你的JavaScript执行性能。 其中之一就是，只要有可能，就使用.find()方法。主要原因就是：如果不是必不得已，那就不要让jQuery使用它的Sizzle引擎。当然，也会有些情况不能用find()方法，那也没有关系，只要知道有这个区别就好。 // 在现代浏览器上都可以正常运行，但是却是通过Sizzle引擎来完成的 $('#someDiv p.someClass').hide(); // 一样正常运行，原生浏览器支持，效率更高 $('#someDiv').find('p.someClass').hide(); 除IE6/7的现代浏览器都有QuerySelectorAll支持，能允许你传递一个像一样的CSS选择器，而不需要用到jQuery的内部代码。jQuery会在使用自己的引擎之前检查是否存在这个函数。 但对于IE6/IE7而言，就会需要jQuery使用Sizzle引擎，这是一套十分强大的引擎，但非常复杂。简单的说，jQuery会把你的选择器转化成一个数组，并且通过从后往前的方法来迭代匹配。 // 数组 ['#someDiv, 'p']; 它会从右到左，通过正则表达式匹配页面每一个元素，也就是说，你的选择器最右边一定要尽可能的明确，比如ID或者标签名。 底线是： 1.保持代码简单 2.使用find()方法，这样的话，我们就能够使用浏览器的原生查找函数 3.当使用Sizzle的时候，尽可能地把最右边的部分指明，比如ID或者标签名 3.不要滥用$(this) 如果不了解基本的DOM属性和方法的话，很容易滥用jQuery对象。例如 $('#someAnchor').click(function() { &#8230; <a href="http://www.iinterest.net/2010/09/27/%e8%bd%ac14%e6%9d%a1%e5%85%b3%e4%ba%8ejquery%e7%9a%84%e7%9f%a5%e8%af%86/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>以下是译文</p>
<p>如果说jQuery也有缺点，那就是它太容易上手了，所以吸引了大量没有任何JavaScript的新手来使用。一方面来说，这真的很神奇。另一方面，这也导致了一大堆糟糕的代码诞生（有一些是出自我手！）</p>
<p>但是没关系，糟糕的代码是你的成年礼，关键是要越过这道坎，这就是今天要讨论的内容。<br />
<span id="more-1013"></span></p>
<h2>1.一些方法会返回jQuery对象</h2>
<p>大多数方法会返回jQuery对象。这是很棒的特性，使得我们的代码可以像锁链一样从头到尾链起来。</p>
<pre><code>$someDiv
.attr('class', 'someClass')
.hide()
.html('new stuff');
</code></pre>
<p>这样做的好处是：1.代码更加简洁 2.减少了我们必须遍历整个DOM来寻找这个元素的时间</p>
<h2>2.The Find Selector</h2>
<p>只要你的选择符不要烂的跟屎一样，jQuery都能帮你方便地找到需要的元素，你不需要操心细节。但是有一些细节你可以注意一下，以此来提高你的JavaScript执行性能。</p>
<p>其中之一就是，只要有可能，就使用.find()方法。主要原因就是：如果不是必不得已，那就不要让jQuery使用它的Sizzle引擎。当然，也会有些情况不能用find()方法，那也没有关系，只要知道有这个区别就好。</p>
<pre><code>// 在现代浏览器上都可以正常运行，但是却是通过Sizzle引擎来完成的
$('#someDiv p.someClass').hide();

// 一样正常运行，原生浏览器支持，效率更高
$('#someDiv').find('p.someClass').hide();
</code></pre>
<p>除IE6/7的现代浏览器都有QuerySelectorAll支持，能允许你传递一个像一样的CSS选择器，而不需要用到jQuery的内部代码。jQuery会在使用自己的引擎之前检查是否存在这个函数。</p>
<p>但对于IE6/IE7而言，就会需要jQuery使用Sizzle引擎，这是一套十分强大的引擎，但非常复杂。简单的说，jQuery会把你的选择器转化成一个数组，并且通过从后往前的方法来迭代匹配。</p>
<pre><code>// 数组
 ['#someDiv, 'p'];
</code></pre>
<p>它会从右到左，通过正则表达式匹配页面每一个元素，也就是说，你的选择器最右边一定要尽可能的明确，比如ID或者标签名。</p>
<p>底线是：</p>
<p>1.保持代码简单</p>
<p>2.使用find()方法，这样的话，我们就能够使用浏览器的原生查找函数</p>
<p>3.当使用Sizzle的时候，尽可能地把最右边的部分指明，比如ID或者标签名</p>
<h2>3.不要滥用$(this)</h2>
<p>如果不了解基本的DOM属性和方法的话，很容易滥用jQuery对象。例如</p>
<pre><code>$('#someAnchor').click(function() {
	// 又生成了一次jQuery对象
	alert( $(this).attr('href') );
});</code></pre>
<p>如果只是为了获取某a的href属性可以简单地用以下代码：</p>
<pre><code>
$('#someAnchor').click(function() {
	// 没有jQuery对象
	alert( this.href );
});</code></pre>
<h2>4.jQuery的快速ready方法</h2>
<p>原生的ready方法是这样的</p>
<pre><code>$(document).ready(function() {
	// let's get up in heeya
});</code></pre>
<p>而jQuery的方法是这样的：</p>
<pre><code>$(function() {
	// let's get up in heeya
});
</code></pre>
<p>看上去有点困扰+不放心？别担心，看看jQuery的源码：</p>
<pre><code>
// HANDLE: $(function)
// Shortcut for document ready
if ( jQuery.isFunction( selector ) ) {
	return rootjQuery.ready( selector );
}</code></pre>
<p>完全一样的哦</p>
<h2>5.代码安全</h2>
<p>如果希望代码能和其他人协同工作的话，一定要确保不要命名冲突。万一在你的脚本之后导入了其他人的代码，对方用到了$变量，那该怎么办呢？</p>
<p>第一种方法，noConflict()方法：</p>
<pre><code>var j = jQuery.noConflict();
// Now, instead of $, we use j.
j('#someDiv').hide();

// The line below will reference some other library's $ function.
$('someDiv').style.display = 'none';
</code></pre>
<p>第二种方法，把你的代码放在一个匿名函数里面，然后把jQuery作为参数传递给它，那么在这个函数体中的$是不会影响外面或者被外面影响的。</p>
<pre><code>(function($) {
	// Within this function, $ will always refer to jQuery
})(jQuery);
</code></pre>
<p>第三种方法，</p>
<pre><code>jQuery(document).ready(function($) {
 // $ refers to jQuery
});

// $ is either undefined, or refers to some other library's function.
</code></pre>
<h2>6.写聪明的代码</h2>
<pre><code>someDivs.each(function() {
	$('#anotherDiv')[0].innerHTML += $(this).text();
});
</code></pre>
<p>以上代码的糟糕之处在于：<br />
1.在每一次遍历循环中都会搜寻anotherDiv 这个ID的元素<br />
2.两次获取innerHTML属性<br />
3.创建了一个jQuery对象，只是为了获取元素的text属性</p>
<pre><code>var someDivs = $('#container').find('.someDivs'),
      contents = [];

someDivs.each(function() {
	contents.push( this.innerHTML );
});
$('#anotherDiv').html( contents.join('') );
</code></pre>
<p>这样，在每一个遍历循环中所做的操作仅仅是把元素放进一个数组中。这一条tip更适用于所有的JavaScript代码，而不仅仅是jQuery。</p>
<p>说到这儿，就不得不提一下Document编程（Document Fragments），基本上也是说，用原生的js对象，而不是jQuery对象，更有效率。</p>
<pre><code>var someDivs = $('#container').find('.someDivs'),
      contents = [];

someDivs.each(function() {
	contents.push( this.innerHTML );
});
$('#anotherDiv').html( contents.join('') );
</code></pre>
<p>越久使用jQuery和JavaScript，你就会发现你更喜欢用js完成某些简单任务，多好！</p>
<p>jQuery提供了一个很高的抽象程度，但这不意味着我们应该停止学习如何使用原生的js方法，例如上面的代码中我们就用了jQuery的each方法。</p>
<h2>7.Ajax方法</h2>
<p>一个新手开始学习jQuery和Ajax的时候，它提供的诸多接口可能让你困扰。其实很多方法都是helper method（译者注：我专门查了下helper method和jQuery UI里helper的区别，下一篇post详细地说一下）。我们经常用到的方法不过以下几种：</p>
<ul>
<li><strong>get</strong></li>
<li><strong>getJSON</strong></li>
<li><strong>post</strong></li>
<li><strong>ajax</strong></li>
</ul>
<p>以下是getJSON的调用语法</p>
<pre><code>$.getJSON('path/to/json', function(results) {
	// callback
	// results contains the returned data object
});
</code></pre>
<p>这是实现代码：</p>
<pre><code>getJSON: function( url, data, callback ) {
	return jQuery.get(url, data, callback, "json");
}
</code></pre>
<p>进入下一层梦境：</p>
<pre><code>get: function( url, data, callback, type ) {
	// shift arguments if data argument was omited
	if ( jQuery.isFunction( data ) ) {
		type = type || callback;
		callback = data;
		data = null;
	}

	return jQuery.ajax({
		type: "GET",
		url: url,
		data: data,
		success: callback,
		dataType: type
	});
}
</code></pre>
<p>最终，还是通过ajax()方法来执行这么多的操作，它是保证跨浏览器操作的基础。</p>
<p>也就是说你可以直接使用ajax()方法来完成所有的ajax操作，而不是一大堆的helper method。</p>
<p>原来是这样的代码：</p>
<pre><code>$.getJSON('path/to/json', function(results) {
	// callback
	// results contains the returned data object
});
</code></pre>
<p>更高效（并且接口统一）的代码：</p>
<pre><code>$.ajax({
	type: 'GET',
	url : 'path/to/json',
	data : yourData,
	dataType : 'json',
	success : function( results ) {
		console.log('success');
	})
});
</code></pre>
<h2>8.获取原生js属性和方法</h2>
<p>从之前的例子中我们学到我们可以直接取得元素比如a标签的属性：</p>
<pre><code>var anchor = document.getElementById('someAnchor');
//anchor.id
// anchor.href
// anchor.title
// .etc
</code></pre>
<p>但是当你想通过jQuery取得DOM元素的时候，是不能通过这种方法来取得属性的：</p>
<pre><code>// Fails
var id = $('#someAnchor').id;
</code></pre>
<p>所以，当你需要获取href属性或者其他属性的是，你需要使用其他方法，方法很多：</p>
<pre><code>// OPTION 1 - Use jQuery
var id = $('#someAnchor').attr('id');

// OPTION 2 - 取到DOM元素再取值
var id = $('#someAnchor')[0].id;

// OPTION 3 - 用jQuery的get方法
var id = $('#someAnchor').get(0).id;

// OPTION 3b - 用不带参数的get
anchorsArray = $('.someAnchors').get();
var thirdId = anchorsArray[2].id;
</code></pre>
<p>get()方法十分有效，它能把jQuery对象集合转化成一个数组。</p>
<h2>9.用PHP检测Ajax请求</h2>
<p>事实是，在我们的大多数项目中不能依赖js来完成所有工作比如验证或者Ajax，假如js被禁用了怎么办呢？一个通用的解决办法是使用服务器端程序验证Ajax请求是否被发起。</p>
<p>jQuery使得这一做法变得很简单，可以通过$.ajax方法很方便地设置请求的头部。</p>
<pre><code>// 设置头部，这样接受请求的服务器端语言知道这是一个XMLHttpRequest
// Only send the header if it's not a remote XHR
if ( !remote ) {
	xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
}
</code></pre>
<p>设置了这个头部之后，我们可以用PHP（或者其他服务器编程语言）来检查这个头部，然后相应地做出反应。用PHP的话，可以通过$_SERVER['HTTP_X_REQUESTED_WITH']来判断。</p>
<pre><code>function isXhr() {
  return $_SERVER['HTTP_X_REQUESTED_WITH'] === 'XMLHttpRequest';
}
</code></pre>
<h2>10.jQuery和$</h2>
<p>知道为什么jQuery和$可以互换么？看看jQuery的源码：</p>
<pre><code>window.jQuery = window.$ = jQuery;
</code></pre>
<p>由于jQuery本身运行在一个很大 的function中，这样做的好处是能最大程度地避免全局变量的出现。但也因为如此$在外面是undefined的，为了解决这个问题，把jQuery裸露给全局变量window，同时还给它一个别名$。</p>
<h2>11.根据条件载入jQuery</h2>
<p>我们都喜欢CDN，特别是Google的免费CDN，可是让我们不使用googleapi提供的CDN的一个阻挠就是大陆功夫墙的不可预知性。但是可以这么写，是<a href="http://html5boilerplate.com/" target="_blank">HTML5 Boilerplate</a>提供的方法：</p>
<pre><code>&lt;!-- Grab Google CDN jQuery. fall back to local if necessary --&gt;
&lt;script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"&gt;&lt;/script&gt;
&lt;script&gt;!window.jQuery &amp;&amp; document.write('&lt;script src="js/jquery-1.4.2.min.js"&gt;&lt;\/script&gt;')&lt;/script&gt;
</code></pre>
<p>相当直观，如果window.jQuery是未定义的，那就是说下载js文件出了问题，这时候&amp;&amp;右边的句子就会为ture，所以就会插入一个本地版本的jQuery。Really brillant, isn’t it?</p>
<h2>12.jQuery Filters</h2>
<pre><code>&lt;scrip&gt;
	$('p:first').data('info', 'value'); // 填充 $的data对象，下文展示用 

	$.extend(
		jQuery.expr[":"], {
			block: function(elem) {
				return $(elem).css("display") === "block";
			},

			hasData : function(elem) {
				return !$.isEmptyObject( $(elem).data() );
			}
		}
	);

	$("p:hasData").text("has data"); // 可以获取所有有data属性的元素
	$("p:block").text("are block level"); // 获取所有拥有display:block属性的元素
&lt;/scrip&gt;
</code></pre>
<p>jQuery.expr[':']是jQuery.expr.filters的别名，上面的代码用$.extend扩展了jQuery的:也就是filter。</p>
<h2>13.单参数的hover方法</h2>
<p>在jQuery1.4之前，hover必须接受两个参数，分别显示in和out时候的handler function，而现在hover可以只接受一个参数了，每当产生mouseenter和mouseout事件的时候就会用这个function参数（一般是匿名的）来处理，如果处理得当的话，可以用一个function就完成两个function的效果，可以节省字符。</p>
<p>官方API<a href="http://api.jquery.com/hover/" target="_blank">http://api.jquery.com/hover/</a>上有很好的例子。</p>
<p><a href="http://api.jquery.com/hover/" target="_blank"></a></p>
<h2>14.属性对象作参数</h2>
<p>之前</p>
<pre><code>$('<a target="_blank">')
  .attr({
    id : 'someId',
    className : 'someClass',
    href : 'somePath.html'
  });
</a></code><a target="_blank"></a></pre>
<p><a target="_blank">现在</a></p>
<pre><a target="_blank"><code>$('</code></a><code>', {
    id : 'someId',
    className : 'someClass',
    href : 'somePath.html'
});
</code></pre>
<p>jQuery1.4以后，可以在新建DOM元素的时候给它传递一个（通常是匿名的）对象作为第二个参数，这样代码更加清晰简单，我们设置可以给这个对象里面传递一些jQuery特有的属性和事件，比如click和text。</p>
<p>原文地址：<a href="http://net.tutsplus.com/tutorials/javascript-ajax/14-helpful-jquery-tricks-notes-and-best-practices/" target="_blank">http://net.tutsplus.com/tutorials/javascript-ajax/14-helpful-jquery-tricks-notes-and-best-practices/</a></p>
<p>本文地址：<a href="http://yuguo.us/weblog/14-jquery-notes-2/">http://yuguo.us/weblog/14-jquery-notes-2/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.iinterest.net/2010/09/27/%e8%bd%ac14%e6%9d%a1%e5%85%b3%e4%ba%8ejquery%e7%9a%84%e7%9f%a5%e8%af%86/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[转]如何为 iPad 打造速度超快的 HTML5 软件</title>
		<link>http://www.iinterest.net/2010/06/23/how-to-make-really-fast-html5-app-for-ipad/</link>
		<comments>http://www.iinterest.net/2010/06/23/how-to-make-really-fast-html5-app-for-ipad/#comments</comments>
		<pubDate>Wed, 23 Jun 2010 05:35:24 +0000</pubDate>
		<dc:creator>Bell</dc:creator>
				<category><![CDATA[HTML & CSS]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[HTML5相关]]></category>

		<guid isPermaLink="false">http://www.iinterest.net/?p=889</guid>
		<description><![CDATA[有一个为 iPad 设计的用来查时区的 HTML5 软件 everytimezone.com 最近引起了一些注意。它简单、到位，可以离线使用，并且速度极快。由于 HTML5 软件本质上只是一个网页，故不需要通过苹果的 App Store 商店发行，用户只要用 iPad 访问 everytimezone.com，然后将书签存到桌面，下一次打开就变成了一个与原生软件几乎无异的东西。everytimezone.com 的作者托马斯·富赫是资深 JavaScript 专家，也是 JavaScript 框架 Prototype 的核心开发者之一。他近日在博客上撰文传授了如何保证 HTML5 软件在 iPad 上飞速运行的七条秘诀，特翻译如下。—— 编者 一、少用图片 一开始，为了做出用来表示各个城市的每一天的那种渐变效果，我们用了一套相当复杂的 -webkit-gradient，结果发现这会令转译速度变得非常非常慢。-webkit-gradient 的工作方法是构建位图，对于浏览器的转译引擎来说，这和从外部加载图片（例如一张 PNG）是完全一样的。MobileSafari 显示图片速度之慢是出了名的（希望 4.0 对此有所改进），要解决这个问题，基本上只能不用图片和 -webkit-gradient。 我们最终把那些色彩条快用背景上的一个很大的 canvas 元素替代了。当你拖动游标线时，那些条块的颜色会发生变化，只有正在变化的部分才会被重新绘制。用 canvas &#8230; <a href="http://www.iinterest.net/2010/06/23/how-to-make-really-fast-html5-app-for-ipad/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>有一个为 iPad 设计的用来查时区的 HTML5 软件 everytimezone.com 最近引起了一些注意。它简单、到位，可以离线使用，并且速度极快。由于 HTML5 软件本质上只是一个网页，故不需要通过苹果的 App Store 商店发行，用户只要用 iPad 访问 everytimezone.com，然后将书签存到桌面，下一次打开就变成了一个与原生软件几乎无异的东西。everytimezone.com 的作者托马斯·富赫是资深 JavaScript 专家，也是 JavaScript 框架 Prototype 的核心开发者之一。他近日在博客上撰文传授了如何保证 HTML5 软件在 iPad 上飞速运行的七条秘诀，特翻译如下。—— 编者</p>
<p><strong>一、少用图片</strong></p>
<p>一开始，为了做出用来表示各个城市的每一天的那种渐变效果，我们用了一套相当复杂的 -webkit-gradient，结果发现这会令转译速度变得非常非常慢。-webkit-gradient 的工作方法是构建位图，对于浏览器的转译引擎来说，这和从外部加载图片（例如一张 PNG）是完全一样的。MobileSafari 显示图片速度之慢是出了名的（希望 4.0 对此有所改进），要解决这个问题，基本上只能不用图片和 -webkit-gradient。<br />
<span id="more-889"></span><br />
我们最终把那些色彩条快用背景上的一个很大的 canvas 元素替代了。当你拖动游标线时，那些条块的颜色会发生变化，只有正在变化的部分才会被重新绘制。用 canvas 时可以在某种程度上复用 -webkit-gradient，比如这样：</p>
<blockquote>
<div id="_mcePaste">// WebKit CSS gradient</div>
<div id="_mcePaste">-webkit-gradient(linear, left top, right top,</div>
<div id="_mcePaste">from(#4b4c4d),</div>
<div id="_mcePaste">color-stop(0.249, #4b4c4d),</div>
<div id="_mcePaste">color-stop(0.25, #575b5c),</div>
<div id="_mcePaste">color-stop(0.329, #575b5c),</div>
<div id="_mcePaste">color-stop(0.33, #6b7071),</div>
<div id="_mcePaste">color-stop(0.749, #6b7071),</div>
<div id="_mcePaste">color-stop(0.75, #575b5c),</div>
<div id="_mcePaste">color-stop(0.909, #575b5c),</div>
<div id="_mcePaste">color-stop(0.91, #4b4c4d),</div>
<div id="_mcePaste">to(#4b4c4d)</div>
<div id="_mcePaste">);</div>
<div id="_mcePaste">// canvas gradient</div>
<div id="_mcePaste">var gradient = $(&#8216;canvas&#8217;).getContext(“2d”).createLinearGradient(0,0,230,0);</div>
<div id="_mcePaste">gradient.addColorStop(0,&#8217;#4b4c4d&#8217;);</div>
<div id="_mcePaste">gradient.addColorStop(0.249,&#8217;#4b4c4d&#8217;);</div>
<div id="_mcePaste">gradient.addColorStop(0.25,&#8217;#575b5c&#8217;);</div>
<div id="_mcePaste">gradient.addColorStop(0.329,&#8217;#575b5c&#8217;);</div>
<div id="_mcePaste">gradient.addColorStop(0.33,&#8217;#6b7071&#8242;);</div>
<div id="_mcePaste">gradient.addColorStop(0.749,&#8217;#6b7071&#8242;);</div>
<div id="_mcePaste">gradient.addColorStop(0.75,&#8217;#575b5c&#8217;);</div>
<div id="_mcePaste">gradient.addColorStop(0.909,&#8217;#575b5c&#8217;);</div>
<div id="_mcePaste">gradient.addColorStop(0.91,&#8217;#4b4c4d&#8217;);</div>
<div id="_mcePaste">gradient.addColorStop(1,&#8217;#4b4c4d&#8217;);</div>
</blockquote>
<p><br/><br />
<strong>二、不要用 text-shadow 和 box-shadow</strong></p>
<p>这是速度变慢的另外一个重要因素。最好不要用这些 CSS 属性。</p>
<p><strong>三、硬件加速是很新的功能……而且也很多BUG</strong></p>
<p>在 Safari 上，只要使用 -webkit-transform 这个 CSS 属性就可以启用硬件加速了。（opacity 也行，不过缺点上面说过了。）</p>
<p>硬件加速有其局限，例如同时运行的动画数量是有限制的，如果超过了这个限制，动画就会闪烁，有时还会出错。不过如果轻度使用的话，效果会非常棒。</p>
<p><strong>四、尽可能地使用触控事件</strong></p>
<p>触控事件是个好选择，因为传统的 onClick 事件在 iPad 上用来会有点延迟。在 everytimezone.com 的源代码里有些小窍门，教你如何在使用触控事件的同时，也能够支持非触控设备上的浏览器：</p>
<blockquote><p>var supportsTouch = &#8216;createTouch&#8217; in document;<br />
element[supportsTouch ? 'ontouchmove' : 'onmousemove'] = function(event){<br />
var pageX = event.pageX;<br />
if (event.touches) pageX = event.touches[0].pageX;<br />
// &#8230;<br />
}</p></blockquote>
<p><strong>五、不要用 opacity</strong></p>
<p>因为某些原因，使用 opacity 这个 CSS 属性有时会干扰硬件加速。如果你感到速度变慢，但又看不出哪里出了问题的话，就检查一下有没有用到 opacity 吧。</p>
<p><strong>六、万事无捷径，请手写 JavaScript 和 CSS</strong></p>
<p>不要依赖框架或是网页标准狂热分子推荐给你的东西。我们这个例子里只有一个高度精简的 HTML 页面，CSS 都写在页面里，没用任何 JavaScript 框架，并尽量利用了目标平台（iPad）的特性，最终的结果就是一个几乎能够瞬间加载的苗条网页，而且缓存做得很好，离线使用也毫不失礼。没错，我们也可以选择用 JavaScript 和 CSS 框架，但有的时候少即多。（记住，各类框架所提供的那些对跨浏览器的支持你并非全都需要。）</p>
<blockquote><p>// mini-pico-tiny convenience micro-framework, ymmv<br />
function $(id){ return document.getElementById(id); }<br />
function html(id, html){ $(id).innerHTML = html; }<br />
function css(id, style){ $(id).style.cssText += &#8216;;&#8217;+style; }<br />
function anim(id, transform, opacity, dur){<br />
css(id, &#8216;-webkit-transition:-webkit-transform&#8217;+',opacity &#8216;+(dur||0.5)+&#8217;s,&#8217;+(dur||0.5)+&#8217;s;-webkit-transform:&#8217;+transform+&#8217;;opacity:&#8217;+(1||opacity));<br />
}</p></blockquote>
<p><strong>七、别用 translate，用 translate3d</strong></p>
<p>使用 -webkit-transform 时，记得用 translate3d(x,y,z) 语法，而不是 translate(x,y)。因为某种原因，后者无法支持硬件加速，至少在 iOS 3.x 上不行（不过在桌面版 Safari 里似乎没问题）。谢谢马提奥·斯宾内利指出这点。（也推荐大家看看他做的<a href="http://cubiq.org/iscroll" target="_blank"> iScroll</a>，里面有很多很棒的代码，也是演示如何为页面在移动版 WebKit 上的速度进行优化的好例子。）</p>
<p>转自<a href="https://apple4.us/2010/06/how-to-make-really-fast-html5-app-for-ipad.html" target="_blank">apple4.us</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.iinterest.net/2010/06/23/how-to-make-really-fast-html5-app-for-ipad/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>jQuery图片放大预览插件 cloud-zoom</title>
		<link>http://www.iinterest.net/2010/06/11/jquery-image-zoom-cloud-zoom/</link>
		<comments>http://www.iinterest.net/2010/06/11/jquery-image-zoom-cloud-zoom/#comments</comments>
		<pubDate>Fri, 11 Jun 2010 08:27:03 +0000</pubDate>
		<dc:creator>Bell</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://www.iinterest.net/?p=877</guid>
		<description><![CDATA[table {
	
	border-collapse:collapse;
	border:1px solid #CCC;
	margin-bottom:20px;
}
td , th{
	padding:10px;
	vertical-align:top;	
	border:1px dotted #CCC;
}
th {
	background-color:#eee;	
}
td.noWrap {
	white-space:nowrap;	
} <a href="http://www.iinterest.net/2010/06/11/jquery-image-zoom-cloud-zoom/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.iinterest.net/wp-content/uploads/2010/06/cloud-zoom.jpg"><img class="alignnone size-full wp-image-878" title="cloud-zoom" src="http://www.iinterest.net/wp-content/uploads/2010/06/cloud-zoom.jpg" alt="" width="514" height="257" /></a></p>
<p>分享一个jquery的图片放大预览插件:cloud-zoom.</p>
<p><a href="http://www.iinterest.net/demo/cloud-zoom.html" target="_blank"><strong>cloud-zoom DEMO</strong></a></p>
<p>部署步骤:</p>
<p>1.加载jquery-1.4.js 和 cloud-zoom.1.0.2.min.js</p>
<p>2.加入样式表(DEMO中&lt;style&gt;部分)</p>
<p>3.为需要放大预览效果的缩略图添加超链接<span style="color: #888888;">&lt;a&gt;</span>并将类命名为”cloud-zoom” <span style="color: #888888;">class=”cloud-zoom”</span></p>
<p>4.在超链接<span style="color: #888888;">&lt;a&gt;</span>的rel属性中加入需要的参数实现不同的效果<br />
<span id="more-877"></span><br />
实例:</p>
<blockquote><p>&lt;a href=”images/大图.jpg” class=”cloud-zoom” rel=”position:&#8217;inside&#8217; ,showTitle:false, adjustX:-2, adjustY:-2&#8243;&gt;&lt;img src=”images/缩略图.jpg” title=”iinterest” /&gt;&lt;/a&gt;</p></blockquote>
<p>cloud-zoom参数说明:</p>
<table border="1" cellpadding="2" width="100%">
<tbody>
<tr>
<th>Parameter</th>
<th>Description (from V1.0.0)</th>
<th>Default Value</th>
</tr>
<tr>
<td>zoomWidth</td>
<td>The width of the zoom window in pixels. If &#8216;auto&#8217; is specified, the width will be the same as the small image.</td>
<td class="noWrap">&#8216;auto&#8217;</td>
</tr>
<tr>
<td>zoomHeight</td>
<td>The height of the zoom window in pixels. If &#8216;auto&#8217; is specified, the height will be the same as the small image.</td>
<td><span class="noWrap">&#8216;auto&#8217;</span></td>
</tr>
<tr>
<td>position</td>
<td>Specifies the position of the zoom window relative to the small image. Allowable values are &#8216;left&#8217;, &#8216;right&#8217;, &#8216;top&#8217;, &#8216;bottom&#8217;, &#8216;inside&#8217; or you can specifiy the id of an html element to place the zoom window in e.g. position: &#8216;element1&#8242;</td>
<td>&#8216;right&#8217;</td>
</tr>
<tr>
<td>adjustX</td>
<td>Allows you to fine tune the x-position of the zoom window in pixels.</td>
<td>0</td>
</tr>
<tr>
<td>adjustY</td>
<td>Allows you to fine tune the y-position of the zoom window in pixels.</td>
<td>0</td>
</tr>
<tr>
<td>tint</td>
<td>Specifies a tint colour which will cover the small image. Colours should be specified in hex format, e.g. &#8216;#aa00aa&#8217;. Does not work with softFocus.</td>
<td>false</td>
</tr>
<tr>
<td>tintOpacity</td>
<td>Opacity of the tint, where 0 is fully transparent, and 1 is fully opaque.</td>
<td class="noWrap">0.5</td>
</tr>
<tr>
<td>lensOpacity</td>
<td>Opacity of the lens mouse pointer, where 0 is fully transparent, and 1 is fully opaque. In tint and soft-focus modes, it will always be transparent.</td>
<td>0.5</td>
</tr>
<tr>
<td>softFocus</td>
<td>Applies a subtle blur effect to the small image. Set to true or false. Does not work with tint.</td>
<td>false</td>
</tr>
<tr>
<td>smoothMove</td>
<td>Amount of smoothness/drift of the zoom image as it moves. The higher the number, the smoother/more drifty the movement will be. 1 = no smoothing.</td>
<td>3</td>
</tr>
<tr>
<td>showTitle</td>
<td>Shows the title tag of the image. True or false.</td>
<td>true</td>
</tr>
<tr>
<td>titleOpacity</td>
<td>Specifies the opacity of the title if displayed,  where 0 is fully transparent, and 1 is fully opaque.</td>
<td>0.5</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.iinterest.net/2010/06/11/jquery-image-zoom-cloud-zoom/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

