<?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>NeoEase &#187; JavaScript</title>
	<atom:link href="http://www.neoease.com/tag/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.neoease.com</link>
	<description>MG12&#039;s Blog - Just Another WordPress Blog</description>
	<lastBuildDate>Sun, 08 Jan 2012 03:00: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>stopPropagation, preventDefault 和 return false 的区别</title>
		<link>http://www.neoease.com/stoppropagation-and-preventdefault-and-return-false/</link>
		<comments>http://www.neoease.com/stoppropagation-and-preventdefault-and-return-false/#comments</comments>
		<pubDate>Sun, 23 Oct 2011 01:49:18 +0000</pubDate>
		<dc:creator>mg12</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Difference]]></category>
		<category><![CDATA[Event]]></category>
		<category><![CDATA[Trick]]></category>

		<guid isPermaLink="false">http://www.neoease.com/?p=2126</guid>
		<description><![CDATA[因为有父, 子节点同在, 因为有监听事件和浏览器默认动作之分. 使用 JavaScript 时为了达到预期效果经常需要阻止事件和动作执行. 一般我们会用到三种方法, 分别是 stopPropagation(), preventDefault() 和 return false. 它们之间有什么区别, 该何时使用呢? 将在本文中进行讲解. 术语 监听事件, 在在节点上能被监听的页面操作. 如: select 节点的 change 事件, a 节点的 click 事件. 浏览器默认动作, 指特定页面元素上带有的功能. 如: 点击 a 链接节点的跳转动作, 表单提交动作. stopPropagation() 因为事件可以在各层级的节点中传递, 不管是冒泡还是捕获, 有时我们希望事件在特定节点执行完之后不再传递, 可以使用事件对象的 stopPropagation() 方法. 假设页面上存在一个浮动弹出层, 显示在最前面, 当点击弹出层以外页面区域时, 隐藏弹出层. 为了做到这样的效果, 我们会监听 documentElement 的 click 事件, 一旦事件被触发即隐藏弹出层. 但是... 这显然存在问题. [...]<p><hr color="#E0E0E0" />
<div>
Copyright &copy; 2007-2010 NeoEase. All rights reserved.<br />
<a href="http://www.neoease.com" target="_blank">NeoEase.com</a> | <a target="_blank" href="http://twitter.com/mg12" rel="nofollow">Twitter</a> | <a target="_blank" href="http://weibo.com/mg12" rel="nofollow">新浪微博</a> | <a target="_blank" href="http://www.douban.com/people/mg12" rel="nofollow">豆瓣</a> | <a target="_blank" href="http://www.zhihu.com/people/mg12" rel="nofollow">知乎</a>
</div></p>
]]></description>
			<content:encoded><![CDATA[<p>
因为有父, 子节点同在, 因为有监听事件和浏览器默认动作之分. 使用 JavaScript 时为了达到预期效果经常需要阻止事件和动作执行. 一般我们会用到三种方法, 分别是 <code>stopPropagation()</code>, <code>preventDefault()</code> 和 <code>return false</code>. 它们之间有什么区别, 该何时使用呢? 将在本文中进行讲解.
</p>
<p><span id="more-2126"></span></p>
<h3>术语</h3>
<p>
<strong>监听事件</strong>, 在在节点上能被监听的页面操作. 如: select 节点的 change 事件, a 节点的 click 事件.<br />
<strong>浏览器默认动作</strong>, 指特定页面元素上带有的功能. 如: 点击 a 链接节点的跳转动作, 表单提交动作.
</p>
<h3>stopPropagation()</h3>
<p>
因为事件可以在各层级的节点中传递, 不管是冒泡还是捕获, 有时我们希望事件在特定节点执行完之后不再传递, 可以使用事件对象的 <code>stopPropagation()</code> 方法.
</p>
<p>
假设页面上存在一个浮动弹出层, 显示在最前面, 当点击弹出层以外页面区域时, 隐藏弹出层. 为了做到这样的效果, 我们会监听 <code>documentElement</code> 的 click 事件, 一旦事件被触发即隐藏弹出层. 但是...
</p>
<p>
这显然存在问题. 当用户点击弹出层时, 我们不希望它隐藏掉. 但因为事件的冒泡传递, <code>documentElement</code> 的 click 事件也会被触发. 这个时候, 我们可以监听弹出层的 click 事件, 并使用 <code>stopPropagation()</code> 方法阻止冒泡. 请参考下面的代码.
</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">// 在弹出对话框上点击时, 不进行任何页面操作, 并阻止冒泡</span>
document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'dialog'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">onclick</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>ev<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	ev.<span style="color: #660066;">stopPropagation</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #006600; font-style: italic;">// 在 documentElement 节点上监听到点击事件时, 隐藏对话框</span>
document.<span style="color: #660066;">documentElement</span>.<span style="color: #660066;">onclick</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>ev<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'dialog'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">style</span>.<span style="color: #660066;">display</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'none'</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>
<code>stopPropagation()</code> 相当好用, 可是 IE8 及以前版本都不支持. IE 的事件对象包含特有的属性 <code>cancelBubble</code>, 只要将它赋值为 false 即可阻止事件继续. 如:
</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">// 在弹出对话框上点击时, 不进行任何页面操作, 并阻止冒泡</span>
document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'dialog'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">onclick</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>ev<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	ev.<span style="color: #660066;">cancelBubble</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<h3>preventDefault()</h3>
<p>
一个带事件监听的链接代码如下:
</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">a</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;http://w3c.org&quot;</span> <span style="color: #000066;">onclick</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;alert('JavaScript Click Event');&quot;</span>&gt;</span>点击链接<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">a</span>&gt;</span></pre></div></div>

<p>
点击该链接, 显示对话框后跳转页面. 由此可知, 除了执行监听事件还会触发浏览器默认动作; 执行监听事件在前, 触发浏览器默认动作在后.
</p>
<p>
这里有个经典示例, 我们希望点击链接在新窗口打开页面, 但不希望当前页面跳转. 这个时候可以使用 <code>preventDefault()</code> 阻止后面将要执行的浏览器默认动作.
</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">a</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;link&quot;</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;http://w3c.org&quot;</span>&gt;</span>W3C 首页链接<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">a</span>&gt;</span>
&nbsp;
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">script</span>&gt;</span>
// 在新窗口, 打开页面
document.getElementById('link').onclick = function(ev) {
	// 阻止浏览器默认动作 (页面跳转)
	ev.preventDefault();
	// 在新窗口打开页面
	window.open(this.href);
};
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span></pre></div></div>

<h3>return false</h3>
<p>
退出执行, <code>return false</code> 之后的所有触发事件和动作都不会被执行. 有时候 <code>return false</code> 可以用来替代 <code>stopPropagation()</code> 和 <code>preventDefault()</code>, 比如我们上面新窗口打开链接的例子, 如:
</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">a</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;link&quot;</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;http://w3c.org&quot;</span>&gt;</span>W3C 首页链接<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">a</span>&gt;</span>
&nbsp;
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">script</span>&gt;</span>
// 在新窗口, 打开页面
document.getElementById('link').onclick = function(ev) {
	// 在新窗口打开页面
	window.open(this.href);
	// 退出执行 (在监听事件之后执行的浏览器默认动作将不会被执行)
	return false;
};
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span></pre></div></div>

<p>
有人认为 <code>return false</code> = <code>stopPropagation()</code> + <code>preventDefault()</code>, 其实是错的. <code>return false</code> 不但阻止事件, 还可以返回对象, 跳出循环等... 方便地一刀切而不够灵活, 滥用易出错.
</p>
<h3>后话</h3>
<p>
因为习惯用 <code>return false</code> 来阻止事件, 最近在搞手机 Web 的时候遇到一些问题, 很是难堪. 写下此文当作笔记, 提醒自己.</p>
 <img src="http://www.neoease.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=2126" width="1" height="1" style="display: none;" /><ul>
		<li><a href="http://www.neoease.com/javascript-go-top/" rel="bookmark">用 JavaScript 实现变速回到顶部</a><!-- (12.1)--></li>
		<li><a href="http://www.neoease.com/get-cursor-position-with-javascript/" rel="bookmark">通过 JavaScript 获取页面上的鼠标位置</a><!-- (9.6)--></li>
		<li><a href="http://www.neoease.com/wordpress-at-reply/" rel="bookmark">WordPress 评论的 @ 回复</a><!-- (8.4)--></li>
		<li><a href="http://www.neoease.com/javascript-onload-function/" rel="bookmark">JavaScript 初始化装载方法</a><!-- (8.2)--></li>
		<li><a href="http://www.neoease.com/search-tip-of-google-cn-music/" rel="bookmark">谷歌音乐搜索栏的提示功能</a><!-- (7.4)--></li>
	</ul>
<p><hr color="#E0E0E0" />
<div>
Copyright &copy; 2007-2010 NeoEase. All rights reserved.<br />
<a href="http://www.neoease.com" target="_blank">NeoEase.com</a> | <a target="_blank" href="http://twitter.com/mg12" rel="nofollow">Twitter</a> | <a target="_blank" href="http://weibo.com/mg12" rel="nofollow">新浪微博</a> | <a target="_blank" href="http://www.douban.com/people/mg12" rel="nofollow">豆瓣</a> | <a target="_blank" href="http://www.zhihu.com/people/mg12" rel="nofollow">知乎</a>
</div></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neoease.com/stoppropagation-and-preventdefault-and-return-false/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>网页图片展示工具 - Highslide JS, Lightbox 2, Fancybox 比较</title>
		<link>http://www.neoease.com/web-gallery-tool-compare-highslide-js-vs-lightbox-2-vs-fancybox/</link>
		<comments>http://www.neoease.com/web-gallery-tool-compare-highslide-js-vs-lightbox-2-vs-fancybox/#comments</comments>
		<pubDate>Wed, 17 Aug 2011 11:19:03 +0000</pubDate>
		<dc:creator>mg12</dc:creator>
				<category><![CDATA[Web Tool]]></category>
		<category><![CDATA[Gallery]]></category>
		<category><![CDATA[Image]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Tool]]></category>

		<guid isPermaLink="false">http://www.neoease.com/?p=1958</guid>
		<description><![CDATA[相信建站的同学多少会考虑图片展示的问题, 当用户点击图片时究竟用什么形式向用户展示图片呢? 或许是放大镜, 或许是新开页面, 然而有很多人选择了在本页 popup 展示, 看似 Mac 的 Lightbox 效果, 实用而且洋气. 无论是自己的网站还是公司网站, 都用不到这样的效果, 写这么个文章有点奇怪. 只因最近给一个朋友做了几个页面, 他要求有类似效果. 而且我之前做过一个叫 Highslide4WP 的 WordPress 插件, 所以我也就对比了一下, 希望对其他站长有所帮助. 本文我会对 Highslide JS, Lightbox 2 和 Fancybox 进行简单的对比. 当然, 这些对比维度都是我的需求, 带有个人主观意识. 功能支持 这类插件功能强大得很, 机会你能想到的东西都能做成 popup, 而 Lightbox 2 算里面比较纯正的了. Highslide JS 支持图片, 图片轮播, HTML 片段, iframe, flash 等媒体. Highslide 还支持拖拽 [...]<p><hr color="#E0E0E0" />
<div>
Copyright &copy; 2007-2010 NeoEase. All rights reserved.<br />
<a href="http://www.neoease.com" target="_blank">NeoEase.com</a> | <a target="_blank" href="http://twitter.com/mg12" rel="nofollow">Twitter</a> | <a target="_blank" href="http://weibo.com/mg12" rel="nofollow">新浪微博</a> | <a target="_blank" href="http://www.douban.com/people/mg12" rel="nofollow">豆瓣</a> | <a target="_blank" href="http://www.zhihu.com/people/mg12" rel="nofollow">知乎</a>
</div></p>
]]></description>
			<content:encoded><![CDATA[<p>
相信建站的同学多少会考虑图片展示的问题, 当用户点击图片时究竟用什么形式向用户展示图片呢? 或许是放大镜, 或许是新开页面, 然而有很多人选择了在本页 popup 展示, 看似 Mac 的 Lightbox 效果, 实用而且洋气.
</p>
<p>
无论是自己的网站还是公司网站, 都用不到这样的效果, 写这么个文章有点奇怪. 只因最近给一个朋友做了几个页面, 他要求有类似效果. 而且我之前做过一个叫 <a href="http://www.neoease.com/highslide4wp/">Highslide4WP</a> 的 WordPress 插件, 所以我也就对比了一下, 希望对其他站长有所帮助.
</p>
<p><span id="more-1958"></span></p>
<p>
<img class="sided" src="http://photo.tuhigh.com/pics/1134/0817/187252t1313579267468_o.jpg" alt="" />
</p>
<p>
本文我会对 Highslide JS, Lightbox 2 和 Fancybox 进行简单的对比. 当然, 这些对比维度都是我的需求, 带有个人主观意识.
</p>
<h3>功能支持</h3>
<p>
这类插件功能强大得很, 机会你能想到的东西都能做成 popup, 而 Lightbox 2 算里面比较纯正的了.
</p>
<p>
<strong>Highslide JS</strong><br />
支持图片, 图片轮播, HTML 片段, iframe, flash 等媒体. Highslide 还支持拖拽 popup, 在原 popup 点击查看原图.
</p>
<p>
<strong>Lightbox 2</strong><br />
只支持图片, 图片轮播.
</p>
<p>
<strong>Fancybox</strong><br />
支持图片, 图片轮播, HTML 片段, iframe, flash 等媒体.
</p>
<h3>文件尺寸</h3>
<p>
因为 CSS 文件相差无几, 所以只比较 JavaScript 文件尺寸, 下面提及的文件尺寸均是压缩和混淆后的大小.
</p>
<p>
<strong>Highslide JS</strong><br />
不依赖任何 JavaScript 库, 有 4 种不同的功能脚本.
</p>
<ul>
<li>支持基本功能的 JS (highslide.packed.js) 有 25KB.</li>
<li>支持 HTML 片段的 JS (highslide-with-html.packed.js) 有 34KB.</li>
<li>支持画廊 (gallery) 的 JS (highslide-with-gallery.packed.js) 有 36KB.</li>
<li>支持全功能的 JS (highslide-full.packed.js) 有 46KB.</li>
</ul>
<p>
其中 iframe 和 flash 需要加载 highslide-with-html.packed.js
</p>
<p>
<strong>Lightbox 2</strong><br />
Lightbox 2 应该是用户群最多的, 原作需要引入 prototype 库, 但有人跟随开发出依赖 jQuery 的版本, 听说还有原生 JavaScript 版本. 撇开库文件不说, 压缩后的 JS 文件只有 6KB 到 8KB.
</p>
<p>
<strong>Fancybox</strong><br />
依赖 jQuery, 压缩后的 JS 文件有 15KB.
</p>
<h3>激活方式</h3>
<p>
其实就两种激活方式, 一种是工具加载时自动帮你找节点, 一种是使用 JavaScript 自己去找节点. 但因为 jQuery 的兴起和它强大的选择器, 后一种方式被使用得越来越多.
</p>
<p>
<strong>Highslide JS</strong><br />
使用特定 class 作为标记, 使用 JavaScript 为带标记的节点进行处理.
</p>
<p>
<strong>Lightbox 2</strong><br />
prototype 版: 使用特定 rel 作为标记, 使用 JavaScript 为带标记的节点进行处理.<br />
jQuery 版: 使用选择器找到对应节点, 并调用处理方法.
</p>
<p>
<strong>Fancybox</strong><br />
使用选择器找到对应节点, 并调用处理方法.
</p>
<h3>相关下载</h3>
<p>
<a rel="external" href="http://highslide.com/">Highslide JS</a><br />
<a rel="external" href="http://www.lokeshdhakar.com/projects/lightbox2/">Lightbox 2</a><br />
<a rel="external" href="http://leandrovieira.com/projects/jquery/lightbox/">Lightbox for jQuery</a><br />
<a rel="external" href="http://fancybox.net/">Fancybox</a>
</p>
<h3>结束语</h3>
<p>
其实我考虑的就几点:
</p>
<ul>
<li>能为我提供什么服务?</li>
<li>使用这些服务的代价如何?</li>
<li>使用方式是否符合习惯?</li>
</ul>
<p>
最后我选择了 Fancybox, 哪一款更适合你呢?</p>
 <img src="http://www.neoease.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=1958" width="1" height="1" style="display: none;" /><ul>
		<li><a href="http://www.neoease.com/lazy-load-jquery-plugin-delay-load-image/" rel="bookmark">Lazy Load, 延迟加载图片的 jQuery 插件</a><!-- (6.2)--></li>
		<li><a href="http://www.neoease.com/wordpress-searchbox-tip/" rel="bookmark">WordPress 搜索框添加文字提示</a><!-- (5.4)--></li>
		<li><a href="http://www.neoease.com/wordpress-menubar-6/" rel="bookmark">jQuery 导航菜单</a><!-- (5.3)--></li>
		<li><a href="http://www.neoease.com/jquery-slideup-and-slidedown/" rel="bookmark">jQuery 的 slideUp 和 slideDown 动画</a><!-- (5.2)--></li>
		<li><a href="http://www.neoease.com/inove-mouseover-to-show-comment-no/" rel="bookmark">iNove 中鼠标悬浮显示 @ 评论</a><!-- (4.5)--></li>
	</ul>
<p><hr color="#E0E0E0" />
<div>
Copyright &copy; 2007-2010 NeoEase. All rights reserved.<br />
<a href="http://www.neoease.com" target="_blank">NeoEase.com</a> | <a target="_blank" href="http://twitter.com/mg12" rel="nofollow">Twitter</a> | <a target="_blank" href="http://weibo.com/mg12" rel="nofollow">新浪微博</a> | <a target="_blank" href="http://www.douban.com/people/mg12" rel="nofollow">豆瓣</a> | <a target="_blank" href="http://www.zhihu.com/people/mg12" rel="nofollow">知乎</a>
</div></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neoease.com/web-gallery-tool-compare-highslide-js-vs-lightbox-2-vs-fancybox/feed/</wfw:commentRss>
		<slash:comments>31</slash:comments>
		</item>
		<item>
		<title>WordPress 的 JavaScript 本地化</title>
		<link>http://www.neoease.com/wordpress-javascript-l10n/</link>
		<comments>http://www.neoease.com/wordpress-javascript-l10n/#comments</comments>
		<pubDate>Mon, 28 Feb 2011 13:27:13 +0000</pubDate>
		<dc:creator>mg12</dc:creator>
				<category><![CDATA[WP Trick]]></category>
		<category><![CDATA[Feature]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[l10n]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.neoease.com/?p=1844</guid>
		<description><![CDATA[WordPress 升级到 3.1 之后, 如果主题支持 wp_head() 方法, 将在页面加载一个名为 l10n.js 的文件, 这是为 JavaScript 本地化提供的工具库. 目前对大多数人来说是一个无用的功能, 甚至有人认为这是 WordPress 卑鄙地偷偷地在页面上埋了一个扯淡的脚本, 所以网上能找到的都是如何卸载脚本的方法. 在我们卸载之前, 是不是应该先了解一下这是怎样的一个功能, 添加脚本的意图是什么? 本文将说明 l10n.js 脚本存在的意义, 本地化脚本的使用方法和对其未来的展望. &#60;script type='text/javascript' src='{ROOT DIR}/wp-includes/js/l10n.js?ver=20101110'&#62;&#60;/script&#62; i18n 和 l10n i18n[1] 和 l10n[2] 是 IT 领域常用的缩写术语, 分别是国际化和本地化的意思. i18n 指应用程序能够为不同的国家和语言环境的用户群体提供本地化的服务, 而 l10n 则是在用户使用环境实现本地化特性, 国际化和本地化泛指语言环境的多语言实现. 如: WordPress 是一个支持国际化的程序, 只要提供对应国家语言包并制定国家代号, 就能替换整个网站的语言环境. JavaScript 本地化 如前面的例子, WordPress 一直支持国际化, [...]<p><hr color="#E0E0E0" />
<div>
Copyright &copy; 2007-2010 NeoEase. All rights reserved.<br />
<a href="http://www.neoease.com" target="_blank">NeoEase.com</a> | <a target="_blank" href="http://twitter.com/mg12" rel="nofollow">Twitter</a> | <a target="_blank" href="http://weibo.com/mg12" rel="nofollow">新浪微博</a> | <a target="_blank" href="http://www.douban.com/people/mg12" rel="nofollow">豆瓣</a> | <a target="_blank" href="http://www.zhihu.com/people/mg12" rel="nofollow">知乎</a>
</div></p>
]]></description>
			<content:encoded><![CDATA[<p>
WordPress 升级到 3.1 之后, 如果主题支持 <code>wp_head()</code> 方法, 将在页面加载一个名为 <strong>l10n.js</strong> 的文件, 这是为 <strong>JavaScript 本地化</strong>提供的工具库. 目前对大多数人来说是一个无用的功能, 甚至有人认为这是 WordPress 卑鄙地偷偷地在页面上埋了一个扯淡的脚本, 所以网上能找到的都是如何卸载脚本的方法. 在我们卸载之前, 是不是应该先了解一下这是怎样的一个功能, 添加脚本的意图是什么? 本文将说明 l10n.js 脚本存在的意义, 本地化脚本的使用方法和对其未来的展望.
</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">script</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'text/javascript'</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'{ROOT DIR}/wp-includes/js/l10n.js?ver=20101110'</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span></pre></div></div>

<p><span id="more-1844"></span></p>
<h3>i18n 和 l10n</h3>
<p>
i18n<sup>[1]</sup> 和 l10n<sup>[2]</sup> 是 IT 领域常用的缩写术语, 分别是国际化和本地化的意思. i18n 指应用程序能够为不同的国家和语言环境的用户群体提供本地化的服务, 而 l10n 则是在用户使用环境实现本地化特性, 国际化和本地化泛指语言环境的多语言实现. 如: WordPress 是一个支持国际化的程序, 只要提供对应国家语言包并制定国家代号, 就能替换整个网站的语言环境.
</p>
<h3>JavaScript 本地化</h3>
<p>
如前面的例子, WordPress 一直支持国际化, 并提供 <code>_e()</code> 和 <code>__()</code> 两个 PHP 方法对程序进行本地化. 但随着前端 JavaScript 应用越来越多, 后端的国际化已经满足不了所有需求, 有必要引入 JavaScript 的国际化和本地化.
</p>
<p>
若你使用的主题支持 <code>wp_head()</code> 方法, 将在页面加载 l10n.js 文件, 而且用户可以通过简单的代码向页面注入本地化资源. l10n.js 是一个 JavaScript 本地化的工具库, 包含 <code>convertEntities()</code> 方法, 可以将 HTML 对象还原成原来的值, 所以它会在所有注入的 JavaScript 脚本和本地化资源之前载入.
</p>
<h3>使用的方法</h3>
<p>
我们可以为每一个要载入的 JavaScript 文件定义本地化资源. 实现代码如下<sup>[3]</sup>:
</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// 必须先载入一个 Javascript 文件</span>
wp_enqueue_script<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'some_handle'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'/some_javascript.js'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// 组装本地化数据, 使用 __() 制作本地化内容</span>
<span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'some_string'</span> <span style="color: #339933;">=&gt;</span> __<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'Some string to translate'</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// 加载本地化脚本. 这里必须指定一个需要载入的 JavaScript 文件.</span>
wp_localize_script<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'some_handle'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'object_name'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$data</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>
执行后将在页面上生成代码如下:
</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">/* &lt;![CDATA[ */</span>
<span style="color: #003366; font-weight: bold;">var</span> object_name <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
some_string<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;Some string to translate&quot;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #009966; font-style: italic;">/* ]]&gt; */</span>
<span style="color: #339933;">&lt;</span>script type<span style="color: #339933;">=</span><span style="color: #3366CC;">'text/javascript'</span> src<span style="color: #339933;">=</span><span style="color: #3366CC;">'{ROOT DIR}/some_javascript.js?ver=3.1'</span><span style="color: #339933;">&gt;&lt;/</span>script<span style="color: #339933;">&gt;</span></pre></div></div>

<p>
本地化资源会在指定脚本之前载入和定义. 其中 {ROOT DIR} 是网站的根目录.
</p>
<p>
此时如果我们可以通过以下代码进行测试:
</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>object_name.<span style="color: #660066;">some_string</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// 弹出对话框, 显示 'Some string to translate'</span></pre></div></div>

<h3>利弊和应用场合</h3>
<p>
好处前面说了很多, 可以方便地进行前端本地化 (需要后端 PHP 配合). 缺点也很明显, 会在每次页面加载时计算本地化资源, 并且载入大量 JavaScript 代码, 增加系统负担和延长页面加载时间.
</p>
<p>
JavaScript 本地化是 WordPress 主题和插件制作中让人较为烦恼的地方, 一些插件开发者会在页面上自行定义 l10n 对象, 可以参考 <a href="http://www.neoease.com/wp-recentcomments/">WP-RecentComments 插件</a>的做法. WordPress 这次强行引入, 很可能会被主题和插件开发者广泛应用. 也就是说, 不久的将来你未必敢卸载掉它, 否则某些插件将运行不了.
</p>
<h3>卸载和恢复的方法</h3>
<p>
虽说 l10n.js 文件很小, 好歹会发出一个请求, 如果你真的认为没用, 可以在 functions.php 中添加以下代码将它卸载掉.
</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">wp_deregister_script<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'l10n'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>
如函数名, 这个方法不是禁用, 而是注销. 也就是说, 一旦你注销就没有了, 就算删除这段代码也不会还原. 如果在注销后希望回复需要使用以下方法:
</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">wp_register_script<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'l10n'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<h3>总结</h3>
<p>
WordPress 的想法很好, 但这实现方式叫我该如何吐槽, 希望 "支持 JavaScript 本地化" 不是通过主题审核的必要条件. 作为前端, 多少有点页面洁癖, 我已经将这个脚本注销掉了. 另外, 看到 WordPress 3.1 那夺目的 Admin Bar 我淡定地笑了, 祝 WordPress 越来越臃肿.
</p>
<div class="annotations">
<h5>注解</h5>
<ol>
<li>internationalization, 国际化的意思. 因为单词前后字母 i 和 n 之间有 18 个字母存在, 所以缩写成 i18n.</li>
<li>localization, 本地化的意思. 因为单词前后字母 l 和 n 之间有 10 个字母存在, 所以缩写成 l10n.</li>
<li>代码引用自 <a rel="external" href="http://codex.wordpress.org/Function_Reference/wp_localize_script">WordPress Codex - wp_localize_script</a>.</li>
</ol>
</div>
 <img src="http://www.neoease.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=1844" width="1" height="1" style="display: none;" /><ul>
		<li><a href="http://www.neoease.com/javascript-get-integer-via-parseint/" rel="bookmark">JavaScript 的 parseInt 取整</a><!-- (9.2)--></li>
		<li><a href="http://www.neoease.com/javascript-namespace/" rel="bookmark">JavaScript 的命名空间</a><!-- (8.4)--></li>
		<li><a href="http://www.neoease.com/load-posts-dynamically/" rel="bookmark">WordPress 动态加载文章内容</a><!-- (7.9)--></li>
		<li><a href="http://www.neoease.com/javascript-onload-function/" rel="bookmark">JavaScript 初始化装载方法</a><!-- (7.6)--></li>
		<li><a href="http://www.neoease.com/javascript-with-statement/" rel="bookmark">关于 JavaScript 的 with 语句</a><!-- (7)--></li>
	</ul>
<p><hr color="#E0E0E0" />
<div>
Copyright &copy; 2007-2010 NeoEase. All rights reserved.<br />
<a href="http://www.neoease.com" target="_blank">NeoEase.com</a> | <a target="_blank" href="http://twitter.com/mg12" rel="nofollow">Twitter</a> | <a target="_blank" href="http://weibo.com/mg12" rel="nofollow">新浪微博</a> | <a target="_blank" href="http://www.douban.com/people/mg12" rel="nofollow">豆瓣</a> | <a target="_blank" href="http://www.zhihu.com/people/mg12" rel="nofollow">知乎</a>
</div></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neoease.com/wordpress-javascript-l10n/feed/</wfw:commentRss>
		<slash:comments>54</slash:comments>
		</item>
		<item>
		<title>线上 JSON 编辑工具</title>
		<link>http://www.neoease.com/json-editor-online/</link>
		<comments>http://www.neoease.com/json-editor-online/#comments</comments>
		<pubDate>Thu, 17 Feb 2011 17:23:21 +0000</pubDate>
		<dc:creator>mg12</dc:creator>
				<category><![CDATA[Web Tool]]></category>
		<category><![CDATA[Editor]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[Online]]></category>
		<category><![CDATA[Tool]]></category>
		<category><![CDATA[Translation]]></category>

		<guid isPermaLink="false">http://www.neoease.com/?p=1792</guid>
		<description><![CDATA[这是一个译文, 文中谈及的 JSON 编辑工具和原文已经是 2007 年的产物. 浏览器兼容也是很老的版本, 但工具在新型浏览器中使用正常. 今日看到一个网友的博客提到这个 JSON 编辑器, 试用了一下感觉不错, 起码可以满足我的需求, 所以顺便翻译一下分享出来. 译文如下: 过去数个星期我一直在寻找一款包括树形视图的 JSON 编辑工具. 你可以通过这么个工具获得满意的 JSON 结构综述, 并且能够轻松地对结构作出修改. 是的, 我[1]知道那中表现形式有点像 Firebug, 而事实上找到了 Calm_Pear 的 promising attempt. 但我觉得两个都不足以满足我最初的需求, 所以我写了自己的工具. 你可以线上试用或者下载源代码 (zip 文件, 26 KB). 如何使用 源代码中包含一个 HTML 示例文件. 作为作者我认为例子中的用户界面是相当直接了当的, 但我还是会做一些解释的. 你需要引入脚本, 并在 HTML 内创建两个包括 id 的 div, 一个用于放置树形结构, 另一个将用来显示编辑表单. 页面加载是, 你会通过下面的方法来激活整个事件: JSONeditor.start [...]<p><hr color="#E0E0E0" />
<div>
Copyright &copy; 2007-2010 NeoEase. All rights reserved.<br />
<a href="http://www.neoease.com" target="_blank">NeoEase.com</a> | <a target="_blank" href="http://twitter.com/mg12" rel="nofollow">Twitter</a> | <a target="_blank" href="http://weibo.com/mg12" rel="nofollow">新浪微博</a> | <a target="_blank" href="http://www.douban.com/people/mg12" rel="nofollow">豆瓣</a> | <a target="_blank" href="http://www.zhihu.com/people/mg12" rel="nofollow">知乎</a>
</div></p>
]]></description>
			<content:encoded><![CDATA[<p>
这是一个译文, 文中谈及的 <strong>JSON 编辑工具</strong>和原文已经是 2007 年的产物. 浏览器兼容也是很老的版本, 但工具在新型浏览器中使用正常. 今日看到<a rel="nofollow external" href="http://endless.im/archives/online-json-editor.html">一个网友的博客</a>提到这个 JSON 编辑器, 试用了一下感觉不错, 起码可以满足我的需求, 所以顺便翻译一下分享出来. 译文如下:
</p>
<p><span id="more-1792"></span></p>
<p>
过去数个星期我一直在寻找一款包括树形视图的 <a rel="external" href="http://www.json.org/">JSON</a> 编辑工具. 你可以通过这么个工具获得满意的 JSON 结构综述, 并且能够轻松地对结构作出修改.
</p>
<p>
是的, 我<sup>[1]</sup>知道那中表现形式有点像 Firebug, 而事实上找到了 Calm_Pear 的 promising attempt. 但我觉得两个都不足以满足我最初的需求, 所以我写了自己的工具.
</p>
<p>
<img src="http://www.thomasfrank.se/images/jsoneditor.gif" alt="JSON 编辑器" />
</p>
<p>
你可以<a rel="nofollow external" href="http://www.thomasfrank.se/downloadableJS/JSONeditor_example.html">线上试用</a>或者<a rel="nofollow" href="http://www.thomasfrank.se/downloadableJS/JSONeditor.zip">下载源代码</a> (zip 文件, 26 KB).
</p>
<h3>如何使用</h3>
<p>
源代码中包含一个 HTML 示例文件. 作为作者我认为例子中的用户界面是相当直接了当的, 但我还是会做一些解释的. 你需要引入脚本, 并在 HTML 内创建两个包括 id 的 div, 一个用于放置树形结构, 另一个将用来显示编辑表单. 页面加载是, 你会通过下面的方法来激活整个事件:
</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">JSONeditor.<span style="color: #660066;">start</span> <span style="color: #009900;">&#40;</span>treeDivName<span style="color: #339933;">,</span>formDivName<span style="color: #339933;">,</span>JSONobject<span style="color: #339933;">,</span>ShowExampleList<span style="color: #009900;">&#41;</span></pre></div></div>

<p>
JSONeditor 是一个 JavaScript 对象, 其中 JSONobject (JSON 结构代码) 和 ShowExampleList 两个参数用于控制默认的显示内容和示例列表显示与否.
</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">html</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">head</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">script</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;JSONeditor.js&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">script</span>&gt;</span>
onload=function(){
     JSONeditor.start('tree','jform',{},true)
}
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">head</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">body</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span> <span style="color: #000066;">style</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;position:absolute;top:10px;left:10px&quot;</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;tree&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span> <span style="color: #000066;">style</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;position:absolute;top:10px;left:400px&quot;</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;jform&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">body</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">html</span>&gt;</span></pre></div></div>

<h3>使用树形视图</h3>
<p>
所有对象和数组, 包括他们的子节点都会以文件夹形式显示. 使用的规则如下:
</p>
<ul>
<li>点击加好展开文件夹, 点击减号折叠文件夹. 点击一个节点将在编辑器中加载节点对应的结构.</li>
</ul>
<h3>Label, Value 和 Data type 区域</h3>
<ul>
<li>Label 区域显示的是选中节点的 JSON 路径. 在保存之前你可以随意修改对应的路径和 Label.</li>
<li>Value 区域显示的是 JSON 的表达式. 唯一的例外是字符串, 为了方便阅读, 字符串类型显示为打印文本, 而不是 JSON 表达式.</li>
<li>Data type 区域显示的是编辑节点的数据类型. 你可以改变它，虽然只是相当于基本类型的转换.</li>
</ul>
<h3>保存更改</h3>
<ul>
<li>点击 Save 按钮保存所有你对 Lable, Value 和 Data type 的修改.</li>
</ul>
<h3>删除节点</h3>
<ul>
<li>点击 Delete 删除当前选中的节点.</li>
</ul>
<h3>重命名节点</h3>
<ul>
<li>点击 Rename 对当前选中的节点进行重命名. 程序会提示你输入新的节点名称. (这相当于在 Label 区域进行修改.)</li>
</ul>
<h3>添加子节点和邻节点</h3>
<ul>
<li>点击 Add child 在选中的对象或数组上添加一个子节点.</li>
<li>点击 Add sibling 在选中节点之后添加一个同级的节点.</li>
</ul>
<p>
如果选中 Add children first/siblings before 选项:
</p>
<ul>
<li>一个新增子节点将被添加到所有子节点之前.</li>
<li>一个新增邻节点将被添加到选中节点之前.</li>
</ul>
<h3>剪切, 拷贝和粘贴</h3>
<p>
拷贝一个节点:
</p>
<ol>
<li>在树形视图中选中你想拷贝的节点.</li>
<li>点击 Copy 按钮.</li>
<li>点击树形视图中的目标节点 (插入位置的相邻节点).</li>
<li>点击 Paste 按钮.</li>
</ol>
<p>
<b>注意:</b>
</p>
<ul>
<li>剪切的工作方式与拷贝十分类似, 但源节点将被移除.</li>
<li>如果选中 Paste as child on objects &amp; arrays 选项, 节点将被当成子节点插入.</li>
<li>Add children first/siblings before 选项仍会影响粘贴是节点的摆放方式.</li>
</ul>
<h3>兼容性</h3>
<p>
一切好像是相当的稳定, 但如果你找到任何 bug 请留言告知, 我会尝试去解决.
</p>
<h3>合格的 JSON</h3>
<p>
用编辑器创建的 JSON 都是合格有效的, 除了能够包含 JavaScript 方法不符标准. 对 JSON 的处理基于我的字符串转换器 <a href="nofollow external">JSONstring</a>. 如果你定义一个内部的循环应用对象, 程序会阻塞.
</p>
<p>
另外, 当它涉及到每一个 JSON 字符串转换器, 你应该避免在你想修改的对象里混合引用 DOM 节点. 那是不能操作的.
</p>
<h3>浏览器</h3>
<p>
我已经在 IE7, Firefox 2, Opera 9 和 Safari 2 中测试过这个工具, 它可以正常使用, 除了以下的一些异常:
</p>
<ul>
<li>方法的字符串转换在 Safari 中有时不能使用, 这个一个浏览器的 bug. 当方法内包含转义斜线 (如 \n 和 \r) 和其他一些小问题时, 问题会出现. </li>
</ul>
<h3>译者的话</h3>
<p>
这个工具看似一看即懂, 但在看完文章之后, 还是发现有一些操作细节应该留意的. 文章最后一段没有翻译, 写的是作者准备为该工具添加的一些功能和改进 (如增加拖拽更换节点位置), 但 4 年来都没修改, 也没什么希望了, 所以就不翻译了, 大家知道就好. 希望这个工具对你有用, 更希望有人对它进行二次开发, 另它变得强大 (比如加上拖拽功能).
</p>
<p>
原文链接: <a href="http://www.thomasfrank.se/json_editor.html">My JSON editor</a>
</p>
<div class="annotations">
<h5>注解</h5>
<ol>
<li>原文作者</li>
</ol>
</div>
 <img src="http://www.neoease.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=1792" width="1" height="1" style="display: none;" /><ul>
		<li><a href="http://www.neoease.com/lazy-load-jquery-plugin-delay-load-image/" rel="bookmark">Lazy Load, 延迟加载图片的 jQuery 插件</a><!-- (4.4)--></li>
		<li><a href="http://www.neoease.com/wordpress-javascript-l10n/" rel="bookmark">WordPress 的 JavaScript 本地化</a><!-- (4.2)--></li>
		<li><a href="http://www.neoease.com/wordpress-searchbox-tip/" rel="bookmark">WordPress 搜索框添加文字提示</a><!-- (3.5)--></li>
		<li><a href="http://www.neoease.com/javascript-onload-function/" rel="bookmark">JavaScript 初始化装载方法</a><!-- (3.2)--></li>
		<li><a href="http://www.neoease.com/output-html-in-javascript/" rel="bookmark">用 JavaScript 输出页面代码</a><!-- (3.2)--></li>
	</ul>
<p><hr color="#E0E0E0" />
<div>
Copyright &copy; 2007-2010 NeoEase. All rights reserved.<br />
<a href="http://www.neoease.com" target="_blank">NeoEase.com</a> | <a target="_blank" href="http://twitter.com/mg12" rel="nofollow">Twitter</a> | <a target="_blank" href="http://weibo.com/mg12" rel="nofollow">新浪微博</a> | <a target="_blank" href="http://www.douban.com/people/mg12" rel="nofollow">豆瓣</a> | <a target="_blank" href="http://www.zhihu.com/people/mg12" rel="nofollow">知乎</a>
</div></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neoease.com/json-editor-online/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>北京招 ASP.NET MVC 软件工程师</title>
		<link>http://www.neoease.com/asp-net-mvc-developer-hiring/</link>
		<comments>http://www.neoease.com/asp-net-mvc-developer-hiring/#comments</comments>
		<pubDate>Sun, 05 Dec 2010 16:45:44 +0000</pubDate>
		<dc:creator>mg12</dc:creator>
				<category><![CDATA[Job]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[Beijing]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[Hiring]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[MVC]]></category>

		<guid isPermaLink="false">http://www.neoease.com/?p=1691</guid>
		<description><![CDATA[帮朋友招 ASP.NET MVC 软件开发. 公司业务类型属于欧美软件外包, 其招聘要求如下: 个人品格: 诚信 专业技能: 精通 ASP.NET MVC, 精通 C# 3.0 或 4.0, 精通 JavaScript/AJAX/jQuery 语言能力: 能看懂英文技术 Email, 理解英文任务. 最好也具备听说写的英文能力. 办公地点: 北京 我们要求的是能直接干活的人，马上能写代码的人，写代码将是你工作中的最重要部分和绝大部分。 你的工作将是直接Report给我。所以我要直接为你的工作负责，所以我不搞闲人和吹牛皮职位，我不喜欢这种人。如果你有能力，我会提供给你一个安心写你的代码的环境，让你生活简单，心情平静快乐:-)。 联系邮箱: yewm@shinetechchina.com 招聘原文: AdaLoveLacer 的专栏 将 Blogroll 分为两栏 (4) 线上 JSON 编辑工具 Google DevFest 互联网技术交流会 谷歌音乐搜索栏的提示功能 关于 JavaScript 的 with 语句 Copyright &#169; 2007-2010 NeoEase. All rights [...]<p><hr color="#E0E0E0" />
<div>
Copyright &copy; 2007-2010 NeoEase. All rights reserved.<br />
<a href="http://www.neoease.com" target="_blank">NeoEase.com</a> | <a target="_blank" href="http://twitter.com/mg12" rel="nofollow">Twitter</a> | <a target="_blank" href="http://weibo.com/mg12" rel="nofollow">新浪微博</a> | <a target="_blank" href="http://www.douban.com/people/mg12" rel="nofollow">豆瓣</a> | <a target="_blank" href="http://www.zhihu.com/people/mg12" rel="nofollow">知乎</a>
</div></p>
]]></description>
			<content:encoded><![CDATA[<p>
帮朋友<strong>招 ASP.NET MVC 软件开发</strong>. 公司业务类型属于欧美软件外包, 其招聘要求如下:
</p>
<p>
<strong>个人品格:</strong> 诚信<br />
<strong>专业技能:</strong> 精通 ASP.NET MVC, 精通 C# 3.0 或 4.0, 精通 JavaScript/AJAX/jQuery<br />
<strong>语言能力:</strong> 能看懂英文技术 Email, 理解英文任务. 最好也具备听说写的英文能力.<br />
<strong>办公地点:</strong> 北京
</p>
<p><span id="more-1691"></span></p>
<blockquote><p>
我们要求的是能直接干活的人，马上能写代码的人，写代码将是你工作中的最重要部分和绝大部分。<br />
你的工作将是直接Report给我。所以我要直接为你的工作负责，所以我不搞闲人和吹牛皮职位，我不喜欢这种人。如果你有能力，我会提供给你一个安心写你的代码的环境，让你生活简单，心情平静快乐:-)。
</p></blockquote>
<p>
<strong>联系邮箱:</strong> <a rel="nofollow" href="mailto:yewm@shinetechchina.com">yewm@shinetechchina.com</a><br />
<strong>招聘原文:</strong> <a rel="external" href="http://blog.csdn.net/AdaLoveLacer/archive/2010/12/05/6056188.aspx">AdaLoveLacer 的专栏</a></p>
 <img src="http://www.neoease.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=1691" width="1" height="1" style="display: none;" /><ul>
		<li><a href="http://www.neoease.com/spliting-blogroll-to-2-columns-04/" rel="bookmark">将 Blogroll 分为两栏 (4)</a><!-- (1)--></li>
		<li><a href="http://www.neoease.com/json-editor-online/" rel="bookmark">线上 JSON 编辑工具</a><!-- (1)--></li>
		<li><a href="http://www.neoease.com/google-devfest-2010-beijing/" rel="bookmark">Google DevFest 互联网技术交流会</a><!-- (1)--></li>
		<li><a href="http://www.neoease.com/search-tip-of-google-cn-music/" rel="bookmark">谷歌音乐搜索栏的提示功能</a><!-- (1)--></li>
		<li><a href="http://www.neoease.com/javascript-with-statement/" rel="bookmark">关于 JavaScript 的 with 语句</a><!-- (1)--></li>
	</ul>
<p><hr color="#E0E0E0" />
<div>
Copyright &copy; 2007-2010 NeoEase. All rights reserved.<br />
<a href="http://www.neoease.com" target="_blank">NeoEase.com</a> | <a target="_blank" href="http://twitter.com/mg12" rel="nofollow">Twitter</a> | <a target="_blank" href="http://weibo.com/mg12" rel="nofollow">新浪微博</a> | <a target="_blank" href="http://www.douban.com/people/mg12" rel="nofollow">豆瓣</a> | <a target="_blank" href="http://www.zhihu.com/people/mg12" rel="nofollow">知乎</a>
</div></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neoease.com/asp-net-mvc-developer-hiring/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>随机排序广告</title>
		<link>http://www.neoease.com/random-advertisements/</link>
		<comments>http://www.neoease.com/random-advertisements/#comments</comments>
		<pubDate>Thu, 05 Aug 2010 08:15:03 +0000</pubDate>
		<dc:creator>mg12</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Advertisement]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.neoease.com/?p=1364</guid>
		<description><![CDATA[博客流行在侧边栏放置 4 到 6 个 125x125 的广告, 但一般的摆放顺序存在问题. 如果广告位置被固定, 各个位置的天然关注度肯定是不一样的. 投放广告的人都很关注他的广告会放在哪个位置, 因为这可能影响点击次数, 甚至是否在第一屏显示. 就这个问题, 其实很容易解决, 只要随机显示广告即可. 代码如何实现? 在这我推荐两种随机显示广告的处理办法. 在后端处理 在后端排序好再输出页面. 将广告节点用数组存放, 对数组进行随机排序, 再输出经过排序的数组. 参考代码 (PHP) 如下: // 用数组存放广告列表 $ads = array&#40;'&#60;a href=&#34;#&#34;&#62;&#60;img src=&#34;ad-125x125.png&#34; alt=&#34;广告 1&#34; width=&#34;125&#34; height=&#34;125&#34; /&#62;&#60;/a&#62;' ,'&#60;a href=&#34;#&#34;&#62;&#60;img src=&#34;ad-125x125.png&#34; alt=&#34;广告 2&#34; width=&#34;125&#34; height=&#34;125&#34; /&#62;&#60;/a&#62;' ,'&#60;a href=&#34;#&#34;&#62;&#60;img src=&#34;ad-125x125.png&#34; alt=&#34;广告 3&#34; width=&#34;125&#34; height=&#34;125&#34; /&#62;&#60;/a&#62;' ,'&#60;a [...]<p><hr color="#E0E0E0" />
<div>
Copyright &copy; 2007-2010 NeoEase. All rights reserved.<br />
<a href="http://www.neoease.com" target="_blank">NeoEase.com</a> | <a target="_blank" href="http://twitter.com/mg12" rel="nofollow">Twitter</a> | <a target="_blank" href="http://weibo.com/mg12" rel="nofollow">新浪微博</a> | <a target="_blank" href="http://www.douban.com/people/mg12" rel="nofollow">豆瓣</a> | <a target="_blank" href="http://www.zhihu.com/people/mg12" rel="nofollow">知乎</a>
</div></p>
]]></description>
			<content:encoded><![CDATA[<p>
博客流行在侧边栏放置 4 到 6 个 125x125 的<strong>广告</strong>, 但一般的<strong>摆放顺序</strong>存在问题. 如果广告位置被固定, 各个位置的天然关注度肯定是不一样的.
</p>
<p>
投放广告的人都很关注他的广告会放在哪个位置, 因为这可能影响点击次数, 甚至是否在第一屏显示. 就这个问题, 其实很容易解决, 只要<strong>随机</strong>显示广告即可.
</p>
<p>
代码如何实现? 在这我推荐两种随机显示广告的处理办法.
</p>
<p><span id="more-1364"></span></p>
<h3>在后端处理</h3>
<p>
在后端排序好再输出页面. 将广告节点用数组存放, 对数组进行随机排序, 再输出经过排序的数组. 参考代码 (PHP) 如下:
</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// 用数组存放广告列表</span>
<span style="color: #000088;">$ads</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'&lt;a href=&quot;#&quot;&gt;&lt;img src=&quot;ad-125x125.png&quot; alt=&quot;广告 1&quot; width=&quot;125&quot; height=&quot;125&quot; /&gt;&lt;/a&gt;'</span>
			<span style="color: #339933;">,</span><span style="color: #0000ff;">'&lt;a href=&quot;#&quot;&gt;&lt;img src=&quot;ad-125x125.png&quot; alt=&quot;广告 2&quot; width=&quot;125&quot; height=&quot;125&quot; /&gt;&lt;/a&gt;'</span>
			<span style="color: #339933;">,</span><span style="color: #0000ff;">'&lt;a href=&quot;#&quot;&gt;&lt;img src=&quot;ad-125x125.png&quot; alt=&quot;广告 3&quot; width=&quot;125&quot; height=&quot;125&quot; /&gt;&lt;/a&gt;'</span>
			<span style="color: #339933;">,</span><span style="color: #0000ff;">'&lt;a href=&quot;#&quot;&gt;&lt;img src=&quot;ad-125x125.png&quot; alt=&quot;广告 4&quot; width=&quot;125&quot; height=&quot;125&quot; /&gt;&lt;/a&gt;'</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// 对数组进行随机排序</span>
<span style="color: #990000;">shuffle</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ads</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// 输出经过排序的数组</span>
<span style="color: #000088;">$html</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$ads</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$ad</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$html</span> <span style="color: #339933;">.=</span> <span style="color: #000088;">$ad</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$html</span><span style="color: #339933;">;</span></pre></div></div>

<p>
我们来扩展一下, 如果我是站长, 预留了 4 个广告位, 但现在只有 3 个在投放; 我想在空置的广告位放置一个 "虚位以待" 的广告招租链接, 并显示在最后, 该如何处理呢? 在排序完成之后再插放广告招租链接就可以了.
</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// 用数组存放广告列表</span>
<span style="color: #000088;">$ads</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'&lt;a href=&quot;#&quot;&gt;&lt;img src=&quot;ad-125x125.png&quot; alt=&quot;广告 1&quot; width=&quot;125&quot; height=&quot;125&quot; /&gt;&lt;/a&gt;'</span>
			<span style="color: #339933;">,</span><span style="color: #0000ff;">'&lt;a href=&quot;#&quot;&gt;&lt;img src=&quot;ad-125x125.png&quot; alt=&quot;广告 2&quot; width=&quot;125&quot; height=&quot;125&quot; /&gt;&lt;/a&gt;'</span>
			<span style="color: #339933;">,</span><span style="color: #0000ff;">'&lt;a href=&quot;#&quot;&gt;&lt;img src=&quot;ad-125x125.png&quot; alt=&quot;广告 3&quot; width=&quot;125&quot; height=&quot;125&quot; /&gt;&lt;/a&gt;'</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// 对数组进行随机排序</span>
<span style="color: #990000;">shuffle</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ads</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// 输出经过排序的数组</span>
<span style="color: #000088;">$html</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$ads</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$ad</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$html</span> <span style="color: #339933;">.=</span> <span style="color: #000088;">$ad</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// 添加广告招租链接</span>
<span style="color: #000088;">$html</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">'&lt;a href=&quot;#&quot;&gt;&lt;img src=&quot;sell-ad-125x125.png&quot; alt=&quot;虚位以待&quot; width=&quot;125&quot; height=&quot;125&quot; /&gt;&lt;/a&gt;'</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$html</span><span style="color: #339933;">;</span></pre></div></div>

<p>
我就是用这个方法来输出 125x125 广告的, 因为它直观可靠, 处理方便. 但是如果你希望对页面做静态化, 建议选用 JS 随机排序的方法.
</p>
<h3>在前端处理</h3>
<p>
在后端按原有循序输出, 在页面通过 JavaScript 重新排序. 假设页面输出广告区域的 HTML 片段如下.
</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;div id=&quot;ads&quot;&gt;
	&lt;a href=&quot;#&quot;&gt;&lt;img src=&quot;ad-125x125.png&quot; alt=&quot;广告 1&quot; width=&quot;125&quot; height=&quot;125&quot; /&gt;&lt;/a&gt;
	&lt;a href=&quot;#&quot;&gt;&lt;img src=&quot;ad-125x125.png&quot; alt=&quot;广告 2&quot; width=&quot;125&quot; height=&quot;125&quot; /&gt;&lt;/a&gt;
	&lt;a href=&quot;#&quot;&gt;&lt;img src=&quot;ad-125x125.png&quot; alt=&quot;广告 3&quot; width=&quot;125&quot; height=&quot;125&quot; /&gt;&lt;/a&gt;
	&lt;a href=&quot;#&quot;&gt;&lt;img src=&quot;ad-125x125.png&quot; alt=&quot;广告 4&quot; width=&quot;125&quot; height=&quot;125&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;</pre></div></div>

<p>
我们可以通过 JS 来对广告进行重新排序. 参考代码如下:
</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;div id=&quot;ads&quot; style=&quot;display:none;&quot;&gt;
	&lt;a href=&quot;#&quot;&gt;&lt;img src=&quot;ad-125x125.png&quot; alt=&quot;广告 1&quot; width=&quot;125&quot; height=&quot;125&quot; /&gt;&lt;/a&gt;
	&lt;a href=&quot;#&quot;&gt;&lt;img src=&quot;ad-125x125.png&quot; alt=&quot;广告 2&quot; width=&quot;125&quot; height=&quot;125&quot; /&gt;&lt;/a&gt;
	&lt;a href=&quot;#&quot;&gt;&lt;img src=&quot;ad-125x125.png&quot; alt=&quot;广告 3&quot; width=&quot;125&quot; height=&quot;125&quot; /&gt;&lt;/a&gt;
	&lt;a href=&quot;#&quot;&gt;&lt;img src=&quot;ad-125x125.png&quot; alt=&quot;广告 4&quot; width=&quot;125&quot; height=&quot;125&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;div id=&quot;random-ads&quot; style=&quot;display:none;&quot;&gt;
&lt;/div&gt;
&nbsp;
&lt;script type=&quot;text/javascript&quot;&gt;
//&lt;![CDATA[
&nbsp;
var source = document.getElementById('ads');
var target = document.getElementById('random-ads');
var ads = source.getElementsByTagName('a');
&nbsp;
// 下标数组
var arr = new Array();
for(var i=0; i&lt;ads.length; i++) {
	arr[i] = i;
}
&nbsp;
// 随机排序
function randomSort(a, b){
	var tmp = parseInt((Math.random() + 0.5), 10);
	return tmp ? a-b : b-a;
}
&nbsp;
// 将老的广告区的节点随机插放到新的广告区
arr.sort(randomSort);
for(var i=0; i&lt;arr.length; i++) {
	target.appendChild(ads[arr[i]].cloneNode(true));
}
&nbsp;
// 显示新的广告区和移除老的广告区
source.parentNode.removeChild(source);
target.style.display = 'block';
&nbsp;
//]]&gt;
&lt;/script&gt;</pre></div></div>

<p>
如果有如同方法 1 那样的扩展需求, 将空广告位显示在最后, 且显示广告招租链接, 该如何处理? 这个当作课后习题吧...</p>
 <img src="http://www.neoease.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=1364" width="1" height="1" style="display: none;" /><ul>
		<li><a href="http://www.neoease.com/update-feedsky-subscribe-number-everyday/" rel="bookmark">每日同步 Feedsky 订阅数</a><!-- (4.5)--></li>
		<li><a href="http://www.neoease.com/show-diff-between-crawlers-and-guests/" rel="bookmark">向访客和爬虫显示不同的内容</a><!-- (4.3)--></li>
		<li><a href="http://www.neoease.com/spliting-blogroll-to-2-columns-03/" rel="bookmark">将 Blogroll 分为两栏 (3)</a><!-- (4.2)--></li>
		<li><a href="http://www.neoease.com/output-html-in-javascript/" rel="bookmark">用 JavaScript 输出页面代码</a><!-- (3.3)--></li>
		<li><a href="http://www.neoease.com/jquery-slideup-and-slidedown/" rel="bookmark">jQuery 的 slideUp 和 slideDown 动画</a><!-- (3.3)--></li>
	</ul>
<p><hr color="#E0E0E0" />
<div>
Copyright &copy; 2007-2010 NeoEase. All rights reserved.<br />
<a href="http://www.neoease.com" target="_blank">NeoEase.com</a> | <a target="_blank" href="http://twitter.com/mg12" rel="nofollow">Twitter</a> | <a target="_blank" href="http://weibo.com/mg12" rel="nofollow">新浪微博</a> | <a target="_blank" href="http://www.douban.com/people/mg12" rel="nofollow">豆瓣</a> | <a target="_blank" href="http://www.zhihu.com/people/mg12" rel="nofollow">知乎</a>
</div></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neoease.com/random-advertisements/feed/</wfw:commentRss>
		<slash:comments>25</slash:comments>
		</item>
		<item>
		<title>谷歌音乐搜索栏的提示功能</title>
		<link>http://www.neoease.com/search-tip-of-google-cn-music/</link>
		<comments>http://www.neoease.com/search-tip-of-google-cn-music/#comments</comments>
		<pubDate>Sun, 04 Jul 2010 14:35:51 +0000</pubDate>
		<dc:creator>mg12</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Bug]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Search]]></category>

		<guid isPermaLink="false">http://www.neoease.com/?p=1355</guid>
		<description><![CDATA[我很喜欢在 google.cn/music 上找 mp3, 因为谷歌音乐在版权方面, 用户体验和搜索功能都做得很好. 但是它的搜索栏提示功能一直存在一个小问题, bug 存在半年以上了吧... 问题描述 在加载页面的时候, 将光标快速定位到搜索栏上, 待页面加载完成, 搜索栏进行初始化后会显示搜索提示. 此时输入的任何内容将成为搜索提示的一部分而不是搜索关键字. 截图如下: 导致原因 搜索栏的 JavaScript 初始化执行在 onload 的时候. 因为页面图片请求多, 完全加载需要 3 秒钟左右, 并且搜索栏的 tabindex 被设为 1, 搜索优先的用户很容易就能遇到. 以下是我根据自己的理解反编译出来的 JS 代码, 页面在 onload 的时候将会执行 m.hint.initHint 方法为搜索框添加提示功能. /** * 为搜索框添加提示功能 * @param searchTip 提示信息 * @param searchBoxId 搜索输入框 ID * @param hideBoxId 关键字隐藏框 [...]<p><hr color="#E0E0E0" />
<div>
Copyright &copy; 2007-2010 NeoEase. All rights reserved.<br />
<a href="http://www.neoease.com" target="_blank">NeoEase.com</a> | <a target="_blank" href="http://twitter.com/mg12" rel="nofollow">Twitter</a> | <a target="_blank" href="http://weibo.com/mg12" rel="nofollow">新浪微博</a> | <a target="_blank" href="http://www.douban.com/people/mg12" rel="nofollow">豆瓣</a> | <a target="_blank" href="http://www.zhihu.com/people/mg12" rel="nofollow">知乎</a>
</div></p>
]]></description>
			<content:encoded><![CDATA[<p>
我很喜欢在 google.cn/music 上找 mp3, 因为<strong>谷歌音乐</strong>在版权方面, 用户体验和搜索功能都做得很好. 但是它的<strong>搜索栏提示功能</strong>一直存在一个小问题, bug 存在半年以上了吧...
</p>
<h3>问题描述</h3>
<p>
在加载页面的时候, 将光标快速定位到搜索栏上, 待页面加载完成, 搜索栏进行初始化后会显示搜索提示. 此时输入的任何内容将成为搜索提示的一部分而不是搜索关键字. 截图如下:
</p>
<p>
<img class="sided" src="http://farm5.static.flickr.com/4076/4760612976_6c990697d7.jpg" alt="谷歌音乐搜索栏的 bug" />
</p>
<p><span id="more-1355"></span></p>
<h3>导致原因</h3>
<p>
搜索栏的 JavaScript 初始化执行在 onload 的时候. 因为页面图片请求多, 完全加载需要 3 秒钟左右, 并且搜索栏的 tabindex 被设为 1, 搜索优先的用户很容易就能遇到.
</p>
<p>
以下是我根据自己的理解反编译出来的 JS 代码, 页面在 onload 的时候将会执行 m.hint.initHint 方法为搜索框添加提示功能.
</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">/**
 * 为搜索框添加提示功能
 * @param searchTip		提示信息
 * @param searchBoxId	搜索输入框 ID
 * @param hideBoxId		关键字隐藏框 ID
 */</span>
m.<span style="color: #660066;">hint</span>.<span style="color: #660066;">initHint</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>searchTip<span style="color: #339933;">,</span> searchBoxId<span style="color: #339933;">,</span> hideBoxId<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #003366; font-weight: bold;">var</span> searchBox <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span>searchBoxId<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #003366; font-weight: bold;">var</span> hideBox <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span>
	<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>searchBox<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>hideBoxId<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			hideBox <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span>hideBoxId<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		l.<span style="color: #660066;">events</span>.<span style="color: #660066;">listen</span><span style="color: #009900;">&#40;</span>searchBox<span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;blur&quot;</span><span style="color: #339933;">,</span> l.<span style="color: #660066;">bind</span><span style="color: #009900;">&#40;</span>m.<span style="color: #660066;">hint</span>.<span style="color: #660066;">onInputBlur</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">,</span> searchBox<span style="color: #339933;">,</span> hideBox<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		l.<span style="color: #660066;">events</span>.<span style="color: #660066;">listen</span><span style="color: #009900;">&#40;</span>searchBox<span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;focus&quot;</span><span style="color: #339933;">,</span> l.<span style="color: #660066;">bind</span><span style="color: #009900;">&#40;</span>m.<span style="color: #660066;">hint</span>.<span style="color: #660066;">onInputFocus</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">,</span> searchBox<span style="color: #339933;">,</span> hideBox<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>hideBox<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			l.<span style="color: #660066;">events</span>.<span style="color: #660066;">listen</span><span style="color: #009900;">&#40;</span>searchBox<span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;change&quot;</span><span style="color: #339933;">,</span> bind<span style="color: #009900;">&#40;</span>m.<span style="color: #660066;">hint</span>.<span style="color: #660066;">onInputChange</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">,</span> searchBox<span style="color: #339933;">,</span> hideBox<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			hideBox.<span style="color: #660066;">value</span> <span style="color: #339933;">=</span> m.<span style="color: #660066;">hint</span>.<span style="color: #660066;">getInputValue</span><span style="color: #009900;">&#40;</span>searchBox<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #006600; font-style: italic;">// 在这里将搜索提示赋给临时变量</span>
		m.<span style="color: #660066;">hint</span>.<span style="color: #660066;">Gh</span><span style="color: #009900;">&#91;</span>searchBox<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> searchTip<span style="color: #339933;">;</span>
		<span style="color: #006600; font-style: italic;">// 如果搜索框存在, 则为搜索框加上临时变量和灰色字的 class</span>
		m.<span style="color: #660066;">hint</span>.<span style="color: #660066;">onInputBlur</span><span style="color: #009900;">&#40;</span>searchBox<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
m.<span style="color: #660066;">hint</span>.<span style="color: #660066;">onInputBlur</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>searchBox<span style="color: #339933;">,</span> hideBox<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	m.<span style="color: #660066;">hint</span>.<span style="color: #660066;">fi</span><span style="color: #009900;">&#40;</span>searchBox<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	hideBox <span style="color: #339933;">&amp;&amp;</span> m.<span style="color: #660066;">hint</span>.<span style="color: #660066;">onInputChange</span><span style="color: #009900;">&#40;</span>searchBox<span style="color: #339933;">,</span> hideBox<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
m.<span style="color: #660066;">hint</span>.<span style="color: #660066;">fi</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>searchBox<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>searchBox<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #003366; font-weight: bold;">var</span> searchTip <span style="color: #339933;">=</span> m.<span style="color: #660066;">hint</span>.<span style="color: #660066;">Gh</span><span style="color: #009900;">&#91;</span>searchBox<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>searchTip <span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span>searchBox.<span style="color: #660066;">value</span>.<span style="color: #660066;">trim</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">==</span><span style="color: #3366CC;">&quot;&quot;</span> <span style="color: #339933;">||</span> searchBox.<span style="color: #660066;">value</span><span style="color: #339933;">==</span>searchTip<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			searchBox.<span style="color: #660066;">setAttribute</span><span style="color: #009900;">&#40;</span>m.<span style="color: #660066;">hint</span>.<span style="color: #660066;">IS_HINT</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;1&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			searchBox.<span style="color: #660066;">className</span> <span style="color: #339933;">+=</span> <span style="color: #3366CC;">&quot; hint&quot;</span><span style="color: #339933;">;</span>
			searchBox.<span style="color: #660066;">value</span> <span style="color: #339933;">=</span> searchTip<span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<h3>解决办法</h3>
<p>
缩短搜索框 DOM 节点加载和 JavaScript 初始化之间的时间. 可以在搜索框加载完成后立刻执行 JS, 反正 Google 自己的产品也不需要 SEO. 当然, 最好在 DOM ready 的时候执行.
</p>
<h3>扩展知识</h3>
<p>
记得我写过一篇文章, 介绍如何在 <a href="http://www.neoease.com/wordpress-searchbox-tip/">WordPress 搜索框添加文字提示</a>. 我的处理办法简单粗暴, 仅以框内关键字来判断是关键字还是提示信息. (所以我的提示信息很长)
</p>
<p>
在分析这个案例的过程中, 我发现 Google 的处理办法很好, 可以借鉴和使用. 它通过隐藏输入框来放置真正的搜索信息, 所以可以实现完全关键字和提示文案的区分.
</p>
<h3>后话</h3>
<p>
这个小问题已经困扰我很久了 (几乎每次遇到), 今天终于忍不住看了一下代码, 希望 Google 的工程师能够看到本文快速解决掉. (修改建议我都给出来了, 还不改也说不过去吧)</p>
 <img src="http://www.neoease.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=1355" width="1" height="1" style="display: none;" /><ul>
		<li><a href="http://www.neoease.com/wordpress-searchbox-tip/" rel="bookmark">WordPress 搜索框添加文字提示</a><!-- (11.9)--></li>
		<li><a href="http://www.neoease.com/wordpress-searchbox-tip-2/" rel="bookmark">WordPress 搜索框添加文字提示 (续)</a><!-- (10.8)--></li>
		<li><a href="http://www.neoease.com/javascript-go-top/" rel="bookmark">用 JavaScript 实现变速回到顶部</a><!-- (8.8)--></li>
		<li><a href="http://www.neoease.com/wordpress-at-reply/" rel="bookmark">WordPress 评论的 @ 回复</a><!-- (7.7)--></li>
		<li><a href="http://www.neoease.com/stoppropagation-and-preventdefault-and-return-false/" rel="bookmark">stopPropagation, preventDefault 和 return false 的区别</a><!-- (7.1)--></li>
	</ul>
<p><hr color="#E0E0E0" />
<div>
Copyright &copy; 2007-2010 NeoEase. All rights reserved.<br />
<a href="http://www.neoease.com" target="_blank">NeoEase.com</a> | <a target="_blank" href="http://twitter.com/mg12" rel="nofollow">Twitter</a> | <a target="_blank" href="http://weibo.com/mg12" rel="nofollow">新浪微博</a> | <a target="_blank" href="http://www.douban.com/people/mg12" rel="nofollow">豆瓣</a> | <a target="_blank" href="http://www.zhihu.com/people/mg12" rel="nofollow">知乎</a>
</div></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neoease.com/search-tip-of-google-cn-music/feed/</wfw:commentRss>
		<slash:comments>31</slash:comments>
		</item>
		<item>
		<title>JavaScript 的 parseInt 取整</title>
		<link>http://www.neoease.com/javascript-get-integer-via-parseint/</link>
		<comments>http://www.neoease.com/javascript-get-integer-via-parseint/#comments</comments>
		<pubDate>Fri, 21 May 2010 13:38:53 +0000</pubDate>
		<dc:creator>mg12</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[parseInt]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.neoease.com/?p=1270</guid>
		<description><![CDATA[JavaScript 是弱类型语言, 为了保证数值的有效性, 在处理数值的时候, 我们可以对数值字符串进行强行转换. 如 parseInt 取整和 parseFloat 取浮点数. Java 也有 Integer.parseInt() 方法, 但是 JavaScript 的 parseInt 处理方式与 Java 等强整型语言不太一样, 所以经常有人因为对这个方法的使用不当而获得异常返回. 下面是一段 Java 代码, 用于将字符串 020 转为整型. public class Test &#123; public static void main&#40;String args&#91;&#93;&#41; throws Exception &#123; String str = &#34;020&#34;; System.out.println&#40;Integer.parseInt&#40;str&#41;&#41;; &#125; &#125; 输出结果是 20 下面是一段 JavaScript 代码, 同样是将字符串 020 转为整型. [...]<p><hr color="#E0E0E0" />
<div>
Copyright &copy; 2007-2010 NeoEase. All rights reserved.<br />
<a href="http://www.neoease.com" target="_blank">NeoEase.com</a> | <a target="_blank" href="http://twitter.com/mg12" rel="nofollow">Twitter</a> | <a target="_blank" href="http://weibo.com/mg12" rel="nofollow">新浪微博</a> | <a target="_blank" href="http://www.douban.com/people/mg12" rel="nofollow">豆瓣</a> | <a target="_blank" href="http://www.zhihu.com/people/mg12" rel="nofollow">知乎</a>
</div></p>
]]></description>
			<content:encoded><![CDATA[<p>
JavaScript 是弱类型语言, 为了保证数值的有效性, 在处理数值的时候, 我们可以对数值字符串进行强行转换. 如 <strong>parseInt 取整</strong>和 parseFloat 取浮点数.
</p>
<p>
Java 也有 Integer.parseInt() 方法, 但是 JavaScript 的 parseInt 处理方式与 Java 等强整型语言不太一样, 所以经常有人因为对这个方法的使用不当而获得异常返回.
</p>
<p><span id="more-1270"></span></p>
<p>
下面是一段 Java 代码, 用于将字符串 020 转为整型.
</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Test <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> args<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399;">Exception</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #003399;">String</span> str <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;020&quot;</span><span style="color: #339933;">;</span>
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">Integer</span>.<span style="color: #006633;">parseInt</span><span style="color: #009900;">&#40;</span>str<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>
输出结果是 20
</p>
<p>
下面是一段 JavaScript 代码, 同样是将字符串 020 转为整型.
</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> str <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;020&quot;</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> num <span style="color: #339933;">=</span> parseInt<span style="color: #009900;">&#40;</span>str<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>num<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>
输出结果是 16
</p>
<h3>为什么呢?</h3>
<p>
无论是 Java 还是 JavaScript, parseInt 方法都有两个参数, 第一个参数就是要转换的对象, 第二个参数是进制基数, 可以是 2, 8, 10, 16, 默认以 10 进制处理. 但在 JavaScript 中, 0 开始的数被认为使用 8 进制处理, 0x 的数被认为是用 16 进制来处理. 所以上面的 JavaScript 代码计算错误了.
</p>
<h3>影响大吗?</h3>
<p>
大! 很大! 因为这个经常用于计算价钱, 一旦价格错误, 对用户来说, 这是误导, 而一个好的网站不应该出现这种误导用户的. 下面的 DEMO 中, 没有指定进制. 大家可以在数量框中输入一个以 0 开头的数字, 在点击计算按钮, 算出来的数值将比预想中的小一些, 或者小很多 (如: 8 进制中没有 019 这样的数值, 所以数值变成了 1, 9 被忽略掉).<br />
<a rel="external" href="http://www.neoease.com/tutorials/javascript-parseint-radix/without-radix.html">没有为 parseInt 函数指定进制的 DEMO</a>
</p>
<h3>如何修改?</h3>
<p>
前面说过, 有两个参数, 第二个参数可以指定计算使用的进制.
</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">parseInt<span style="color: #009900;">&#40;</span>num<span style="color: #339933;">,</span> radix<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>
所以我们可以将前面有问题的那段 JavaScript 代码改写为下面的代码.
</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> str <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;020&quot;</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> num <span style="color: #339933;">=</span> parseInt<span style="color: #009900;">&#40;</span>str<span style="color: #339933;">,</span> <span style="color: #CC0000;">10</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>num<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>
这样处理的话, 我们再重写一些前面的 DEMO, 如下:<br />
<a rel="external" href="http://www.neoease.com/tutorials/javascript-parseint-radix/with-radix.html">为 parseInt 函数指定进制为 10 的 DEMO</a>
</p>
<p>记住了, 在 JavaScript 上使用 parseInt 方法时要带上进制参数.</p>
 <img src="http://www.neoease.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=1270" width="1" height="1" style="display: none;" /><ul>
		<li><a href="http://www.neoease.com/javascript-with-statement/" rel="bookmark">关于 JavaScript 的 with 语句</a><!-- (11.7)--></li>
		<li><a href="http://www.neoease.com/wordpress-javascript-l10n/" rel="bookmark">WordPress 的 JavaScript 本地化</a><!-- (9.9)--></li>
		<li><a href="http://www.neoease.com/javascript-namespace/" rel="bookmark">JavaScript 的命名空间</a><!-- (9.2)--></li>
		<li><a href="http://www.neoease.com/string-is-empty/" rel="bookmark">判断 Java 中的空字符串</a><!-- (8.7)--></li>
		<li><a href="http://www.neoease.com/get-cursor-position-with-javascript/" rel="bookmark">通过 JavaScript 获取页面上的鼠标位置</a><!-- (7.5)--></li>
	</ul>
<p><hr color="#E0E0E0" />
<div>
Copyright &copy; 2007-2010 NeoEase. All rights reserved.<br />
<a href="http://www.neoease.com" target="_blank">NeoEase.com</a> | <a target="_blank" href="http://twitter.com/mg12" rel="nofollow">Twitter</a> | <a target="_blank" href="http://weibo.com/mg12" rel="nofollow">新浪微博</a> | <a target="_blank" href="http://www.douban.com/people/mg12" rel="nofollow">豆瓣</a> | <a target="_blank" href="http://www.zhihu.com/people/mg12" rel="nofollow">知乎</a>
</div></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neoease.com/javascript-get-integer-via-parseint/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>关于 JavaScript 的 with 语句</title>
		<link>http://www.neoease.com/javascript-with-statement/</link>
		<comments>http://www.neoease.com/javascript-with-statement/#comments</comments>
		<pubDate>Mon, 17 May 2010 09:58:32 +0000</pubDate>
		<dc:creator>mg12</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Keyword]]></category>
		<category><![CDATA[Statement]]></category>
		<category><![CDATA[with]]></category>

		<guid isPermaLink="false">http://www.neoease.com/?p=1263</guid>
		<description><![CDATA[JavaScript 有个 with 关键字, with 语句的原本用意是为逐级的对象访问提供命名空间式的速写方式. 也就是在指定的代码区域, 直接通过节点名称调用对象. 用过 Java 和 .NET 的同学对包或命名空间的概念应该不会陌生, 正因为有这个概念, 使代码的简洁易读得到了保证. 不知 JavaScript 设计之初是如何定位 with 语句的, 个人觉得它们之间有一定的相似度. 如: apple.banana.candy.dog.egg.fog.god.huh.index = 0; doSomething&#40;apple.banana.candy.dog.egg.fog.god.huh.index&#41;; 利用 with 语句, 可以写为以下代码. with&#40;apple.banana.candy.dog.egg.fog.god.huh&#41; &#123; c = 0; doSomething&#40;index&#41;; &#125; 看起来很美妙, 却存在致命的缺陷. 下面我们来进行一些小测试吧. 1. 在 with 语句内部通过内部变量修改数值 var root = &#123; branch: &#123; node: 1 &#125; &#125;; &#160; [...]<p><hr color="#E0E0E0" />
<div>
Copyright &copy; 2007-2010 NeoEase. All rights reserved.<br />
<a href="http://www.neoease.com" target="_blank">NeoEase.com</a> | <a target="_blank" href="http://twitter.com/mg12" rel="nofollow">Twitter</a> | <a target="_blank" href="http://weibo.com/mg12" rel="nofollow">新浪微博</a> | <a target="_blank" href="http://www.douban.com/people/mg12" rel="nofollow">豆瓣</a> | <a target="_blank" href="http://www.zhihu.com/people/mg12" rel="nofollow">知乎</a>
</div></p>
]]></description>
			<content:encoded><![CDATA[<p>
<strong>JavaScript</strong> 有个 <strong>with</strong> 关键字, with 语句的原本用意是为逐级的对象访问提供命名空间式的速写方式. 也就是在指定的代码区域, 直接通过节点名称调用对象.
</p>
<p>
用过 Java 和 .NET 的同学对包或命名空间的概念应该不会陌生, 正因为有这个概念, 使代码的简洁易读得到了保证. 不知 JavaScript 设计之初是如何定位 with 语句的, 个人觉得它们之间有一定的相似度. 如:
</p>
<p><span id="more-1263"></span></p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">apple.<span style="color: #660066;">banana</span>.<span style="color: #660066;">candy</span>.<span style="color: #660066;">dog</span>.<span style="color: #660066;">egg</span>.<span style="color: #660066;">fog</span>.<span style="color: #660066;">god</span>.<span style="color: #660066;">huh</span>.<span style="color: #660066;">index</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>
doSomething<span style="color: #009900;">&#40;</span>apple.<span style="color: #660066;">banana</span>.<span style="color: #660066;">candy</span>.<span style="color: #660066;">dog</span>.<span style="color: #660066;">egg</span>.<span style="color: #660066;">fog</span>.<span style="color: #660066;">god</span>.<span style="color: #660066;">huh</span>.<span style="color: #660066;">index</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>
利用 with 语句, 可以写为以下代码.
</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">with</span><span style="color: #009900;">&#40;</span>apple.<span style="color: #660066;">banana</span>.<span style="color: #660066;">candy</span>.<span style="color: #660066;">dog</span>.<span style="color: #660066;">egg</span>.<span style="color: #660066;">fog</span>.<span style="color: #660066;">god</span>.<span style="color: #660066;">huh</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	c <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>
	doSomething<span style="color: #009900;">&#40;</span>index<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>
看起来很美妙, 却存在致命的缺陷. 下面我们来进行一些小测试吧.
</p>
<p>
1. 在 with 语句内部通过内部变量修改数值
</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> root <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
	branch<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>
		node<span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000066; font-weight: bold;">with</span><span style="color: #009900;">&#40;</span>root.<span style="color: #660066;">branch</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	node <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>
	<span style="color: #006600; font-style: italic;">// 显示 0, 正确!</span>
	<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>node<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #006600; font-style: italic;">// 显示 0, 正确!</span>
<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>root.<span style="color: #660066;">branch</span>.<span style="color: #660066;">node</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>
2. 在 with 语句内部通过对象节点修改数值
</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> root <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
	branch<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>
		node<span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000066; font-weight: bold;">with</span><span style="color: #009900;">&#40;</span>root.<span style="color: #660066;">branch</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	root.<span style="color: #660066;">branch</span>.<span style="color: #660066;">node</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>
	<span style="color: #006600; font-style: italic;">// 显示 0, 正确!</span>
	<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>node<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #006600; font-style: italic;">// 显示 0, 正确!</span>
<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>root.<span style="color: #660066;">branch</span>.<span style="color: #660066;">node</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>
经过测试 1 和测试 2, 乍看没什么问题, 但是... 请看测试 3.
</p>
<p>
3. 在 with 语句内部通过对象父节点修改数值
</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> root <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
	branch<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>
		node<span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000066; font-weight: bold;">with</span><span style="color: #009900;">&#40;</span>root.<span style="color: #660066;">branch</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	root.<span style="color: #660066;">branch</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
		node<span style="color: #339933;">:</span> <span style="color: #CC0000;">0</span>
	<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
	<span style="color: #006600; font-style: italic;">// 显示 1, 错误!</span>
	<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>node<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #006600; font-style: italic;">// 显示 0, 正确!</span>
<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>root.<span style="color: #660066;">branch</span>.<span style="color: #660066;">node</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>
由上面的测试 3 可知, with 语句内部的节点父节点修改后, 不会同步到节点本身. 也就是说, 不能保证内外数值的一致性. 这是可能成为项目里面隐藏性很高的 bug.<br />
那我们该怎么办呢? 接受那很长的一串逐级访问, 还是另有他法?
</p>
<p>
方法是有的. 我们可以通过别名引用父节点的方式来调用节点对象, 如:
</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> root <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
	branch<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>
		node<span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">var</span> quote <span style="color: #339933;">=</span> root.<span style="color: #660066;">branch</span><span style="color: #339933;">;</span>
quote.<span style="color: #660066;">node</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>
<span style="color: #006600; font-style: italic;">// 显示 0, 正确!</span>
<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>root.<span style="color: #660066;">branch</span>.<span style="color: #660066;">node</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>
我相信很少人会用 with 语句, 也不会有很多人知道这个关键字, 但我觉得这是个有问题的语句, 压根就不应该使用, 所以写个小文记录一下.</p>
 <img src="http://www.neoease.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=1263" width="1" height="1" style="display: none;" /><ul>
		<li><a href="http://www.neoease.com/wordpress-javascript-l10n/" rel="bookmark">WordPress 的 JavaScript 本地化</a><!-- (8.5)--></li>
		<li><a href="http://www.neoease.com/javascript-get-integer-via-parseint/" rel="bookmark">JavaScript 的 parseInt 取整</a><!-- (7)--></li>
		<li><a href="http://www.neoease.com/javascript-namespace/" rel="bookmark">JavaScript 的命名空间</a><!-- (5.9)--></li>
		<li><a href="http://www.neoease.com/javascript-magnifier-get-multiple-and-viewport-size/" rel="bookmark">JavaScript 放大镜 - 放大倍率和视窗尺寸</a><!-- (4.5)--></li>
		<li><a href="http://www.neoease.com/get-cursor-position-with-javascript/" rel="bookmark">通过 JavaScript 获取页面上的鼠标位置</a><!-- (4.5)--></li>
	</ul>
<p><hr color="#E0E0E0" />
<div>
Copyright &copy; 2007-2010 NeoEase. All rights reserved.<br />
<a href="http://www.neoease.com" target="_blank">NeoEase.com</a> | <a target="_blank" href="http://twitter.com/mg12" rel="nofollow">Twitter</a> | <a target="_blank" href="http://weibo.com/mg12" rel="nofollow">新浪微博</a> | <a target="_blank" href="http://www.douban.com/people/mg12" rel="nofollow">豆瓣</a> | <a target="_blank" href="http://www.zhihu.com/people/mg12" rel="nofollow">知乎</a>
</div></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neoease.com/javascript-with-statement/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>JavaScript 放大镜 - 放大倍率和视窗尺寸</title>
		<link>http://www.neoease.com/javascript-magnifier-get-multiple-and-viewport-size/</link>
		<comments>http://www.neoease.com/javascript-magnifier-get-multiple-and-viewport-size/#comments</comments>
		<pubDate>Sun, 16 May 2010 16:48:01 +0000</pubDate>
		<dc:creator>mg12</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Glass]]></category>
		<category><![CDATA[Magnifier]]></category>
		<category><![CDATA[Multiple]]></category>
		<category><![CDATA[Thumb]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Viewport]]></category>
		<category><![CDATA[Zoom]]></category>

		<guid isPermaLink="false">http://www.neoease.com/?p=1254</guid>
		<description><![CDATA[对JavaScript 放大镜来说, 计算倍率必不可少. 一个完整的放大镜结构里, 与倍率扯上关系的一共有 4 个对象, 原图, 缩略图, 镜片和视窗. 镜片在缩略图上的覆盖位置, 其实就是视窗对原图的部分展示, 所以它们之间有如下关系. 倍率 = 原图/缩略图 = 视窗/镜片 倍率一般大于等于 1, 因为原图一般都不会小于缩略图. 一旦倍率小于 1, 则将倍率设为 1. 因为缩略图和原图的尺寸是不可变的, 所以我们通过它们来获得倍率. /** * 获取放大镜放大倍数 * @param thumb 缩略图对象 * @param glass 镜片对象 * @return 放大镜放大倍数 */ function getMultiple&#40;thumb, glass&#41; &#123; var multiple = &#123; horizontal:0, vertical:0 &#125;; &#160; var [...]<p><hr color="#E0E0E0" />
<div>
Copyright &copy; 2007-2010 NeoEase. All rights reserved.<br />
<a href="http://www.neoease.com" target="_blank">NeoEase.com</a> | <a target="_blank" href="http://twitter.com/mg12" rel="nofollow">Twitter</a> | <a target="_blank" href="http://weibo.com/mg12" rel="nofollow">新浪微博</a> | <a target="_blank" href="http://www.douban.com/people/mg12" rel="nofollow">豆瓣</a> | <a target="_blank" href="http://www.zhihu.com/people/mg12" rel="nofollow">知乎</a>
</div></p>
]]></description>
			<content:encoded><![CDATA[<p>
对<strong>JavaScript 放大镜</strong>来说, <strong>计算倍率</strong>必不可少.<br />
一个完整的放大镜结构里, 与倍率扯上关系的一共有 4 个对象, 原图, 缩略图, 镜片和视窗. 镜片在缩略图上的覆盖位置, 其实就是视窗对原图的部分展示, 所以它们之间有如下关系.<br />
<em>倍率 = 原图/缩略图 = 视窗/镜片</em>
</p>
<p>
<img class="sided" src="http://farm2.static.flickr.com/1193/4612139638_4893289779_o.jpg" alt="javaScript,magnifier,multiple,viewport,glass,thumb" />
</p>
<p>
倍率一般大于等于 1, 因为原图一般都不会小于缩略图. 一旦倍率小于 1, 则将倍率设为 1.<br />
因为缩略图和原图的尺寸是不可变的, 所以我们通过它们来获得倍率.
</p>
<p><span id="more-1254"></span></p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">/**
 * 获取放大镜放大倍数
 * @param thumb		缩略图对象
 * @param glass		镜片对象
 * @return 			放大镜放大倍数
 */</span>
<span style="color: #003366; font-weight: bold;">function</span> getMultiple<span style="color: #009900;">&#40;</span>thumb<span style="color: #339933;">,</span> glass<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #003366; font-weight: bold;">var</span> multiple <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
		horizontal<span style="color: #339933;">:</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span>
		vertical<span style="color: #339933;">:</span><span style="color: #CC0000;">0</span>
	<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #003366; font-weight: bold;">var</span> thumbSize <span style="color: #339933;">=</span> getSize<span style="color: #009900;">&#40;</span>thumb<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #003366; font-weight: bold;">var</span> imageSize <span style="color: #339933;">=</span> getImageSize<span style="color: #009900;">&#40;</span>image<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	multiple.<span style="color: #660066;">horizontal</span> <span style="color: #339933;">=</span> imageSize.<span style="color: #660066;">width</span> <span style="color: #339933;">/</span> thumbSize.<span style="color: #660066;">width</span><span style="color: #339933;">;</span>
	<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>multiple.<span style="color: #660066;">horizontal</span> <span style="color: #339933;">&lt;=</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		multiple.<span style="color: #660066;">horizontal</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	multiple.<span style="color: #660066;">vertical</span> <span style="color: #339933;">=</span> imageSize.<span style="color: #660066;">height</span> <span style="color: #339933;">/</span> thumbSize.<span style="color: #660066;">height</span><span style="color: #339933;">;</span>
	<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>multiple.<span style="color: #660066;">vertical</span> <span style="color: #339933;">&lt;=</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		multiple.<span style="color: #660066;">vertical</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000066; font-weight: bold;">return</span> multiple<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>
原图和缩略图是固定的. 而为了统一视觉感官和防止破页, 我们一般也会指定视窗的尺寸, 所以镜片的尺寸是根据其他几个对象计算出来的.<br />
<em>镜片 = 缩略图x视窗/原图 = 缩略图/倍率</em>
</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">/**
 * 加载镜片的样式
 * @param viewportSize	视窗尺寸
 * @param multiple		倍率
 * @param glass			镜片对象
 */</span>
<span style="color: #003366; font-weight: bold;">function</span> loadGlassStyle<span style="color: #009900;">&#40;</span>viewportSize<span style="color: #339933;">,</span> multiple<span style="color: #339933;">,</span> glass<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	glass.<span style="color: #660066;">style</span>.<span style="color: #660066;">width</span> <span style="color: #339933;">=</span> round<span style="color: #009900;">&#40;</span>viewportSize.<span style="color: #660066;">width</span> <span style="color: #339933;">/</span> multiple.<span style="color: #660066;">horizontal</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">'px'</span><span style="color: #339933;">;</span>
	glass.<span style="color: #660066;">style</span>.<span style="color: #660066;">height</span> <span style="color: #339933;">=</span> round<span style="color: #009900;">&#40;</span>viewportSize.<span style="color: #660066;">height</span> <span style="color: #339933;">/</span> multiple.<span style="color: #660066;">vertical</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">'px'</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>
如果定义的视窗的宽或高比原图还要小, 那该如何显示?<br />
需要改变视窗的尺寸. 假设原图是 240x180, 视窗原定尺寸是 200x200. 视窗尺寸随之改变为 200x180. 此时镜片的尺寸仍须与视窗成正比.
</p>
<p>
<img class="sided" src="http://farm2.static.flickr.com/1170/4612139792_9f6fa0fb8a_o.jpg" alt="javaScript,magnifier,multiple,viewport,glass,thumb" />
</p>
<p>
如果倍率小于 1, 又该如何显示?<br />
将倍率设为 1, 镜片覆盖整个缩略图, 显示整个原图为视窗内容; 或者不作操作 (禁止放大镜效果).
</p>
<p>
<img class="sided" src="http://farm5.static.flickr.com/4018/4611527877_df58668fd5_o.jpg" alt="javaScript,magnifier,multiple,viewport,glass,thumb" />
</p>
<p>
下面的代码用于获取视窗的尺寸.
</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">/**
 * 返回视窗尺寸
 * @param multiple		倍率
 * @param image			原图对象
 * @return				视窗尺寸
 */</span>
getViewportSize<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>multiple<span style="color: #339933;">,</span> image<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #003366; font-weight: bold;">var</span> dimension <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
		width<span style="color: #339933;">:</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span>
		height<span style="color: #339933;">:</span><span style="color: #CC0000;">0</span>
	<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #006600; font-style: italic;">// 如果倍率小于 1 或者视窗比原图还宽, 宽度设为跟原图一致, 否则去设定宽度</span>
	<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>multiple.<span style="color: #660066;">horizontal</span> <span style="color: #339933;">&lt;=</span> <span style="color: #CC0000;">1</span> <span style="color: #339933;">||</span> config.<span style="color: #660066;">viewportSize</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&gt;</span> image.<span style="color: #660066;">width</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		dimension.<span style="color: #660066;">width</span> <span style="color: #339933;">=</span> image.<span style="color: #660066;">width</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
		dimension.<span style="color: #660066;">width</span> <span style="color: #339933;">=</span> config.<span style="color: #660066;">viewportSize</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #006600; font-style: italic;">// 如果倍率小于 1 或者视窗比原图还高, 高度设为跟原图一致, 否则去设定高度</span>
	<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>multiple.<span style="color: #660066;">vertical</span> <span style="color: #339933;">&lt;=</span> <span style="color: #CC0000;">1</span> <span style="color: #339933;">||</span> config.<span style="color: #660066;">viewportSize</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&gt;</span> image.<span style="color: #660066;">height</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		dimension.<span style="color: #660066;">height</span> <span style="color: #339933;">=</span> image.<span style="color: #660066;">height</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
		dimension.<span style="color: #660066;">height</span> <span style="color: #339933;">=</span> config.<span style="color: #660066;">viewportSize</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000066; font-weight: bold;">return</span> dimension<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>
上节<a href="http://www.neoease.com/javascript-magnifier-move-glass/">《JavaScript 放大镜- 移动镜片》</a>我们实现了镜片在缩略图上的移动效果, 并留下习题:"当镜片带边框时, 如何保证边框不影响镜片移动时的精确度?"<br />
为了防止镜片受边框影响偏移, 可以通过为镜片对象设定与边框宽度一样的负 margin 值来消除偏移.
</p>
<p>
本节没有 DEMO, 但对后面几讲来说十分重要, 请同学们搞清楚正常和异常情况下的比例换算.<br />
同样留个课后思考题, 本文的代码中出现了 round 方法, 这是一个四舍五入取整方法, 如果要你自己实现这个功能, 你会如何处理? (提示: 可参考计算机图形学关于线条走样的处理方法)</p>
 <img src="http://www.neoease.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=1254" width="1" height="1" style="display: none;" /><ul>
		<li><a href="http://www.neoease.com/javascript-magnifier-move-glass/" rel="bookmark">JavaScript 放大镜 - 移动镜片</a><!-- (30.8)--></li>
		<li><a href="http://www.neoease.com/javascript-go-top/" rel="bookmark">用 JavaScript 实现变速回到顶部</a><!-- (8.5)--></li>
		<li><a href="http://www.neoease.com/get-cursor-position-with-javascript/" rel="bookmark">通过 JavaScript 获取页面上的鼠标位置</a><!-- (8)--></li>
		<li><a href="http://www.neoease.com/javascript-namespace/" rel="bookmark">JavaScript 的命名空间</a><!-- (6.5)--></li>
		<li><a href="http://www.neoease.com/wordpress-thumb-trick/" rel="bookmark">巧用 WordPress 缩略图</a><!-- (6.2)--></li>
	</ul>
<p><hr color="#E0E0E0" />
<div>
Copyright &copy; 2007-2010 NeoEase. All rights reserved.<br />
<a href="http://www.neoease.com" target="_blank">NeoEase.com</a> | <a target="_blank" href="http://twitter.com/mg12" rel="nofollow">Twitter</a> | <a target="_blank" href="http://weibo.com/mg12" rel="nofollow">新浪微博</a> | <a target="_blank" href="http://www.douban.com/people/mg12" rel="nofollow">豆瓣</a> | <a target="_blank" href="http://www.zhihu.com/people/mg12" rel="nofollow">知乎</a>
</div></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neoease.com/javascript-magnifier-get-multiple-and-viewport-size/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>通过 JavaScript 获取页面上的鼠标位置</title>
		<link>http://www.neoease.com/get-cursor-position-with-javascript/</link>
		<comments>http://www.neoease.com/get-cursor-position-with-javascript/#comments</comments>
		<pubDate>Wed, 12 May 2010 12:14:22 +0000</pubDate>
		<dc:creator>mg12</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.neoease.com/?p=1241</guid>
		<description><![CDATA[用 JS 计算鼠标在页面上的位置并非难事, 只要把握好各浏览器的区别就可以轻易算出鼠标位置. (这是 DEMO) 视窗 (浏览器可视窗口) 就像是页面上的掩板开了一个洞. 滚动条可以改变页面和视窗之间的偏移量, 从而可以通过视窗看到页面的各个位置. 鼠标在页面上的位置 = 页面和视窗之间的偏移量 + 鼠标在视窗中的位置 右图中的 cursorX 和 cursorY 分别是鼠标在视窗中的横向和纵向位置, scrollY 是页面和视窗之间的纵向距离. 当然, 当视窗宽度小于页面宽度的时候, 还会存在 scrollX. 那么鼠标在页面上的位置就是: (scrollX+cursorX, scrollY+cursorY) IE 以外的浏览器 (本人测试过 Firefox 3.6, Opera 10.10, Chrome 4.1 和 Safari 4.0.4) 均可以通过 pageXOffset 和 pageYOffset 来获取页面和视窗间的横纵距离. 但 IE (本人测试过 IE6, IE7, IE8) 只能通过滚动位移来获取页面和视窗间的距离, 并存在一到两个像素的偏离. [...]<p><hr color="#E0E0E0" />
<div>
Copyright &copy; 2007-2010 NeoEase. All rights reserved.<br />
<a href="http://www.neoease.com" target="_blank">NeoEase.com</a> | <a target="_blank" href="http://twitter.com/mg12" rel="nofollow">Twitter</a> | <a target="_blank" href="http://weibo.com/mg12" rel="nofollow">新浪微博</a> | <a target="_blank" href="http://www.douban.com/people/mg12" rel="nofollow">豆瓣</a> | <a target="_blank" href="http://www.zhihu.com/people/mg12" rel="nofollow">知乎</a>
</div></p>
]]></description>
			<content:encoded><![CDATA[<div class="right inline">
<a href="http://farm2.static.flickr.com/1217/4601193040_f151273096_o.png" onclick="return hs.expand(this);" class="highslide-image"><img class="sided" src="http://farm2.static.flickr.com/1217/4601193040_8d1f8f9d84_m.jpg" alt="image" title="Click to enlarge" /></a>
</div>
<p>
用 JS 计算鼠标在页面上的位置并非难事, 只要把握好各浏览器的区别就可以轻易算出鼠标位置. (<a rel="external" href="http://www.neoease.com/tutorials/cursor-position/">这是 DEMO</a>)
</p>
<p>
视窗 (浏览器可视窗口) 就像是页面上的掩板开了一个洞. 滚动条可以改变页面和视窗之间的偏移量, 从而可以通过视窗看到页面的各个位置.<br />
鼠标在页面上的位置 = 页面和视窗之间的偏移量 + 鼠标在视窗中的位置
</p>
<p>
右图中的 cursorX 和 cursorY 分别是鼠标在视窗中的横向和纵向位置, scrollY 是页面和视窗之间的纵向距离. 当然, 当视窗宽度小于页面宽度的时候, 还会存在 scrollX. 那么鼠标在页面上的位置就是: (scrollX+cursorX, scrollY+cursorY)
</p>
<p>
IE 以外的浏览器 (本人测试过 Firefox 3.6, Opera 10.10, Chrome 4.1 和 Safari 4.0.4) 均可以通过 pageXOffset 和 pageYOffset 来获取页面和视窗间的横纵距离. 但 IE (本人测试过 IE6, IE7, IE8) 只能通过滚动位移来获取页面和视窗间的距离, 并存在一到两个像素的偏离.
</p>
<p><span id="more-1241"></span></p>
<p>
以下是获取鼠标在页面上位置的代码实现. (<a rel="external" href="http://www.neoease.com/tutorials/cursor-position/">这是 DEMO</a>)
</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">/**
 * 获取鼠标在页面上的位置
 * @param ev		触发的事件
 * @return			x:鼠标在页面上的横向位置, y:鼠标在页面上的纵向位置
 */</span>
<span style="color: #003366; font-weight: bold;">function</span> getMousePoint<span style="color: #009900;">&#40;</span>ev<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #006600; font-style: italic;">// 定义鼠标在视窗中的位置</span>
	<span style="color: #003366; font-weight: bold;">var</span> point <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
		x<span style="color: #339933;">:</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span>
		y<span style="color: #339933;">:</span><span style="color: #CC0000;">0</span>
	<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #006600; font-style: italic;">// 如果浏览器支持 pageYOffset, 通过 pageXOffset 和 pageYOffset 获取页面和视窗之间的距离</span>
	<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">typeof</span> window.<span style="color: #660066;">pageYOffset</span> <span style="color: #339933;">!=</span> <span style="color: #3366CC;">'undefined'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		point.<span style="color: #660066;">x</span> <span style="color: #339933;">=</span> window.<span style="color: #660066;">pageXOffset</span><span style="color: #339933;">;</span>
		point.<span style="color: #660066;">y</span> <span style="color: #339933;">=</span> window.<span style="color: #660066;">pageYOffset</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #006600; font-style: italic;">// 如果浏览器支持 compatMode, 并且指定了 DOCTYPE, 通过 documentElement 获取滚动距离作为页面和视窗间的距离</span>
	<span style="color: #006600; font-style: italic;">// IE 中, 当页面指定 DOCTYPE, compatMode 的值是 CSS1Compat, 否则 compatMode 的值是 BackCompat</span>
	<span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">typeof</span> document.<span style="color: #660066;">compatMode</span> <span style="color: #339933;">!=</span> <span style="color: #3366CC;">'undefined'</span> <span style="color: #339933;">&amp;&amp;</span> document.<span style="color: #660066;">compatMode</span> <span style="color: #339933;">!=</span> <span style="color: #3366CC;">'BackCompat'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		point.<span style="color: #660066;">x</span> <span style="color: #339933;">=</span> document.<span style="color: #660066;">documentElement</span>.<span style="color: #660066;">scrollLeft</span><span style="color: #339933;">;</span>
		point.<span style="color: #660066;">y</span> <span style="color: #339933;">=</span> document.<span style="color: #660066;">documentElement</span>.<span style="color: #660066;">scrollTop</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #006600; font-style: italic;">// 如果浏览器支持 document.body, 可以通过 document.body 来获取滚动高度</span>
	<span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">typeof</span> document.<span style="color: #660066;">body</span> <span style="color: #339933;">!=</span> <span style="color: #3366CC;">'undefined'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		point.<span style="color: #660066;">x</span> <span style="color: #339933;">=</span> document.<span style="color: #660066;">body</span>.<span style="color: #660066;">scrollLeft</span><span style="color: #339933;">;</span>
		point.<span style="color: #660066;">y</span> <span style="color: #339933;">=</span> document.<span style="color: #660066;">body</span>.<span style="color: #660066;">scrollTop</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #006600; font-style: italic;">// 加上鼠标在视窗中的位置</span>
	point.<span style="color: #660066;">x</span> <span style="color: #339933;">+=</span> ev.<span style="color: #660066;">clientX</span><span style="color: #339933;">;</span>
	point.<span style="color: #660066;">y</span> <span style="color: #339933;">+=</span> ev.<span style="color: #660066;">clientY</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #006600; font-style: italic;">// 返回鼠标在视窗中的位置</span>
	<span style="color: #000066; font-weight: bold;">return</span> point<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>
记得以前我写过一个<a href="http://www.neoease.com/javascript-go-top/">减速滚动置顶的 JavaScript 方法</a>, 也是通过计算视窗和页面高度来实现的, 其计算方法与本文的方法不同小异, 也可以搬过来用.
</p>
<p>
这几个月来, 专注前端项目的开发, 也算小有收获, 最近我会将一些积累作成文章分享于众. 以此作为铺垫, 由浅入深, 希望可以带出一些有用的内容.</p>
 <img src="http://www.neoease.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=1241" width="1" height="1" style="display: none;" /><ul>
		<li><a href="http://www.neoease.com/javascript-go-top/" rel="bookmark">用 JavaScript 实现变速回到顶部</a><!-- (32.6)--></li>
		<li><a href="http://www.neoease.com/javascript-onload-function/" rel="bookmark">JavaScript 初始化装载方法</a><!-- (10)--></li>
		<li><a href="http://www.neoease.com/dont-depend-on-javascript/" rel="bookmark">请不要过于依赖 JavaScript</a><!-- (9.5)--></li>
		<li><a href="http://www.neoease.com/javascript-namespace/" rel="bookmark">JavaScript 的命名空间</a><!-- (9.4)--></li>
		<li><a href="http://www.neoease.com/stoppropagation-and-preventdefault-and-return-false/" rel="bookmark">stopPropagation, preventDefault 和 return false 的区别</a><!-- (8.9)--></li>
	</ul>
<p><hr color="#E0E0E0" />
<div>
Copyright &copy; 2007-2010 NeoEase. All rights reserved.<br />
<a href="http://www.neoease.com" target="_blank">NeoEase.com</a> | <a target="_blank" href="http://twitter.com/mg12" rel="nofollow">Twitter</a> | <a target="_blank" href="http://weibo.com/mg12" rel="nofollow">新浪微博</a> | <a target="_blank" href="http://www.douban.com/people/mg12" rel="nofollow">豆瓣</a> | <a target="_blank" href="http://www.zhihu.com/people/mg12" rel="nofollow">知乎</a>
</div></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neoease.com/get-cursor-position-with-javascript/feed/</wfw:commentRss>
		<slash:comments>30</slash:comments>
		</item>
		<item>
		<title>Lazy Load, 延迟加载图片的 jQuery 插件</title>
		<link>http://www.neoease.com/lazy-load-jquery-plugin-delay-load-image/</link>
		<comments>http://www.neoease.com/lazy-load-jquery-plugin-delay-load-image/#comments</comments>
		<pubDate>Sun, 31 Jan 2010 07:40:14 +0000</pubDate>
		<dc:creator>mg12</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Image]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Plugins]]></category>
		<category><![CDATA[Translation]]></category>

		<guid isPermaLink="false">http://www.neoease.com/?p=1166</guid>
		<description><![CDATA[本文翻译自 Lazy Load Plugin for jQuery, 介绍一个 jQuery 插件, 它提供懒汉式加载页面图片的功能. Lazy Load 是一个用 JavaScript 编写的 jQuery 插件. 它可以延迟加载长页面中的图片. 在浏览器可视区域外的图片不会被载入, 直到用户将页面滚动到它们所在的位置. 这与图片预加载的处理方式正好是相反的. 在包含很多大图片长页面中延迟加载图片可以加快页面加载速度. 浏览器将会在加载可见图片之后即进入就绪状态. 在某些情况下还可以帮助降低服务器负担. Lazy Load 灵感来自 Matt Mlinac 制作的 YUI ImageLoader 工具箱. 这是演示页面. 怎样使用? Lazy Load 依赖于 jQuery. 请将下列代码加入页面 head 区域: &#60;script src=&#34;jquery.js&#34; type=&#34;text/javascript&#34;&#62;&#60;/script&#62; &#60;script src=&#34;jquery.lazyload.js&#34; type=&#34;text/javascript&#34;&#62;&#60;/script&#62; 并且在你的执行代码中加入下面语句: $&#40;&#34;http://www.appelsiini.net/projects/lazyload/img&#34;&#41;.lazyload&#40;&#41;; 这将使 id="http://www.appelsiini.net/projects/lazyload/img" 区域下的图片将被延迟加载. 设置敏感度 插件提供了 [...]<p><hr color="#E0E0E0" />
<div>
Copyright &copy; 2007-2010 NeoEase. All rights reserved.<br />
<a href="http://www.neoease.com" target="_blank">NeoEase.com</a> | <a target="_blank" href="http://twitter.com/mg12" rel="nofollow">Twitter</a> | <a target="_blank" href="http://weibo.com/mg12" rel="nofollow">新浪微博</a> | <a target="_blank" href="http://www.douban.com/people/mg12" rel="nofollow">豆瓣</a> | <a target="_blank" href="http://www.zhihu.com/people/mg12" rel="nofollow">知乎</a>
</div></p>
]]></description>
			<content:encoded><![CDATA[<blockquote><p>
本文翻译自 <a rel="external" href="http://www.appelsiini.net/projects/lazyload">Lazy Load Plugin for jQuery</a>, 介绍一个 jQuery 插件, 它提供懒汉式加载页面图片的功能.
</p></blockquote>
<p>
<strong>Lazy Load</strong> 是一个用 JavaScript 编写的 jQuery 插件. 它可以<strong>延迟加载长页面中的图片</strong>. 在浏览器可视区域外的图片不会被载入, 直到用户将页面滚动到它们所在的位置. 这与图片预加载的处理方式正好是相反的.
</p>
<p>
在包含很多大图片长页面中延迟加载图片可以加快页面加载速度. 浏览器将会在加载可见图片之后即进入就绪状态. 在某些情况下还可以帮助降低服务器负担.
</p>
<p><span id="more-1166"></span></p>
<p>
Lazy Load 灵感来自 Matt Mlinac 制作的 <a rel="external" href="http://developer.yahoo.com/yui/imageloader/">YUI ImageLoader</a> 工具箱. 这是<a rel="nofollow external" href="http://www.appelsiini.net/projects/lazyload/enabled.html">演示页面</a>.
</p>
<h3>怎样使用?</h3>
<p>
Lazy Load 依赖于 <a rel="external" href="http://jquery.com/">jQuery</a>. 请将下列代码加入页面 <code>head</code> 区域:
</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>script src<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;jquery.js&quot;</span> type<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;text/javascript&quot;</span><span style="color: #339933;">&gt;&lt;/</span>script<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>script src<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;jquery.lazyload.js&quot;</span> type<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;text/javascript&quot;</span><span style="color: #339933;">&gt;&lt;/</span>script<span style="color: #339933;">&gt;</span></pre></div></div>

<p>
并且在你的执行代码中加入下面语句:
</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;http://www.appelsiini.net/projects/lazyload/img&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">lazyload</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>
这将使 id="http://www.appelsiini.net/projects/lazyload/img" 区域下的图片将被延迟加载.
</p>
<h3>设置敏感度</h3>
<p>
插件提供了 <code>threshold</code> 选项, 可以通过设置临界值 (触发加载处到图片的距离) 来控制图片的加载. 默认值为 0 (到达图片边界的时候加载).
</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;http://www.appelsiini.net/projects/lazyload/img&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">lazyload</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span> threshold <span style="color: #339933;">:</span> <span style="color: #CC0000;">200</span> <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>
将临界值定为 200, 当可视区域离图片还有 200 个象素的时候开始加载图片. (这一句原文的字面意思和本人理解不一致, 原文: Setting threshold to 200 causes image to load 200 pixels before it is visible.)
</p>
<h3>占位图片</h3>
<p>
你还可以设定一个占位图片并定义事件来触发加载动作. 这时需要为占位图片设定一个 URL 地址. 透明, 灰色和白色的 1x1 象素的图片已经包含在插件里面.
</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;img&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">lazyload</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span> placeholder <span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;img/grey.gif&quot;</span> <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<h3>事件触发加载</h3>
<p>
事件可以是任何 jQuery 时间, 如: <code>click</code> 和 <code>mouseover</code>. 你还可以使用自定义的事件, 如: <code>sporty</code> 和 <code>foobar</code>. 默认情况下处于等待状态, 直到用户滚动到窗口上图片所在位置. 在灰色占位图片被点击之前阻止加载图片, 你可以这样做:
</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;img&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">lazyload</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
	placeholder <span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;img/grey.gif&quot;</span><span style="color: #339933;">,</span>
	event <span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;click&quot;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<h3>使用特效</h3>
<p>
当图片完全加载的时候, 插件默认地使用 <code><a rel="nofollow external" href="http://docs.jquery.com/Effects/show">show()</a></code> 方法来将图显示出来. 其实你可以使用任何你想用的特效来处理. 下面的代码使用 <code>FadeIn</code> 效果. 这是<a rel="nofollow external" href="http://www.appelsiini.net/projects/lazyload/enabled_fadein.html">演示页面</a>.
</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;img&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">lazyload</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span> 
	placeholder <span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;img/grey.gif&quot;</span><span style="color: #339933;">,</span>
	effect <span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;fadeIn&quot;</span> 
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<h3>图片在容器里面</h3>
<p>
你可以将插件用在可滚动容器的图片上, 例如带滚动条的 DIV 元素. 你要做的只是将容器定义为 jQuery 对象并作为参数传到初始化方法里面. 这是<a rel="nofollow external" href="http://www.appelsiini.net/projects/lazyload/enabled_container.html">水平滚动演示页面</a>和<a rel="nofollow external" href="http://www.appelsiini.net/projects/lazyload/enabled_wide_container.html">垂直滚动的演示页面</a>.
</p>
<p>
CSS 代码:
</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;"><span style="color: #cc00cc;">#container</span> <span style="color: #00AA00;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">height</span><span style="color: #00AA00;">:</span> <span style="color: #933;">600px</span><span style="color: #00AA00;">;</span>
	<span style="color: #000000; font-weight: bold;">overflow</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">scroll</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span></pre></div></div>

<p>
JavaScript 代码:
</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;img&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">lazyload</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
	 placeholder <span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;img/grey.gif&quot;</span><span style="color: #339933;">,</span>
	 container<span style="color: #339933;">:</span> $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;#container&quot;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<h3>当图片不顺序排列</h3>
<p>
滚动页面的时候, Lazy Load 会循环为加载的图片. 在循环中检测图片是否在可视区域内. 默认情况下在找到第一张不在可见区域的图片时停止循环. 图片被认为是流式分布的, 图片在页面中的次序和 HTML 代码中次序相同. 但是在一些布局中, 这样的假设是不成立的. 不过你可以通过 <code>failurelimit</code> 选项来控制加载行为.
</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;img&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">lazyload</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span> 
	failurelimit <span style="color: #339933;">:</span> <span style="color: #CC0000;">10</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>
将 <code>failurelimit</code> 设为 10 令插件找到 10 个不在可见区域的图片是才停止搜索. 如果你有一个猥琐的布局, 请把这个参数设高一点.
</p>
<h3>延迟加载图片</h3>
<p>
Lazy Load 插件的一个不完整的功能, 但是这也能用来实现图片的延迟加载. 下面的代码实现了页面加载完成后再加载. 页面加载完成 5 秒后, 指定区域内的图片会自动进行加载. 这是<a rel="nofollow external" href="http://www.appelsiini.net/projects/lazyload/enabled_timeout.html">延迟加载演示页面</a>.
</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">$<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;img:below-the-fold&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">lazyload</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
		placeholder <span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;img/grey.gif&quot;</span><span style="color: #339933;">,</span> 
		event <span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;sporty&quot;</span> 
	<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
$<span style="color: #009900;">&#40;</span>window<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">bind</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;load&quot;</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
	<span style="color: #003366; font-weight: bold;">var</span> timeout <span style="color: #339933;">=</span> setTimeout<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;img&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">trigger</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;sporty&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">5000</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<h3>下载插件</h3>
<p>
最新版本: <a rel="nofollow external" href="http://www.appelsiini.net/download/jquery.lazyload.js">源代码</a>, <a rel="nofollow external" href="http://www.appelsiini.net/download/jquery.lazyload.mini.js">压缩的代码</a>, <a rel="nofollow external" href="http://www.appelsiini.net/download/jquery.lazyload.pack.js">打包的代码</a>
</p>
<h3>已知问题</h3>
<p>
由于 webkit 的 bug <a rel="nofollow external" href="http://bugs.webkit.org/show_bug.cgi?id=6656">#6656</a>, Lazy Load 在 Safari 和 Chrome 中无法使用. 它会立即为你加载所有你愿意和不愿意被载入的图片.
</p>
<p>
貌似 jQuery 1.3.x 令插件在 IE 中失效了. 所有图片将在后台被加载即使它们不应该被加载. 作者正在为解决这个问题而努力, 在此期间只能停留在 jQuery 1.2.6 中使用该插件.
</p>
<p>
还有, 如果你使用 <a rel="nofollow external" href="http://haveamint.com/">Mint</a>, 请将 mint 标签加在页面头部, 如果把 mint 标签加到页面结尾会干扰到 Lazy Load 插件. 这是一个相当罕见的问题, 如果有人找到解决办法请联系作者.</p>
 <img src="http://www.neoease.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=1166" width="1" height="1" style="display: none;" /><ul>
		<li><a href="http://www.neoease.com/wordpress-menubar-6/" rel="bookmark">jQuery 导航菜单</a><!-- (11.9)--></li>
		<li><a href="http://www.neoease.com/jquery-slideup-and-slidedown/" rel="bookmark">jQuery 的 slideUp 和 slideDown 动画</a><!-- (11.2)--></li>
		<li><a href="http://www.neoease.com/wordpress-searchbox-tip/" rel="bookmark">WordPress 搜索框添加文字提示</a><!-- (7.6)--></li>
		<li><a href="http://www.neoease.com/web-gallery-tool-compare-highslide-js-vs-lightbox-2-vs-fancybox/" rel="bookmark">网页图片展示工具 - Highslide JS, Lightbox 2, Fancybox 比较</a><!-- (6)--></li>
		<li><a href="http://www.neoease.com/lavalamp-for-wordpress-users/" rel="bookmark">在主题中添加 LavaLamp 菜单效果</a><!-- (5.3)--></li>
	</ul>
<p><hr color="#E0E0E0" />
<div>
Copyright &copy; 2007-2010 NeoEase. All rights reserved.<br />
<a href="http://www.neoease.com" target="_blank">NeoEase.com</a> | <a target="_blank" href="http://twitter.com/mg12" rel="nofollow">Twitter</a> | <a target="_blank" href="http://weibo.com/mg12" rel="nofollow">新浪微博</a> | <a target="_blank" href="http://www.douban.com/people/mg12" rel="nofollow">豆瓣</a> | <a target="_blank" href="http://www.zhihu.com/people/mg12" rel="nofollow">知乎</a>
</div></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neoease.com/lazy-load-jquery-plugin-delay-load-image/feed/</wfw:commentRss>
		<slash:comments>97</slash:comments>
		</item>
		<item>
		<title>jQuery 导航菜单</title>
		<link>http://www.neoease.com/wordpress-menubar-6/</link>
		<comments>http://www.neoease.com/wordpress-menubar-6/#comments</comments>
		<pubDate>Tue, 15 Dec 2009 10:00:59 +0000</pubDate>
		<dc:creator>mg12</dc:creator>
				<category><![CDATA[WP Trick]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Menu]]></category>
		<category><![CDATA[Theme]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.neoease.com/?p=1062</guid>
		<description><![CDATA[已经写了好几个关于网页导航菜单的教程了, 我都是用原生 JavaScript 敲的代码, 一方面是为了读者更好地去理解其中的原理, 另一方面是让程序可以在不加载任何 framework 的情况下正常运行. 但是时间长了, 我发现越来越多人问我如何将这些效果集成到一些 JS 框架上, 尤其是 jQuery. 所以, 本节我们不探讨更多的效果, 而是将之前的一些菜单效果用 jQuery 来实现出来. 这次要用 jQuery 实现二级导航菜单, 淡出淡入导航菜单, 滚动导航菜单. 借助 jQuery 的强大动画, 我们需要的代码量非常少. 效果演示 二级导航菜单 淡出淡入导航菜单 滚动导航菜单 相关话题: WordPress 导航菜单 二级导航菜单 淡出淡入导航菜单 滚动导航菜单 多级导航菜单 jQuery 导航菜单 点选式导航菜单 (待定话题) 二级导航菜单 鼠标划过显示菜单, 离开隐藏菜单, 没有能比这个跟简单的了. jQuery&#40;document&#41;.ready&#40;function&#40;&#41;&#123; // 找到所有菜单, 并添加显示和隐藏菜单事件 jQuery&#40;'#menus &#62; li'&#41;.each&#40;function&#40;&#41;&#123; jQuery&#40;this&#41;.hover&#40; [...]<p><hr color="#E0E0E0" />
<div>
Copyright &copy; 2007-2010 NeoEase. All rights reserved.<br />
<a href="http://www.neoease.com" target="_blank">NeoEase.com</a> | <a target="_blank" href="http://twitter.com/mg12" rel="nofollow">Twitter</a> | <a target="_blank" href="http://weibo.com/mg12" rel="nofollow">新浪微博</a> | <a target="_blank" href="http://www.douban.com/people/mg12" rel="nofollow">豆瓣</a> | <a target="_blank" href="http://www.zhihu.com/people/mg12" rel="nofollow">知乎</a>
</div></p>
]]></description>
			<content:encoded><![CDATA[<p>
已经写了好几个关于网页导航菜单的教程了, 我都是用原生 JavaScript 敲的代码, 一方面是为了读者更好地去理解其中的原理, 另一方面是让程序可以在不加载任何 framework 的情况下正常运行. 但是时间长了, 我发现越来越多人问我如何将这些效果集成到一些 JS 框架上, 尤其是 jQuery. 所以, 本节我们不探讨更多的效果, 而是将之前的一些菜单效果用 jQuery 来实现出来.
</p>
<p>
这次要用 jQuery 实现二级导航菜单, 淡出淡入导航菜单, 滚动导航菜单. 借助 jQuery 的强大动画, 我们需要的代码量非常少.
</p>
<p>
<strong>效果演示</strong><br />
<a href="http://www.neoease.com/tutorials/wordpress-menubar/wordpress-menubar-6.1/">二级导航菜单</a><br />
<a href="http://www.neoease.com/tutorials/wordpress-menubar/wordpress-menubar-6.2/">淡出淡入导航菜单</a><br />
<a href="http://www.neoease.com/tutorials/wordpress-menubar/wordpress-menubar-6.3/">滚动导航菜单</a>
</p>
<p><span id="more-1062"></span></p>
<h3>相关话题:</h3>
<p>
<a href="http://www.neoease.com/wordpress-menubar/">WordPress 导航菜单</a><br />
<a href="http://www.neoease.com/wordpress-menubar-2/">二级导航菜单</a><br />
<a href="http://www.neoease.com/wordpress-menubar-3/">淡出淡入导航菜单</a><br />
<a href="http://www.neoease.com/wordpress-menubar-4/">滚动导航菜单</a><br />
<a href="http://www.neoease.com/wordpress-menubar-5/">多级导航菜单</a><br />
<strong>jQuery 导航菜单</strong><br />
<em>点选式导航菜单</em> (待定话题)
</p>
<h3>二级导航菜单</h3>
<p>
鼠标划过显示菜单, 离开隐藏菜单, 没有能比这个跟简单的了.
</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">jQuery<span style="color: #009900;">&#40;</span>document<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">ready</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #006600; font-style: italic;">// 找到所有菜单, 并添加显示和隐藏菜单事件</span>
	jQuery<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#menus &gt; li'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">each</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		jQuery<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">hover</span><span style="color: #009900;">&#40;</span>
&nbsp;
			<span style="color: #006600; font-style: italic;">// 显示菜单</span>
			<span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
				jQuery<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">find</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'ul:eq(0)'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">show</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
&nbsp;
			<span style="color: #006600; font-style: italic;">// 隐藏菜单</span>
			<span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
				jQuery<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">find</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'ul:eq(0)'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">hide</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<h3>淡出淡入导航菜单</h3>
<p>
鼠标悬停显示淡入显示菜单, 离开淡出隐藏菜单. 需要加上延迟处理, 原因请参考请参考如下文章.
</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">// 线程 IDs</span>
<span style="color: #003366; font-weight: bold;">var</span> mouseover_tid <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> mouseout_tid <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
jQuery<span style="color: #009900;">&#40;</span>document<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">ready</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	jQuery<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#menus &gt; li'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">each</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>index<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		jQuery<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">hover</span><span style="color: #009900;">&#40;</span>
&nbsp;
			<span style="color: #006600; font-style: italic;">// 取消淡出菜单的线程, 延时淡入菜单</span>
			<span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
				<span style="color: #003366; font-weight: bold;">var</span> _self <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span><span style="color: #339933;">;</span>
				clearTimeout<span style="color: #009900;">&#40;</span>mouseout_tid<span style="color: #009900;">&#91;</span>index<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				mouseover_tid<span style="color: #009900;">&#91;</span>index<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> setTimeout<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
					jQuery<span style="color: #009900;">&#40;</span>_self<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">find</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'ul:eq(0)'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">fadeIn</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">200</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">400</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
&nbsp;
			<span style="color: #006600; font-style: italic;">// 取消淡入菜单的线程, 延时淡出菜单</span>
			<span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
				<span style="color: #003366; font-weight: bold;">var</span> _self <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span><span style="color: #339933;">;</span>
				clearTimeout<span style="color: #009900;">&#40;</span>mouseover_tid<span style="color: #009900;">&#91;</span>index<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				mouseout_tid<span style="color: #009900;">&#91;</span>index<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> setTimeout<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
					jQuery<span style="color: #009900;">&#40;</span>_self<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">find</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'ul:eq(0)'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">fadeOut</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">200</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">400</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<h3>滚动导航菜单</h3>
<p>
鼠标悬停显示滚动展开菜单, 离开滚动卷起菜单. 需要加上延迟处理, 原因同淡出淡入导航菜单的处理.
</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">// 线程 IDs</span>
<span style="color: #003366; font-weight: bold;">var</span> mouseover_tid <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> mouseout_tid <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
jQuery<span style="color: #009900;">&#40;</span>document<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">ready</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	jQuery<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#menus &gt; li'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">each</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>index<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		jQuery<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">hover</span><span style="color: #009900;">&#40;</span>
&nbsp;
			<span style="color: #006600; font-style: italic;">// 取消卷起菜单的线程, 延时展开菜单</span>
			<span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
				<span style="color: #003366; font-weight: bold;">var</span> _self <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span><span style="color: #339933;">;</span>
				clearTimeout<span style="color: #009900;">&#40;</span>mouseout_tid<span style="color: #009900;">&#91;</span>index<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				mouseover_tid<span style="color: #009900;">&#91;</span>index<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> setTimeout<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
					jQuery<span style="color: #009900;">&#40;</span>_self<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">find</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'ul:eq(0)'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">slideDown</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">200</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">400</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
&nbsp;
			<span style="color: #006600; font-style: italic;">// 取消展开菜单的线程, 延时卷起菜单</span>
			<span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
				<span style="color: #003366; font-weight: bold;">var</span> _self <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span><span style="color: #339933;">;</span>
				clearTimeout<span style="color: #009900;">&#40;</span>mouseover_tid<span style="color: #009900;">&#91;</span>index<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				mouseout_tid<span style="color: #009900;">&#91;</span>index<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> setTimeout<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
					jQuery<span style="color: #009900;">&#40;</span>_self<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">find</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'ul:eq(0)'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">slideUp</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">200</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">400</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<h3>演示主题:</h3>
<p>
以 WordPress 自带主题 default 为基础, 仅做学习参考使用, 修改过的文件有 <strong>header.php</strong> 和 <strong>style.css</strong>, 添加了文件 <strong>js/menu.js</strong>
</p>
<p>
<strong>下载主题:</strong> <a href="http://www.neoease.com/tutorials/wordpress-menubar/default_with_menubar_6.zip">default_with_menubar_6.zip</a></p>
<p>
jQuery 的确好用, 这么简便地就把效果做出来了. 撇开别的不错, 这时间就节省不少. 但这绝对是用来忽悠入门者的, 如果想知道其原理, 还是建议看一下之前的文章, 自己敲几个代码, 那样你会收获更多.
</p>
<p><h3>下回预告:</h3>
<p>
下次要不要谢谢 YUI 的实现方法呢? (Prototype 就算了, 我自己实现的代码结构就是模范 Prototype 的.)</p>
 <img src="http://www.neoease.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=1062" width="1" height="1" style="display: none;" /><ul>
		<li><a href="http://www.neoease.com/jquery-slideup-and-slidedown/" rel="bookmark">jQuery 的 slideUp 和 slideDown 动画</a><!-- (33.7)--></li>
		<li><a href="http://www.neoease.com/wordpress-menubar-3/" rel="bookmark">WordPress 淡出淡入导航菜单</a><!-- (16)--></li>
		<li><a href="http://www.neoease.com/wordpress-menubar-4/" rel="bookmark">WordPress 滚动导航菜单</a><!-- (13)--></li>
		<li><a href="http://www.neoease.com/wordpress-menubar/" rel="bookmark">WordPress 导航菜单</a><!-- (11.8)--></li>
		<li><a href="http://www.neoease.com/lazy-load-jquery-plugin-delay-load-image/" rel="bookmark">Lazy Load, 延迟加载图片的 jQuery 插件</a><!-- (10.8)--></li>
	</ul>
<p><hr color="#E0E0E0" />
<div>
Copyright &copy; 2007-2010 NeoEase. All rights reserved.<br />
<a href="http://www.neoease.com" target="_blank">NeoEase.com</a> | <a target="_blank" href="http://twitter.com/mg12" rel="nofollow">Twitter</a> | <a target="_blank" href="http://weibo.com/mg12" rel="nofollow">新浪微博</a> | <a target="_blank" href="http://www.douban.com/people/mg12" rel="nofollow">豆瓣</a> | <a target="_blank" href="http://www.zhihu.com/people/mg12" rel="nofollow">知乎</a>
</div></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neoease.com/wordpress-menubar-6/feed/</wfw:commentRss>
		<slash:comments>28</slash:comments>
		</item>
		<item>
		<title>jQuery 的 slideUp 和 slideDown 动画</title>
		<link>http://www.neoease.com/jquery-slideup-and-slidedown/</link>
		<comments>http://www.neoease.com/jquery-slideup-and-slidedown/#comments</comments>
		<pubDate>Sun, 13 Dec 2009 06:37:21 +0000</pubDate>
		<dc:creator>mg12</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.neoease.com/?p=1057</guid>
		<description><![CDATA[jQuery 可以通过调用 animate 方法添加动画效果, 而且还提供了一套别名, 使用起来很是方便. 其中 slideDown 和 slideUp 两方法的作用是纵向展开和卷起一个页面元素, 被使用的几率很高, 却一直存在一个小问题. 如果目标元素是被外部事件驱动, 当鼠标快速地连续触发外部元素事件, 动画会滞后的反复执行, 相当不美观 (演示页面). 演示页面中有一个按钮, 请用鼠标迅速地来回划过... 不知道本博客的老读者是否记得我写过的一个关于菜单导航的专题, 其中一节讨论的是滚动导航菜单的实现方法 (演示页面), 实现了类似 slideUp 和 slideDown 的效果, 但是不存在上述问题, 因为它的滚动高度是即时计算的, 而 jQuery 作为一个通用框架应用的面很广, 很难做到这一点. 如果用 jQuery 来实现这样的效果, 该如何处理呢? 其实很简单, 只需在触发元素上的事件设置为延迟处理, 即可避免滞后反复执行的问题. 例如: 当鼠标滑过按钮后 0.2 秒, 菜单才会展开, 如果鼠标离开按钮, 展开的处理将被终止. 也就是说, 想要展开菜单鼠标必须有 0.2 秒的事件停留在按钮上, 那么迅速地划过按钮是无法执行展开事件的. 卷起也是如此. 下面我们用代码来解决这个问题. [...]<p><hr color="#E0E0E0" />
<div>
Copyright &copy; 2007-2010 NeoEase. All rights reserved.<br />
<a href="http://www.neoease.com" target="_blank">NeoEase.com</a> | <a target="_blank" href="http://twitter.com/mg12" rel="nofollow">Twitter</a> | <a target="_blank" href="http://weibo.com/mg12" rel="nofollow">新浪微博</a> | <a target="_blank" href="http://www.douban.com/people/mg12" rel="nofollow">豆瓣</a> | <a target="_blank" href="http://www.zhihu.com/people/mg12" rel="nofollow">知乎</a>
</div></p>
]]></description>
			<content:encoded><![CDATA[<p>
jQuery 可以通过调用 <code>animate</code> 方法添加动画效果, 而且还提供了一套别名, 使用起来很是方便. 其中 <code>slideDown</code> 和 <code>slideUp</code> 两方法的作用是纵向展开和卷起一个页面元素, 被使用的几率很高, 却一直存在一个小问题.
</p>
<p>
如果目标元素是被外部事件驱动, 当鼠标快速地连续触发外部元素事件, 动画会滞后的反复执行, 相当不美观 (<a rel="external" href="http://www.neoease.com/tutorials/wordpress-menubar/wordpress-menubar-6.3/slide.html">演示页面</a>). 演示页面中有一个按钮, 请用鼠标迅速地来回划过...
</p>
<p>
不知道本博客的老读者是否记得我写过的一个关于菜单导航的专题, 其中一节讨论的是<a href="http://www.neoease.com/wordpress-menubar-4/">滚动导航菜单的实现方法</a> (<a rel="external" href="http://www.neoease.com/tutorials/wordpress-menubar/wordpress-menubar-4/">演示页面</a>), 实现了类似 slideUp 和 slideDown 的效果, 但是不存在上述问题, 因为它的滚动高度是即时计算的, 而 jQuery 作为一个通用框架应用的面很广, 很难做到这一点.
</p>
<p><span id="more-1057"></span></p>
<p>
<strong>如果用 jQuery 来实现这样的效果, 该如何处理呢?</strong><br />
其实很简单, 只需在触发元素上的事件设置为延迟处理, 即可避免滞后反复执行的问题. 例如: 当鼠标滑过按钮后 0.2 秒, 菜单才会展开, 如果鼠标离开按钮, 展开的处理将被终止. 也就是说, 想要展开菜单鼠标必须有 0.2 秒的事件停留在按钮上, 那么迅速地划过按钮是无法执行展开事件的. 卷起也是如此.
</p>
<p>
<strong>下面我们用代码来解决这个问题.</strong>
</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">// 线程 IDs</span>
<span style="color: #003366; font-weight: bold;">var</span> mouseover_tid <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> mouseout_tid <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
jQuery<span style="color: #009900;">&#40;</span>document<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">ready</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	jQuery<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#menus &gt; li'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">each</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>index<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		jQuery<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">hover</span><span style="color: #009900;">&#40;</span>
&nbsp;
			<span style="color: #006600; font-style: italic;">// 鼠标进入</span>
			<span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
				<span style="color: #003366; font-weight: bold;">var</span> _self <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span><span style="color: #339933;">;</span>
				<span style="color: #006600; font-style: italic;">// 停止卷起事件</span>
				clearTimeout<span style="color: #009900;">&#40;</span>mouseout_tid<span style="color: #009900;">&#91;</span>index<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #006600; font-style: italic;">// 当鼠标进入超过 0.2 秒, 展开菜单, 并记录到线程 ID 中</span>
				mouseover_tid<span style="color: #009900;">&#91;</span>index<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> setTimeout<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
					jQuery<span style="color: #009900;">&#40;</span>_self<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">find</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'ul:eq(0)'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">slideDown</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">200</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">400</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
&nbsp;
			<span style="color: #006600; font-style: italic;">// 鼠标离开</span>
			<span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
				<span style="color: #003366; font-weight: bold;">var</span> _self <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span><span style="color: #339933;">;</span>
				<span style="color: #006600; font-style: italic;">// 停止展开事件</span>
				clearTimeout<span style="color: #009900;">&#40;</span>mouseover_tid<span style="color: #009900;">&#91;</span>index<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #006600; font-style: italic;">// 当鼠标离开超过 0.2 秒, 卷起菜单, 并记录到线程 ID 中</span>
				mouseout_tid<span style="color: #009900;">&#91;</span>index<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> setTimeout<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
					jQuery<span style="color: #009900;">&#40;</span>_self<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">find</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'ul:eq(0)'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">slideUp</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">200</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">400</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>
<strong>看看处理过后的效果.</strong><br />
<a rel="external" href="http://www.neoease.com/tutorials/wordpress-menubar/wordpress-menubar-6.3/">演示页面</a>
</p>
<p>
<strong>注意:</strong> 当鼠标悬停时间小于动画时间时, 同样可能出现反复执行现象, 可以考虑将悬停时间设置比动画时间稍长.
</p>
<p>
嗯, 问题解决了, 但 jQuery 应该还存在其他类似的问题, 如 fadeIn 和 fadeOut (<a rel="external" href="http://www.neoease.com/tutorials/wordpress-menubar/wordpress-menubar-6.3/slide.html">演示页面</a>), 处理方法类似. 如果你选用 jQuery 发现了这类问题, 又不情愿为此重新写一大段代码, 那这应该算是一个不错的解决办法, 而且效果也还行. 现在本博客的 RSS feed 列表也是这样实现的.
</p>
<p>
最后, 拓展一下思维. 不知道你是否见过网页上有这样的效果: 当鼠标在某个元素上停顿一定的时候后页面上某些内容会被激活. 这样的效果处理方法和上面说到的其实是大同小异, 有兴趣的同学可自行尝试.</p>
 <img src="http://www.neoease.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=1057" width="1" height="1" style="display: none;" /><ul>
		<li><a href="http://www.neoease.com/wordpress-menubar-6/" rel="bookmark">jQuery 导航菜单</a><!-- (40.7)--></li>
		<li><a href="http://www.neoease.com/lazy-load-jquery-plugin-delay-load-image/" rel="bookmark">Lazy Load, 延迟加载图片的 jQuery 插件</a><!-- (12.6)--></li>
		<li><a href="http://www.neoease.com/lavalamp-for-wordpress-users/" rel="bookmark">在主题中添加 LavaLamp 菜单效果</a><!-- (8.3)--></li>
		<li><a href="http://www.neoease.com/load-posts-dynamically/" rel="bookmark">WordPress 动态加载文章内容</a><!-- (7.9)--></li>
		<li><a href="http://www.neoease.com/wordpress-menubar-3/" rel="bookmark">WordPress 淡出淡入导航菜单</a><!-- (7.6)--></li>
	</ul>
<p><hr color="#E0E0E0" />
<div>
Copyright &copy; 2007-2010 NeoEase. All rights reserved.<br />
<a href="http://www.neoease.com" target="_blank">NeoEase.com</a> | <a target="_blank" href="http://twitter.com/mg12" rel="nofollow">Twitter</a> | <a target="_blank" href="http://weibo.com/mg12" rel="nofollow">新浪微博</a> | <a target="_blank" href="http://www.douban.com/people/mg12" rel="nofollow">豆瓣</a> | <a target="_blank" href="http://www.zhihu.com/people/mg12" rel="nofollow">知乎</a>
</div></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neoease.com/jquery-slideup-and-slidedown/feed/</wfw:commentRss>
		<slash:comments>35</slash:comments>
		</item>
		<item>
		<title>用 JavaScript 为元素加上 name 属性</title>
		<link>http://www.neoease.com/setting-name-attribute-in-internet-explorer/</link>
		<comments>http://www.neoease.com/setting-name-attribute-in-internet-explorer/#comments</comments>
		<pubDate>Mon, 16 Nov 2009 17:16:57 +0000</pubDate>
		<dc:creator>mg12</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[IE]]></category>

		<guid isPermaLink="false">http://www.neoease.com/?p=1027</guid>
		<description><![CDATA[干前端这行当已经超过一个月了, 每天都会遇到新奇古怪, 甚至离奇的问题. 虽然绝大部分都是一些小问题, 但我觉得还是有必要记录下来. 今天遇到个小问题, 在构建 DOM 时, IE 中不能通过 element.setAttribute('name', _variable); 和 element.name = _variable; 这样的形式来为元素加上 name 属性, 无论是 IE6 还是 IE7. (IE8 是可以的, 但 IE8rc1 不行) 后来我查看了 MSDN, 得到信息如下: Internet Explorer 8 and later can set the NAME attribute at run time on elements dynamically created with the createElement method. To create [...]<p><hr color="#E0E0E0" />
<div>
Copyright &copy; 2007-2010 NeoEase. All rights reserved.<br />
<a href="http://www.neoease.com" target="_blank">NeoEase.com</a> | <a target="_blank" href="http://twitter.com/mg12" rel="nofollow">Twitter</a> | <a target="_blank" href="http://weibo.com/mg12" rel="nofollow">新浪微博</a> | <a target="_blank" href="http://www.douban.com/people/mg12" rel="nofollow">豆瓣</a> | <a target="_blank" href="http://www.zhihu.com/people/mg12" rel="nofollow">知乎</a>
</div></p>
]]></description>
			<content:encoded><![CDATA[<p>
干前端这行当已经超过一个月了, 每天都会遇到新奇古怪, 甚至离奇的问题. 虽然绝大部分都是一些小问题, 但我觉得还是有必要记录下来.
</p>
<p>
今天遇到个小问题, 在构建 DOM 时, IE 中不能通过 <code>element.setAttribute('name', _variable);</code> 和 <code>element.name = _variable;</code> 这样的形式来为元素加上 name 属性, 无论是 IE6 还是 IE7. (IE8 是可以的, 但 IE8rc1 不行)
</p>
<p><span id="more-1027"></span></p>
<p>
后来我查看了 <a href="http://msdn.microsoft.com/en-us/library/ms534184%28VS.85%29.aspx">MSDN</a>, 得到信息如下:
</p>
<blockquote><p>
Internet Explorer 8 and later can set the NAME attribute at run time on elements dynamically created with the createElement method. To create an element with a NAME attribute in earlier versions of Internet Explorer, include the attribute and its value when using the createElement method.
</p></blockquote>
<p>
也就是说, 我们必须通过带属性和值的标签来创建有 name 属性的元素. 为求各浏览器兼容良好, 代码可以这样写:
</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> element <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #006600; font-style: italic;">// IE6/IE7 构建方式</span>
	element <span style="color: #339933;">=</span> document.<span style="color: #660066;">createElement</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'&lt;input name=&quot;radio-button&quot;&gt;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #006600; font-style: italic;">// W3C 构建方式</span>
	element <span style="color: #339933;">=</span> document.<span style="color: #660066;">createElement</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'input'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	element.<span style="color: #000066;">name</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'radio-button'</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #006600; font-style: italic;">// 定义其他属性</span>
element.<span style="color: #660066;">id</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'radio-1'</span>
element.<span style="color: #660066;">type</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'radio'</span><span style="color: #339933;">;</span></pre></div></div>

<p>
以前我是一个 Java 开发人员, 实际工作中 JavaScript 的代码量其实不多, 在自己的一些小应用中往往只是小打小闹, 会 (潜意识地) 避开一些可能出问题的地方, 像跨域使用 AJAX, IE 内存泄漏这样的问题很少回去考虑. 但在转做 UED 后, JavaScript 和交互应用肯定会成为我以后的工作重点, 发生大小各异问题的机会相当多 (现在几乎每天都有), 在解决各种问题的过程中, 我痛并快乐着. 本着不瞎搞, 少折腾的原则, 有必要把这些记录一下, 为自己备份, 更能与人分享.</p>
 <img src="http://www.neoease.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=1027" width="1" height="1" style="display: none;" /><ul>
		<li><a href="http://www.neoease.com/ie6-must-die/" rel="bookmark">IE6 必死</a><!-- (9.4)--></li>
		<li><a href="http://www.neoease.com/javascript-namespace/" rel="bookmark">JavaScript 的命名空间</a><!-- (8.9)--></li>
		<li><a href="http://www.neoease.com/javascript-go-top/" rel="bookmark">用 JavaScript 实现变速回到顶部</a><!-- (8.9)--></li>
		<li><a href="http://www.neoease.com/javascript-onload-function/" rel="bookmark">JavaScript 初始化装载方法</a><!-- (8.7)--></li>
		<li><a href="http://www.neoease.com/get-cursor-position-with-javascript/" rel="bookmark">通过 JavaScript 获取页面上的鼠标位置</a><!-- (8)--></li>
	</ul>
<p><hr color="#E0E0E0" />
<div>
Copyright &copy; 2007-2010 NeoEase. All rights reserved.<br />
<a href="http://www.neoease.com" target="_blank">NeoEase.com</a> | <a target="_blank" href="http://twitter.com/mg12" rel="nofollow">Twitter</a> | <a target="_blank" href="http://weibo.com/mg12" rel="nofollow">新浪微博</a> | <a target="_blank" href="http://www.douban.com/people/mg12" rel="nofollow">豆瓣</a> | <a target="_blank" href="http://www.zhihu.com/people/mg12" rel="nofollow">知乎</a>
</div></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neoease.com/setting-name-attribute-in-internet-explorer/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
	</channel>
</rss>

