<?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>刘钢的博客 - 我是UED &#187; JavaScript脚本</title>
	<atom:link href="http://www.iamued.com/tag/js/feed" rel="self" type="application/rss+xml" />
	<link>http://www.iamued.com</link>
	<description>http://www.IamUED.com</description>
	<lastBuildDate>Wed, 18 Jan 2012 02:51:35 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>页面上的快捷键Hotkey for JavaScript</title>
		<link>http://www.iamued.com/qianduan/1776.html</link>
		<comments>http://www.iamued.com/qianduan/1776.html#comments</comments>
		<pubDate>Sun, 10 Oct 2010 02:35:11 +0000</pubDate>
		<dc:creator>RichieLiu</dc:creator>
				<category><![CDATA[JavaScript脚本]]></category>
		<category><![CDATA[前端开发]]></category>
		<category><![CDATA[hotkey]]></category>
		<category><![CDATA[js快捷键]]></category>

		<guid isPermaLink="false">http://www.iamued.com/?p=1776</guid>
		<description><![CDATA[昨天去逛豆瓣小站（“前端攻城师”）发现了豆瓣新上了五指擒魔 有兴趣的可以去看下 之前在使用Google Reader的时候就发现了快捷键来进行操作的方式，对用户体验也是一种提升，现在基本看reader都是用快捷键 今天正好有时间就把豆瓣的实现看了一下 豆瓣团队的分享精神是我一直钦佩的 尤其是kejun 多次听他的演讲都深有感触 拿豆瓣的代码做了一个小Demo 地址是 http://www.iamued.com/demo/hotkey/]]></description>
			<content:encoded><![CDATA[<p>昨天去逛豆瓣小站（“前端攻城师”）发现了豆瓣新上了<a href="http://site.douban.com/widget/notes/22456/note/94548879/">五指擒魔</a> 有兴趣的可以去看下</p>
<p>之前在使用Google Reader的时候就发现了快捷键来进行操作的方式，对用户体验也是一种提升，现在基本看reader都是用快捷键</p>
<p>今天正好有时间就把豆瓣的实现看了一下 豆瓣团队的分享精神是我一直钦佩的 尤其是<a href="http://www.hikejun.com/">kejun</a> 多次听他的演讲都深有感触</p>
<p>拿豆瓣的代码做了一个小Demo 地址是</p>
<p><a href="http://www.iamued.com/demo/hotkey/" target="_blank">http://www.iamued.com/demo/hotkey/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.iamued.com/qianduan/1776.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>[原创]简单的模板替换机制-jquery实现了局部</title>
		<link>http://www.iamued.com/qianduan/js/1718.html</link>
		<comments>http://www.iamued.com/qianduan/js/1718.html#comments</comments>
		<pubDate>Tue, 07 Sep 2010 06:01:24 +0000</pubDate>
		<dc:creator>RichieLiu</dc:creator>
				<category><![CDATA[JavaScript脚本]]></category>
		<category><![CDATA[template]]></category>
		<category><![CDATA[tip]]></category>
		<category><![CDATA[前端]]></category>
		<category><![CDATA[模板]]></category>

		<guid isPermaLink="false">http://www.iamued.com/?p=1718</guid>
		<description><![CDATA[今天帮同事修改一个Tip提示的效果 提示中 需要用到当前元素的几个属性，就帮忙改了改之前的demo 这里是一个局部实现 可以参考 查看临时Demo 实际应用的案例：http://www.iamued.com/demo/simpletip/template/ 查看临时Demo 实际应用的案例：http://www.iamued.com/demo/simpletip/template/]]></description>
			<content:encoded><![CDATA[<p>今天帮同事修改一个Tip提示的效果 提示中 需要用到当前元素的几个属性，就帮忙改了改之前的demo<br />
这里是一个局部实现 可以参考<br />
<a href="http://www.iamued.com/demo/testReg.html" target="_blank">查看临时Demo</a><br />
<a href="http://www.iamued.com/demo/simpletip/template/" target="_blank">实际应用的案例：http://www.iamued.com/demo/simpletip/template/</a></p>
<pre class="brush: jscript; title: ; notranslate">
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.1//EN&quot; &quot;http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;
&lt;head&gt;
	&lt;title&gt;一个jquery的小模板机制-我是UED&lt;/title&gt;
	&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html;charset=UTF-8&quot; /&gt;
	&lt;script language=&quot;JavaScript&quot; src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js&quot;&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;a id=&quot;test&quot; price=&quot;110&quot; name=&quot;iphone&quot; onmouseover=&quot;test();&quot; href=&quot;#&quot;&gt;这是一个A元素 有2个属性 鼠标放上来看看&lt;/a&gt;

临时Demo的部分代码：
&lt;script type=&quot;text/javascript&quot;&gt;
	function test(){
		var testString=&quot;价格为{price}元，我是{name}&quot;
		alert(testString.replace(/{([^{}]+)}/g,function(word){
			var _attr=word.replace(/({|})+/g,&quot;&quot;);
			return $(&quot;#test&quot;).attr(_attr);
		}));

	}
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p><a href="http://www.iamued.com/demo/testReg.html" target="_blank">查看临时Demo</a><br />
<a href="http://www.iamued.com/demo/simpletip/template/" target="_blank">实际应用的案例：http://www.iamued.com/demo/simpletip/template/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.iamued.com/qianduan/js/1718.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>[转]js中匿名函数的N种写法</title>
		<link>http://www.iamued.com/qianduan/js/1715.html</link>
		<comments>http://www.iamued.com/qianduan/js/1715.html#comments</comments>
		<pubDate>Tue, 07 Sep 2010 03:44:31 +0000</pubDate>
		<dc:creator>RichieLiu</dc:creator>
				<category><![CDATA[JavaScript脚本]]></category>
		<category><![CDATA[匿名函数]]></category>
		<category><![CDATA[闭包]]></category>

		<guid isPermaLink="false">http://www.iamued.com/?p=1715</guid>
		<description><![CDATA[在java中有private属性，强大的功能js不能实现就矮人一截，匿名函数，发扬广大 匿名函数没有实际名字，也没有指针，怎么执行滴？ 其实大家可以看看小括号的意义就应该可以理解。小括号有返回值，也就是小括号内的函数或者表达式的返回值，所以说小括号内的function返回值等于小括号的返回值，不难理解 (function(){})()可以将没有名字的函数执行了把… 关于匿名函数写法，很发散~ Sorry ：） 刚才忘记把转载地址附上了 转自： http://blog.163.com/water_down/blog/static/1702765902010869124093/]]></description>
			<content:encoded><![CDATA[<p>在java中有private属性，强大的功能js不能实现就矮人一截，匿名函数，发扬广大<br />
匿名函数没有实际名字，也没有指针，怎么执行滴？<br />
其实大家可以看看小括号的意义就应该可以理解。小括号有返回值，也就是小括号内的函数或者表达式的返回值，所以说小括号内的function返回值等于小括号的返回值，不难理解 (function(){})()可以将没有名字的函数执行了把…<br />
关于匿名函数写法，很发散~</p>
<pre class="brush: jscript; title: ; notranslate">
//最常见的用法：
(function() {
   alert('water');
})();
//当然也可以带参数：
(function(o) {
    alert(o);
})('water');
//想用匿名函数的链式调用？很简单：
(function(o) {
    alert(o);
    return arguments.callee;
})('water')('down');

//常见的匿名函数都知道了，看看不常见的：
~(function(){
    alert('water');
})();
//写法有点酷~
void function(){
    alert('water');
}();
//据说效率最高~
+function(){
    alert('water');
}();
-function(){
    alert('water');
}();
~function(){
    alert('water');
}();
!function(){
    alert('water');
}();
(function(){
    alert('water');
}());
//有点强制执行的味道~
</pre>
<p>Sorry ：） 刚才忘记把转载地址附上了<br />
转自：<br />
<a href="http://blog.163.com/water_down/blog/static/1702765902010869124093/">http://blog.163.com/water_down/blog/static/1702765902010869124093/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.iamued.com/qianduan/js/1715.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>太NB了：Google Docs Ctrl + C 技术浅析</title>
		<link>http://www.iamued.com/qianduan/1612.html</link>
		<comments>http://www.iamued.com/qianduan/1612.html#comments</comments>
		<pubDate>Tue, 27 Jul 2010 09:52:29 +0000</pubDate>
		<dc:creator>RichieLiu</dc:creator>
				<category><![CDATA[JavaScript脚本]]></category>
		<category><![CDATA[前端开发]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[前端]]></category>
		<category><![CDATA[复制]]></category>

		<guid isPermaLink="false">http://www.iamued.com/?p=1612</guid>
		<description><![CDATA[从玉伯那里转来的，Goole非常NB 用 google docs 打开 pdf 文件，选中文本： 表面上没有任何有趣的地方。但仔细一看，会发现选区的颜色是浅蓝色，而不是默认蓝。第一直觉是是有什么特殊的 CSS 属性，立马 firebug: 不看不知道，一看真蹊跷。selection-highlight 是选区，选区下面是一张图片 page-image! 于是立刻发现一个非常牛逼的特性：Ctrl + C 可以复制图片中的文字！ google 太强悍了，好在前端代码都是开源的，下面简单分析下。 首先数据在哪呢，这个比较容易找到，在 firebug 里有一个请求返回的数据如下： &#60;?xml version="1.0" encoding="UTF-8"?&#62; &#60;pdf2xml&#62; &#60;meta name="Creator" content="Adobe Acrobat 8.1 Combine Files"/&#62; &#60;meta name="Producer" content="Adobe Acrobat 8.1"/&#62; &#60;meta name="CreationDate" content="20100316080708-04'00'"/&#62; &#60;page t="0" l="0" w="612" h="773"&#62; &#60;text l="188" t="754" w="237" h="11" p="188,24,214,15,232,37,271, 7,280,39,322,7,330,11,344,24,370,23,395,20,418,7"&#62; Please post [...]]]></description>
			<content:encoded><![CDATA[<p>从<a href="http://lifesinger.org/blog/2010/07/goog-docs-copy-tech/">玉伯</a>那里转来的，Goole非常NB<br />
用 google docs 打开 pdf 文件，选中文本：<br />
<img src="http://iamued-wordpress.stor.sinaapp.com/uploads/auto_save_image/2010/07/175239CWS.png" alt="" width="429" height="171" /></p>
<p>表面上没有任何有趣的地方。但仔细一看，会发现选区的颜色是浅蓝色，而不是默认蓝。第一直觉是是有什么特殊的 CSS 属性，立马 firebug:<br />
<img src="http://iamued-wordpress.stor.sinaapp.com/uploads/auto_save_image/2010/07/175243Tbx.png" alt="" width="526" height="324" /></p>
<p>不看不知道，一看真蹊跷。<code>selection-highlight</code> 是选区，选区下面是一张图片 <code>page-image</code>!<br />
于是立刻发现一个非常牛逼的特性：<strong><code>Ctrl + C</code> 可以复制图片中的文字！</strong></p>
<p>google 太强悍了，好在前端代码都是开源的，下面简单分析下。</p>
<p>首先数据在哪呢，这个比较容易找到，在 firebug 里有一个请求返回的数据如下：</p>
<pre>&lt;?xml version="1.0" encoding="UTF-8"?&gt;

&lt;pdf2xml&gt;
&lt;meta name="Creator" content="Adobe Acrobat 8.1 Combine Files"/&gt;
&lt;meta name="Producer" content="Adobe Acrobat 8.1"/&gt;
&lt;meta name="CreationDate" content="20100316080708-04'00'"/&gt;
&lt;page t="0" l="0" w="612" h="773"&gt;
 &lt;text l="188" t="754" w="237" h="11" p="188,24,214,15,232,37,271,
7,280,39,322,7,330,11,344,24,370,23,395,20,418,7"&gt;
Please post comments or corrections to the Author Online forum at&lt;/text&gt;
...</pre>
<p>有了这份数据，就可以根据选区得到对应的文本。</p>
<p>接下来的问题是，如何将文本放到剪贴板里？第一反应是用 flash 实现，但感觉 google 不会这么做。禁用掉 flash 插件后，功能正常，这说明是用 js 实现的。</p>
<p>通过 Profile 工具 + Fiddler + 肉眼识别 + 运气，终于定位到了关键代码：</p>
<pre>n.am = function(a) {
    if (! (!this.k.Ca &amp;&amp; Mr(this, a))) {
        ac &amp;&amp; this.lf.focus();
        this.lf.select();
        Nr(this, a)
    }
};</pre>
<p>只要注释掉上面的代码，<code>Ctrl + C</code> 复制功能就无效。<code>focus</code> 和 <code>select</code> 为我们提供了进一步线索，在 HTML 里，发现了秘密：<br />
<img src="http://iamued-wordpress.stor.sinaapp.com/uploads/auto_save_image/2010/07/175246JOL.png" alt="" width="514" height="50" /></p>
<p>到此真相大白：当用户按下 <code>Ctrl + C</code> 时，js 会注入事件，首先根据坐标从数据里取出对应文本，然后将文本赋值给 textarea, 并将其激活和选中。这样，就和用户选中 textarea 的内容，再按下 <code>Ctrl + C</code> 的效果是一样了。</p>
<p>强悍的 google, 技术创新无处不在！</p>
<p>注意：利用 textarea 只能复制纯文本，如果想复制富文本，可以借鉴 google docs 编辑 Word 文档时的处理方式：采用 iframe 充当临时容器，有兴趣的可以进一步研究。</p>
<p>简单演示：<a href="http://lifesinger.github.com/lab/2010/goog-docs-copy-demo.html">goog-docs-copy-demo.html</a></p>
<p>发现这个秘密后，最近在疯狂搞编辑的牛人<a href="http://yiminghe.javaeye.com/">承玉</a>（欢迎搞编辑器的其他牛人加盟）立刻想到了各大站长们非常喜爱的功能：<a href="http://yiminghe.javaeye.com/blog/722264">附带警告信息的禁止copy</a>. 据说，能成功复制的，都不是“人”。</p>
<p>我的尝试是：点击按钮，复制指定文本到 Clipboard 里。应用场景是点击按钮复制证件号码等。尝试代码大家可以看上面 demo 页面源码中的注释。事件可以正常模拟并分发出去，但复制操作惨兮兮地失败了。感觉原因在于浏览器安全限制，对于触发的异步 <code>Ctrl + C</code>, 浏览器会限制其功能。</p>
<p>Google 的产品里有很多秘密，真诱人，创意无限！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.iamued.com/qianduan/1612.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>判断 iframe 是否加载完成的完美方法</title>
		<link>http://www.iamued.com/qianduan/1486.html</link>
		<comments>http://www.iamued.com/qianduan/1486.html#comments</comments>
		<pubDate>Tue, 22 Jun 2010 02:51:57 +0000</pubDate>
		<dc:creator>RichieLiu</dc:creator>
				<category><![CDATA[JavaScript脚本]]></category>
		<category><![CDATA[前端开发]]></category>
		<category><![CDATA[iframe加载]]></category>
		<category><![CDATA[前端]]></category>

		<guid isPermaLink="false">http://www.iamued.com/?p=1486</guid>
		<description><![CDATA[今天正好需要判断iframe加载完成 正好找到怿飞同学的这篇文章 方法很完美 最近， Nicholas C. Zakas 文章《Iframes, onload, and document.domain》的评论中 Christopher 提供了一个新的判断方法（很完美）： 几点补充说明： IE 支持 iframe 的 onload 事件，不过是隐形的，需要通过 attachEvent 来注册。 第二种方法比第一种方法更完美，因为 readystatechange 事件相对于 load 事件有一些潜在的问题。]]></description>
			<content:encoded><![CDATA[<p>今天正好需要判断iframe加载完成 正好找到<a rel="about" href="http://www.planabc.net/about/">怿飞</a>同学的这篇文章 方法很完美</p>
<pre class="brush: jscript; title: ; notranslate">
var iframe = document.createElement(&quot;iframe&quot;);
iframe.src = &quot;http://www.planabc.net&quot;;

if (!/*@cc_on!@*/0) { //if not IE
    iframe.onload = function(){
        alert(&quot;Local iframe is now loaded.&quot;);
    };
} else {
    iframe.onreadystatechange = function(){
        if (iframe.readyState == &quot;complete&quot;){
            alert(&quot;Local iframe is now loaded.&quot;);
        }
    };
}

document.body.appendChild(iframe);
</pre>
<p>最近， <a title="NCZOnline" href="http://www.nczonline.net/" target="_blank">Nicholas C. Zakas</a> 文章<a title="Iframes, onload, and document.domain" href="http://www.nczonline.net/blog/2009/09/15/iframes-onload-and-documentdomain/" target="_blank">《Iframes, onload, and document.domain》</a>的评论中 Christopher 提供了一个新的判断方法（很完美）：</p>
<pre class="brush: jscript; title: ; notranslate">
var iframe = document.createElement(&quot;iframe&quot;);
iframe.src = &quot;http://www.planabc.net&quot;;

if (iframe.attachEvent){
    iframe.attachEvent(&quot;onload&quot;, function(){
        alert(&quot;Local iframe is now loaded.&quot;);
    });
} else {
    iframe.onload = function(){
        alert(&quot;Local iframe is now loaded.&quot;);
    };
}

document.body.appendChild(iframe);
</pre>
<p>几点补充说明：</p>
<ol>
<li><a title="onload Event (BODY, FRAME, FRAMESET, ...)&lt;br /&gt;" href="http://msdn.microsoft.com/en-us/library/cc197055(VS.85).aspx" target="_blank">IE 支持 iframe 的 onload 事件</a>，不过是隐形的，需要通过 attachEvent 来注册。</li>
<li>第二种方法比第一种方法更完美，因为 readystatechange 事件相对于 load 事件有一些潜在的问题。</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.iamued.com/qianduan/1486.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>讨论闭包传入参数：window &amp; undefined</title>
		<link>http://www.iamued.com/qianduan/1450.html</link>
		<comments>http://www.iamued.com/qianduan/1450.html#comments</comments>
		<pubDate>Fri, 21 May 2010 05:32:12 +0000</pubDate>
		<dc:creator>RichieLiu</dc:creator>
				<category><![CDATA[JavaScript脚本]]></category>
		<category><![CDATA[前端开发]]></category>
		<category><![CDATA[闭包]]></category>

		<guid isPermaLink="false">http://www.iamued.com/?p=1450</guid>
		<description><![CDATA[引言 最常见的闭包 (Closure) 范式大家都很熟悉了： 很简单，大家都在用。但是，我们需要了解更多。 首先，闭包是一个匿名函数 (Anonymous function), 即是 (function() {}) 这部分。之所以要给 function 添加括弧是为了让它形成一个表达式 (expression), 有了表达式，并且确定它的类型是个函数 (Function 实例), 就可以直接调用它。所以，后面的一对括弧是可以工作的，它的意义是：我要调用 (call) 这个函数。 既然是函数调用，那就可以像一般的函数那样，在调用时传入参数。这就是本次讨论的话题。 传入 window 参数   这样做最直观的好处是书写便利：少写几个字。你可以在闭包内任何地方使用 win, 它都会指向 window 对象。另外，它有利于压缩减少最终代码的体积，经过压缩后 (如 Google Closure Complier), 所有的 win 都会被替换成形如 a 这样的简单变量。win 用得越多，减少的字节数也越多。 不过，便利的同时也会带来陷阱。在 IE 上，window 总是指向当前窗口对象，这个没有问题，但是在某些场景下，使用闭包内的 win 变量会导致拒绝访问错误 (Access denied). 重现方式大致是这样的：当页面引用其他域名的脚本，并且该脚本调用了闭包内的 window.document, 而且这个闭包代码是来自另一个域名的脚本。在这种情况下，使用 win 会保持对 window 最早的引用，通过另一个域的脚本访问 [...]]]></description>
			<content:encoded><![CDATA[<h3>引言</h3>
<p>最常见的闭包 (Closure) 范式大家都很熟悉了：</p>
<pre class="brush: jscript; title: ; notranslate">
(function() {
// ...
})();
</pre>
<p>很简单，大家都在用。但是，我们需要了解更多。<br />
首先，闭包是一个匿名函数 (Anonymous function), 即是 (function() {}) 这部分。之所以要给 function 添加括弧是为了让它形成一个表达式 (expression), 有了表达式，并且确定它的类型是个函数 (Function 实例), 就可以直接调用它。所以，后面的一对括弧是可以工作的，它的意义是：我要调用 (call) 这个函数。</p>
<p>既然是函数调用，那就可以像一般的函数那样，在调用时传入参数。这就是本次讨论的话题。</p>
<h3>传入 window 参数</h3>
<p> </p>
<pre class="brush: jscript; title: ; notranslate">
(function(win) {
// ...
})(window);
</pre>
<p>这样做最直观的好处是书写便利：少写几个字。你可以在闭包内任何地方使用 win, 它都会指向 window 对象。另外，它有利于压缩减少最终代码的体积，经过压缩后 (如 <a href="http://code.google.com/closure/compiler/">Google Closure Complier</a>), 所有的 win 都会被替换成形如 a 这样的简单变量。win 用得越多，减少的字节数也越多。</p>
<p>不过，便利的同时也会带来陷阱。在 IE 上，window 总是指向当前窗口对象，这个没有问题，但是在某些场景下，使用闭包内的 win 变量会导致拒绝访问错误 (Access denied). 重现方式大致是这样的：当页面引用其他域名的脚本，并且该脚本调用了闭包内的 window.document, 而且这个闭包代码是来自另一个域名的脚本。在这种情况下，使用 win 会保持对 window 最早的引用，通过另一个域的脚本访问 win 会导致 IE 认为脚本产生了跨越冲突，从而拒绝了对 win.document 的访问。解决办法是不使用形参 win, 而是直接使用 window. 需要说明的是，给闭包传入 document 也会导致 IE 出现同样的问题。</p>
<h3>传入 undefined</h3>
<p>其实把 undefined 作为形参就，实参就可以不用传了，因为 JavaScript 中访问未传入的参数就会得到 undefined. 因此，你可以这样写：</p>
<pre class="brush: jscript; title: ; notranslate">
(function(undefined) {
// ...
})();
</pre>
<p>和上面的讨论一样，你可以在闭包内任何地方使用 undefined, 可以少写几个字（如果把 undefined 换成更短的名字），也可以在减少压缩后体积。</p>
<p>另一个的优势是，你可以认为它是个变量，把它当变量来使用，它的值恒等于 (===) 真正的 undefined. 当外部代码意外地定义了 undefined 的时候——不常见，但确实可能会<a href="http://dev.jqueryui.com/ticket/5434">发生</a>——你可以正常地使用真正的 undefined, 而不会被外部的 undefined 意外影响. 这是由 JavaScript 作用域规则决定的。<br />
无论是否使用这个 undefined 参数，都应该避免使用 undefined 的字符串常量，如：</p>
<pre class="brush: jscript; title: ; notranslate">
if(typeof myVar === 'undefined') {
// bad part...
}
</pre>
<p>因为如果你把字符串写错了，机器不会告诉你，而且会产生一个难以检查出来的bug. 幸运的是，对于 JavaScript 来说，<a href="http://www.jslint.com/">JsLint</a> 可以帮你做这个校验。当 myVar 已定义的时候（通过形参或 var 声明），上面的代码改成这样会更易于调试：</p>
<pre class="brush: jscript; title: ; notranslate">
if(myVar === undefined) {
// good part...
}
</pre>
<h3>结论</h3>
<p>从上面两个例子来看，我们建议不要传入 window, 但是可以安全地使用第二种方式 (写 undefined 形参)；我们还要尽量避免使用字符串常量。<br />
最后，最重要的是，这只是两个特定对象和类型的讨论，举一反三，你会更了解 JavaScript</p>
<pre>转自阿里UED：<a href="http://ued.alipay.com/2010/05/using-window-and-undefined-as-parameter-in-closure/">http://ued.alipay.com/2010/05/using-window-and-undefined-as-parameter-in-closure/</a></pre>
]]></content:encoded>
			<wfw:commentRss>http://www.iamued.com/qianduan/1450.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>最近写日期操作的几个JS函数</title>
		<link>http://www.iamued.com/qianduan/1429.html</link>
		<comments>http://www.iamued.com/qianduan/1429.html#comments</comments>
		<pubDate>Fri, 23 Apr 2010 14:39:16 +0000</pubDate>
		<dc:creator>RichieLiu</dc:creator>
				<category><![CDATA[JavaScript脚本]]></category>
		<category><![CDATA[前端开发]]></category>
		<category><![CDATA[Date]]></category>
		<category><![CDATA[日期]]></category>

		<guid isPermaLink="false">http://www.iamued.com/?p=1429</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<pre class="brush: jscript; title: ; notranslate">
//格式化函数 Date原型扩展
Date.prototype.format = function(format)
{
 var o = {

 &quot;M+&quot; : this.getMonth()+1, // month
 &quot;d+&quot; : this.getDate(),// day
 &quot;h+&quot; : this.getHours(), // hour
 &quot;m+&quot; : this.getMinutes(), // minute
 &quot;s+&quot; : this.getSeconds(), // second
 &quot;q+&quot; : Math.floor((this.getMonth()+3)/3), // quarter
 &quot;S&quot; : this.getMilliseconds() // millisecond
 }

 if(/(y+)/.test(format))
 format = format.replace(RegExp.$1,(this.getFullYear()+&quot;&quot;).substr(4 - RegExp.$1.length));
 for(var k in o)
 if(new RegExp(&quot;(&quot;+ k +&quot;)&quot;).test(format))
 format = format.replace(RegExp.$1,RegExp.$1.length==1 ? o[k] <img src='http://www.iamued.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> &quot;00&quot;+ o[k]).substr((&quot;&quot;+ o[k]).length));
 return format;
}
// 日期比较

function datecompare(startDate, endDate) {
 var re = /^(\d{4})(\-)(\d{1,2})(\-)(\d{1,2})$/;
 var d1 = new Date(startDate.replace(/-/g, &quot;/&quot;));
 var d2 = new Date(endDate.replace(/-/g, &quot;/&quot;));
 if (Date.parse(d1) - Date.parse(d2) == 0) {
 // window.alert(&quot;两个日期相等&quot;);
 return &quot;1&quot;;
 }
 if (Date.parse(d1) - Date.parse(d2) &lt; 0) {
 // window.alert(&quot;结束日期 大于 开始日期&quot;);
 return &quot;2&quot;;
 }
 if (Date.parse(d1) - Date.parse(d2) &gt; 0) {
 // window.alert(&quot;结束日期 小于 开始日期&quot;);
 return &quot;3&quot;;
 }
}
//添加一天
function DateAddOneDay(now){
 return new Date(Date.parse(now) + (86400000 * 1))
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.iamued.com/qianduan/1429.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>即拷即用动画函数：透明度渐变、位置移动、尺寸变化</title>
		<link>http://www.iamued.com/qianduan/1382.html</link>
		<comments>http://www.iamued.com/qianduan/1382.html#comments</comments>
		<pubDate>Wed, 31 Mar 2010 02:31:22 +0000</pubDate>
		<dc:creator>RichieLiu</dc:creator>
				<category><![CDATA[JavaScript脚本]]></category>
		<category><![CDATA[前端开发]]></category>
		<category><![CDATA[位置]]></category>
		<category><![CDATA[前端]]></category>
		<category><![CDATA[动画函数]]></category>
		<category><![CDATA[尺寸]]></category>
		<category><![CDATA[透明度]]></category>

		<guid isPermaLink="false">http://www.iamued.com/?p=1382</guid>
		<description><![CDATA[首先感谢一下 51js的 abeet 同学 给我们提取出这么简洁的函数 和大家分享一下吧 查看Demo 这三个函数适用于以下情况 1、在做前端页面时，只需要简单的动画效果，不想引入整个动画类，使用本函数。 2、在写js类时，需要用到简单的动画，为了降低藕合性，使用本函数。 使用方法如下： 核心代码分析 1、获取一个元素的透明度 如果是IE浏览器，则攻取最终样式的滤镜filter的值，再通过正则表达式获取到透明度滤镜alpha的值，如果不存在透明度滤镜值，则透明度为100。 如果是非IE浏览器，那么可以获取最终样式的opacity属性， 2、设置透明度 这个就简单了，不用管浏览器，通通的设置opacity及filter， element.style.opacity = start / 100; element.style.filter = &#8216;alpha(opacity=&#8217; + start + &#8216;)&#8217;; 实际上这儿我偷了个懒，真正无懈可击的写法，应该是判断一下是否IE浏览器，因为在一些情况下可能使用多个滤镜，这时应该用正则替换alpha滤镜的值，而不是直接设置style.filter = &#8216;alpha(opacity=&#8217; + start + &#8216;)&#8217;; 3、element.offsetWidth、element.offsetHeight与element.style.width、element.style.height的关系 只有在IE的border-content式盒模型情况下，这两个值才是相等的，即elementoffsetWidth==element.style.width+element.style.paddingLeft+element.style.paddingRight+element.style.borderLeftWidth+element.style.borderRightWidth 而我认为border-content式盒模型是符合修改元素尺寸时的心理预期的，对非border-content式盒模型情况下要作一个尺寸的修正。 在其它情况下应该对该值加以修正 有人认为以上的修正中默认了padding值的单位是px并且为整数，是不对的， 实际上经由我在ie及firefox下的测试，引用最终样式的padding值，必然是整数，并以px为单位。 4、关于把三个函数合并成一个通用动画函数 以上三个函数的主要逻辑都是一样的： 通过setInterval每隔一定时间修改元素的style属性，以达到动画效果。 所以，把三个函数合并成一个函数是可以的 只是需要在修改特定的属性时出于兼容性，必须作些处理， 因为不同的属性其值类型及单位不一样，不同浏览器下也有区别 如透明度 在非ie下为小数，在ie下是一个特别的滤镜设置 如颜色 一般是用16进制，并有#号前缀 预计这个通用的动画函数的参数会有点多，接口类下 function animator(element, [...]]]></description>
			<content:encoded><![CDATA[<p>首先感谢一下 51js的 abeet 同学 给我们提取出这么简洁的函数<br />
和大家分享一下吧 <a href="http://www.iamued.com/demo/AmFun/Amfun.htm" target="_blank">查看Demo</a><br />
<strong>这三个函数适用于以下情况<br />
</strong>1、在做前端页面时，只需要简单的动画效果，不想引入整个动画类，使用本函数。<br />
2、在写js类时，需要用到简单的动画，为了降低藕合性，使用本函数。</p>
<p>使用方法如下：</p>
<pre class="brush: jscript; title: ; notranslate">
var fade = function(element, transparency, speed, callback){……}
透明度渐变：transparency:透明度 0(全透)-100(不透)；speed:速度1-100，默认为1
例&lt;input onclick=&quot;fade('testDiv', 40)&quot; type=&quot;button&quot; value=&quot;透明度变化&quot; /&gt;

var move = function(element, position, speed, callback){……}
//移动到指定位置，position:移动到指定left及top 格式{left:120, top:340}或{left:120}或{top:340}；speed:速度 1-100，默认为10
例&lt;input onclick=&quot;move('testDiv', {top:400})&quot; type=&quot;button&quot; value=&quot;垂直移动&quot; /&gt;

var resize = function(element, size, speed, callback){……}
//长宽渐变：size:要改变到的尺寸 格式 {width:400, height:250}或{width:400}或{height:250}；speed:速度 1-100，默认为10
例&lt;input onclick=&quot;resize('testDiv', {height:300})&quot; type=&quot;button&quot; value=&quot;改变高度&quot; /&gt;
</pre>
<p><strong>核心代码分析<br />
1、获取一个元素的透明度</strong><br />
如果是IE浏览器，则攻取最终样式的滤镜filter的值，再通过正则表达式获取到透明度滤镜alpha的值，如果不存在透明度滤镜值，则透明度为100。<br />
如果是非IE浏览器，那么可以获取最终样式的opacity属性，</p>
<pre class="brush: jscript; title: ; notranslate">
function getOpacity(elem){
var alpha;
if(navigator.userAgent.toLowerCase().indexOf('msie') != -1){
alpha=elem.currentStyle.filter.indexOf(&quot;opacity=&quot;) &amp;gt;= 0?(parseFloat( elem.currentStyle.filter.match(/opacity=([^)]*)/)[1] )) + '':
'100';
}else{
alpha=100*elem.ownerDocument.defaultView.getComputedStyle(elem,null)['opacity'];
}
return alpha;
};
</pre>
<p><strong>2、设置透明度</strong><br />
这个就简单了，不用管浏览器，通通的设置opacity及filter，<br />
element.style.opacity = start / 100;<br />
element.style.filter = &#8216;alpha(opacity=&#8217; + start + &#8216;)&#8217;;<br />
实际上这儿我偷了个懒，真正无懈可击的写法，应该是判断一下是否IE浏览器，因为在一些情况下可能使用多个滤镜，这时应该用正则替换alpha滤镜的值，而不是直接设置style.filter = &#8216;alpha(opacity=&#8217; + start + &#8216;)&#8217;;</p>
<p><strong>3、element.offsetWidth、element.offsetHeight与element.style.width、element.style.height的关系</strong><br />
只有在IE的border-content式盒模型情况下，这两个值才是相等的，即elementoffsetWidth==element.style.width+element.style.paddingLeft+element.style.paddingRight+element.style.borderLeftWidth+element.style.borderRightWidth<br />
而我认为border-content式盒模型是符合修改元素尺寸时的心理预期的，对非border-content式盒模型情况下要作一个尺寸的修正。<br />
在其它情况下应该对该值加以修正</p>
<pre class="brush: jscript; title: ; notranslate">
if(!(navigator.userAgent.toLowerCase().indexOf('msie') != -1&amp;&amp;document.compatMode == 'BackCompat')){
//除了ie下border-content式盒模型情况外，需要对size加以修正
var CStyle=document.defaultView?document.defaultView.getComputedStyle(element,null):element.currentStyle;
if(typeof(size.width)=='number'){
size.width=size.width-CStyle.paddingLeft.replace(/D/g,'')-CStyle.paddingRight.replace(/D/g,'');
}
if(typeof(size.height)=='number'){
size.height=size.height-CStyle.paddingTop.replace(/D/g,'')-CStyle.paddingBottom.replace(/D/g,'');
}
}
</pre>
<p>有人认为以上的修正中默认了padding值的单位是px并且为整数，是不对的，<br />
实际上经由我在ie及firefox下的测试，引用最终样式的padding值，必然是整数，并以px为单位。</p>
<p><strong>4、关于把三个函数合并成一个通用动画函数</strong><br />
以上三个函数的主要逻辑都是一样的：<br />
通过setInterval每隔一定时间修改元素的style属性，以达到动画效果。<br />
所以，把三个函数合并成一个函数是可以的<br />
只是需要在修改特定的属性时出于兼容性，必须作些处理，<br />
因为不同的属性其值类型及单位不一样，不同浏览器下也有区别<br />
如透明度 在非ie下为小数，在ie下是一个特别的滤镜设置<br />
如颜色 一般是用16进制，并有#号前缀<br />
预计这个通用的动画函数的参数会有点多，接口类下<br />
function animator(element, interval, start, end, style, speed, tmp, callback){……}<br />
说明<br />
function animator(元素或元素ID, 计时器句柄,起始值,目标值,需修改的属性, 步进值(增量),值转换过滤方法(用于修改非普通递增递减形的数据，比如16进制颜色递增、前缀符号后缀单位修正), 回调函数)<br />
function animator(&#8216;testdiv&#8217;,'bgcolor&#8217;,'#336699&#8242;,&#8217;#aabbcc&#8217;,'backgroundColor&#8217;,2,changeColor,callback)<br />
颜色修改方法示例（仅供参考，未测试）</p>
<pre class="brush: jscript; title: ; notranslate">
changeColor=function(start,end,speed){
var _10to16 = function(color){
function tmp(index){
var tmp = color[index].toString(16);
return tmp.length == 1 ? &quot;0&quot; + tmp : tmp;
};
return &quot;#&quot; + tmp(0) + tmp(1) + tmp(2);
};
var x16to10 = function(color){
if(!/^#[0-9A-Fa-f]{3,6}$/i.test(color))retun color;
function tmp(index){
return color.charAt(index);
};
color = color.substring(1);
if(color.length == 3)
color = tmp(0) + tmp(0) + tmp(1) + tmp(1) + tmp(2) + tmp(2);
return [parseInt(tmp(0) + tmp(1), 16), parseInt(tmp(2) + tmp(3), 16), parseInt(tmp(4) + tmp(5), 16)];
};
var color = x16to10(start),
var end = x16to10(end),
var index = 3;
while(index--)
color[index] = color[index] &lt; end[index] ? min(color[index] + speed, end[index]) : max(color[index] - speed, end[index]);
reutn color;
}
</pre>
<p>原文见：<a href="http://bbs.51js.com/viewthread.php?tid=86901">http://bbs.51js.com/viewthread.php?tid=86901</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.iamued.com/qianduan/1382.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>各浏览器中cookie限制</title>
		<link>http://www.iamued.com/qianduan/1326.html</link>
		<comments>http://www.iamued.com/qianduan/1326.html#comments</comments>
		<pubDate>Fri, 19 Mar 2010 09:25:12 +0000</pubDate>
		<dc:creator>RichieLiu</dc:creator>
				<category><![CDATA[JavaScript脚本]]></category>
		<category><![CDATA[前端开发]]></category>
		<category><![CDATA[cookie限制]]></category>
		<category><![CDATA[浏览器cookie]]></category>

		<guid isPermaLink="false">http://www.iamued.com/?p=1326</guid>
		<description><![CDATA[  Firefox Opera chrome IE6 IE7/IE8 最多key个数 50个 30个 53个 20个 50个 key个数超出时 随机删除旧的 先进先出方式删除旧的 单key字节数① 4097 4051 4051 4096 5072 单key字节超出时 不进行写入操作 总字节数限制② 204850 4997 本地无cookie 4096 10239 总字节超出后 不写入新的 - cookie无法读写 注①：包括key及value，以及分号、等号 注②：总字节数也受HTTP Server的设置影响； Apache用这2个参数调整： LimitRequestFieldSize 限制客户端发送的请求头的字节数 【默认 8190】 LimitRequestLine 限制接受客户端发送的HTTP请求行的字节数【默认 8190】 当cookie超出Server的设置大小后会出现400 Bad Request 结论：我们应该保证cookie key数量&#60;=20，单key字节&#60;=4000b，总字节数&#60;=4000b 感谢vfresh同学整理：）]]></description>
			<content:encoded><![CDATA[<table>
<thead>
<tr>
<th> </th>
<th>Firefox</th>
<th>Opera</th>
<th>chrome</th>
<th>IE6</th>
<th>IE7/IE8</th>
</tr>
</thead>
<tfoot></tfoot>
<tbody>
<tr>
<th>最多key个数</th>
<td>50个</td>
<td>30个</td>
<td>53个</td>
<td>20个</td>
<td>50个</td>
</tr>
<tr>
<th>key个数超出时</th>
<td>随机删除旧的</td>
<td colspan="4" align="center" valign="middle">先进先出方式删除旧的</td>
</tr>
<tr>
<th>单key字节数<sub>①</sub></th>
<td>4097</td>
<td>4051</td>
<td>4051</td>
<td>4096</td>
<td>5072</td>
</tr>
<tr>
<th>单key字节超出时</th>
<td colspan="5" align="center" valign="middle">不进行写入操作</td>
</tr>
<tr>
<th>总字节数限制<sub>②</sub></th>
<td>204850</td>
<td>4997</td>
<td>本地无cookie</td>
<td>4096</td>
<td>10239</td>
</tr>
<tr>
<th>总字节超出后</th>
<td colspan="2">不写入新的</td>
<td>-</td>
<td colspan="2">cookie无法读写</td>
</tr>
</tbody>
</table>
<ul>
<li>注①：包括key及value，以及分号、等号</li>
<li>注②：总字节数也受HTTP Server的设置影响；<br />
Apache用这2个参数调整：<br />
<a href="http://httpd.apache.org/docs/2.2/mod/core.html#limitrequestfieldsize" target="_blank">LimitRequestFieldSize</a> 限制客户端发送的请求头的字节数 【默认 8190】<br />
<a href="http://httpd.apache.org/docs/2.2/mod/core.html#LimitRequestLine" target="_blank">LimitRequestLine</a> 限制接受客户端发送的HTTP请求行的字节数【默认 8190】<br />
当cookie超出Server的设置大小后会出现400 Bad Request</li>
</ul>
<p><strong>结论：</strong>我们应该保证cookie key数量&lt;=20，单key字节&lt;=4000b，总字节数&lt;=4000b</p>
<p>感谢<a href="http://www.vfresh.org/js/957">vfresh</a>同学整理：）</p>
]]></content:encoded>
			<wfw:commentRss>http://www.iamued.com/qianduan/1326.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在分享一个Javascript测试题</title>
		<link>http://www.iamued.com/qianduan/1271.html</link>
		<comments>http://www.iamued.com/qianduan/1271.html#comments</comments>
		<pubDate>Tue, 23 Feb 2010 13:37:45 +0000</pubDate>
		<dc:creator>RichieLiu</dc:creator>
				<category><![CDATA[JavaScript脚本]]></category>
		<category><![CDATA[前端开发]]></category>
		<category><![CDATA[测试]]></category>

		<guid isPermaLink="false">http://www.iamued.com/?p=1271</guid>
		<description><![CDATA[http://adamlu.googlecode.com/svn/trunk/js_quiz.html 继上次受挫折之后 又看了看相关js测试题 找到这个 再次分享一下]]></description>
			<content:encoded><![CDATA[<p><a href="http://adamlu.googlecode.com/svn/trunk/js_quiz.html">http://adamlu.googlecode.com/svn/trunk/js_quiz.html</a></p>
<p>继上次受挫折之后 又看了看相关js测试题</p>
<p>找到这个</p>
<p>再次分享一下</p>
]]></content:encoded>
			<wfw:commentRss>http://www.iamued.com/qianduan/1271.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

