<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1986490075995203742</id><updated>2011-07-08T11:40:03.936+08:00</updated><category term='haslayout'/><category term='可用性'/><category term='zoom'/><category term='事件对象'/><category term='css'/><category term='javascript'/><category term='易用性'/><category term='fixed'/><category term='IE6'/><category term='html'/><category term='IE6 bug'/><category term='工具'/><category term='JSON'/><category term='position'/><category term='google'/><category term='submit into iframe'/><title type='text'>fan.log()</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://fanlog.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986490075995203742/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://fanlog.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>范儿</name><uri>http://www.blogger.com/profile/01229356702532235671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>18</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1986490075995203742.post-3134324378770042848</id><published>2009-07-08T00:37:00.001+08:00</published><updated>2009-07-08T00:39:09.718+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><title type='text'>javascript基本类型和对象类型</title><content type='html'>&lt;p&gt;基本类型&lt;/p&gt;
&lt;textarea class="demoCode"&gt;
&lt;script type="text/javascript"&gt;
var a = 3.14, b = a;//a 的值赋值给b
a = 10;//a的值改变
alert(b);
&lt;/script&gt;
&lt;/textarea&gt;
&lt;button class="runCodeBtn" type="button"&gt;运行代码&lt;/button&gt;

&lt;p&gt;对象类型 object&lt;/p&gt;
&lt;textarea class="demoCode"&gt;
&lt;script type="text/javascript"&gt;
var a = {
 name: 'Colin',
 age: 24,
 Height: '173cm'
};

window.option = a;
option.name = 'Jerry';
alert(a.name);
&lt;/script&gt;
&lt;/textarea&gt;
&lt;button class="runCodeBtn" type="button"&gt;运行代码&lt;/button&gt;

&lt;p&gt;对象类型 Array&lt;/p&gt;
&lt;textarea class="demoCode"&gt;
&lt;script type="text/javascript"&gt;
var arr = [1, 2, 3];
var b = arr;
b[0] = 4;
alert(arr[0])
&lt;/script&gt;
&lt;/textarea&gt;
&lt;button class="runCodeBtn" type="button"&gt;运行代码&lt;/button&gt;


&lt;p&gt;对象类型 DOM&lt;/p&gt;
&lt;textarea class="demoCode"&gt;
&lt;style type="text/css"&gt;.red{color:red}.blue{color:blue}&lt;/style&gt;
&lt;div id="demo1"&gt;&lt;span class="red"&gt;Hello world!&lt;/span&gt;&lt;/div&gt;
&lt;script type="text/javascript"&gt;
var obj = document.getElementById('demo1').getElementsByTagName('span')[0];
var myInst = obj;
myInst.className = 'blue';

var objStr = document.getElementById('demo1').innerHTML;
var myStr = objStr;
myStr = myStr.replace(/blue/g, 'blue');
alert("myStr = " + myStr);
alert("obj.innerHTML = " + obj.innerHTML);
&lt;/script&gt;
&lt;/textarea&gt;
&lt;button class="runCodeBtn" type="button"&gt;运行代码&lt;/button&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986490075995203742-3134324378770042848?l=fanlog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fanlog.blogspot.com/feeds/3134324378770042848/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://fanlog.blogspot.com/2009/07/javascript.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986490075995203742/posts/default/3134324378770042848'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986490075995203742/posts/default/3134324378770042848'/><link rel='alternate' type='text/html' href='http://fanlog.blogspot.com/2009/07/javascript.html' title='javascript基本类型和对象类型'/><author><name>范儿</name><uri>http://www.blogger.com/profile/01229356702532235671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986490075995203742.post-8983554543234788486</id><published>2009-05-14T21:38:00.001+08:00</published><updated>2009-05-14T21:46:43.818+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='css'/><title type='text'>CSS技巧两则</title><content type='html'>&lt;p&gt;CSS实现圆角，mozilla和webkit有CSS3实现圆角的新特新&lt;/p&gt;
&lt;code class="prettyprint"&gt;
-mozilla-border-radius /*Mozilla圆角属性 */
-webkit-border-radius /*webkit圆角属性 */
&lt;/code&gt;

&lt;p&gt;圆角demo：&lt;/p&gt;
&lt;textarea class="demoCode"&gt;
&lt;div style="width:100px;height:100px;border:1px solid #666;-moz-border-radius:5px;-webkit-border-radius:5px;background-color:#CCC"&gt;&lt;/div&gt;
&lt;/textarea&gt;
&lt;div&gt;&lt;button type="button" class="runCodeBtn"&gt;运行代码&lt;/button&gt;&lt;/div&gt;

&lt;p&gt;border实现简单阴影：&lt;/p&gt;
&lt;p&gt;圆角demo：&lt;/p&gt;
&lt;textarea class="demoCode"&gt;
&lt;div style="width:500px;border:2px solid #EEE;-moz-border-radius:3px;-webkit-border-radius:3px"&gt;
&lt;div style="height:100px;border:1px solid #DDD;-moz-border-radius:3px;-webkit-border-radius:3px;background-color:#FFF"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/textarea&gt;
&lt;div&gt;&lt;button type="button" class="runCodeBtn"&gt;运行代码&lt;/button&gt;&lt;/div&gt;
&lt;p&gt;这些小技巧其实都是平时积累的小经验，多留意细节处理，会发现有很多方法实现很强大的功能。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986490075995203742-8983554543234788486?l=fanlog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fanlog.blogspot.com/feeds/8983554543234788486/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://fanlog.blogspot.com/2009/05/css.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986490075995203742/posts/default/8983554543234788486'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986490075995203742/posts/default/8983554543234788486'/><link rel='alternate' type='text/html' href='http://fanlog.blogspot.com/2009/05/css.html' title='CSS技巧两则'/><author><name>范儿</name><uri>http://www.blogger.com/profile/01229356702532235671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986490075995203742.post-7258565639827913597</id><published>2009-04-22T01:53:00.000+08:00</published><updated>2009-04-22T01:53:58.491+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='易用性'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>Google Chrome多进程的必要场景</title><content type='html'>&lt;p&gt;我是个极度偏向RIA应用的web终端用户，我常用的web程序如下Gmail, Google Reader, Google Docs, Google Languages tools, Google webpicasa, &lt;a href="http://www.picnik.com/"&gt;picnik&lt;/a&gt;, &lt;a href="www.1g1g.com"&gt;1g1g.com&lt;/a&gt;, &lt;a href="http://m.mop.com"&gt;猫扑爱听&lt;/a&gt;, &lt;a href="http://www.xiami.com"&gt;虾米&lt;/a&gt;，以上这些应用都常年霸占我的书签工具栏最佳位置。&lt;/p&gt;
&lt;p&gt;试想一下，如果某次我正在Gmail聊天，用&lt;a href="http://www.1g1g.com"&gt;亦歌&lt;/a&gt;听歌，用Google Doc上传文档，浏览朋友的picasa，并用webQQ挂着我的QQ，正当我想在Gmail告诉朋友相册地址时，Firefox异常错误，所有眼前我正在做的事情瞬间中断，你会不会捶桌子？虽然在此重启Firefox, Firefox会重新自动打开上次访问过的页面，但我体验过这种异常关闭，很抓狂。有可能是你访问的站点的脚本很糟糕，也有可能是Firefox本地的插件异常造成关闭。&lt;/p&gt;
&lt;p&gt;这时候，Google Chrome的多进程是不是显得格外优秀？&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986490075995203742-7258565639827913597?l=fanlog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fanlog.blogspot.com/feeds/7258565639827913597/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://fanlog.blogspot.com/2009/04/google-chrome.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986490075995203742/posts/default/7258565639827913597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986490075995203742/posts/default/7258565639827913597'/><link rel='alternate' type='text/html' href='http://fanlog.blogspot.com/2009/04/google-chrome.html' title='Google Chrome多进程的必要场景'/><author><name>范儿</name><uri>http://www.blogger.com/profile/01229356702532235671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986490075995203742.post-3794490224374669158</id><published>2009-04-18T01:29:00.001+08:00</published><updated>2009-04-18T01:31:01.830+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='JSON'/><title type='text'>Javascript跨域传递JSON</title><content type='html'>&lt;p&gt;Javascript无法跨域访问，这是Javascript的安全机制，跨域访问的定义可以这么说，www.google.com域下的脚本不能访问www.amazon.com域，www.google.com当然也不能访问子域名site.google.com域。JS如果要跨域访问数据，AJAX的http请求跨域数据会报错。如果需要用JS请求跨域的数据，JSON是很好的选择。跨域获取JSON并不是异步请求，而是应用script标签的src属性获取到服务器生成的JSON格式化文本，例：&lt;/p&gt;
&lt;pre class="prettyprint"&gt;
&amp;lt;script type="text/javascript"&amp;gt;
function jsonCallback(resp) { //jsonCallback是下面script标签回调的,resp将返回的JSON作为参数传递
  var entris =  resp.feed.entry
}
&amp;lt;/script&amp;gt;
&amp;lt;script type="text/javascript" src="http://fanlog.blogspot.com/feeds/posts/default/?max-results=10&amp;start-index=1&amp;alt=json-in-script&amp;callback=jsonCallback"&amp;gt;&amp;lt;/script&amp;gt;
&lt;/pre&gt;
&lt;p&gt;script标签src的地址，是blogger API返回的JSON格式化数据，数据格式如下：&lt;/p&gt;
&lt;pre class="javascript"&gt;
jsonCallback({"feed":["content",{"$t":"第一个标题"}],["content",{"$t":"第二个标题"}], .....
&lt;/pre&gt;
&lt;p&gt;JSON数据格式可以像访问JS对象一样去访问，例如jsonCallback.feed[0].content.$t返回的值就是"第一个标题"，"[]"符号表示数组对象，访问第二个"[]"即为jsonCallback.feed[1]。&lt;/p&gt;
&lt;p&gt;jQuery有一个getJSON()的方法可以直接访问JSON数据。prototype貌似米有。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986490075995203742-3794490224374669158?l=fanlog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fanlog.blogspot.com/feeds/3794490224374669158/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://fanlog.blogspot.com/2009/04/javascriptjson.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986490075995203742/posts/default/3794490224374669158'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986490075995203742/posts/default/3794490224374669158'/><link rel='alternate' type='text/html' href='http://fanlog.blogspot.com/2009/04/javascriptjson.html' title='Javascript跨域传递JSON'/><author><name>范儿</name><uri>http://www.blogger.com/profile/01229356702532235671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986490075995203742.post-5698125291468297102</id><published>2009-04-15T16:21:00.005+08:00</published><updated>2009-04-15T16:42:52.477+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='css'/><title type='text'>inline-block属性</title><content type='html'>&lt;p&gt;IE6和IE7可以通过触发haslayout模拟inline-block，而事实上，通常需要用到inline-block的元素都会用到width，而width本身就可以触发haslayout，很多文章在写到IE6、IE7中使用inline-block时，都写了zoom属性，事实上是不需要的。&lt;p&gt;

&lt;p&gt;延伸一个问题，很多时候在使用text-indent来隐藏文字时，一个inline元素并且使用了inline-block属性时，IE6下的麻烦就来了：&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
&amp;lt;div title="父容器"&amp;gt;&amp;lt;span style="display:inline-block; width:120px; text-indent:-9999px; background:url(https://www.google.com/accounts/picasa20x20.png) no-repeat scroll 0 0"&amp;gt;被隐藏的文字&amp;lt;/span&amp;gt;测试文字测试文字&amp;lt;/div&amp;gt;
&lt;/pre&gt;
&lt;p&gt;如果以上代码中span的前面没有文字，整个div父容器就不见了。不见的原因还是text-indent，粗暴的解决方法：&lt;/p&gt;
&lt;pre class="prettyprint"&gt;
&amp;lt;div title="父容器"&amp;gt;&amp;nbsp;&amp;lt;span style="display:inline-block; width:120px; text-indent:-9999px; background:url(https://www.google.com/accounts/picasa20x20.png) no-repeat scroll 0 0"&amp;gt;被隐藏的文字&amp;lt;/span&amp;gt;
测试文字测试文字&amp;lt;/div&amp;gt;
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986490075995203742-5698125291468297102?l=fanlog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fanlog.blogspot.com/feeds/5698125291468297102/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://fanlog.blogspot.com/2009/04/inline-block.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986490075995203742/posts/default/5698125291468297102'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986490075995203742/posts/default/5698125291468297102'/><link rel='alternate' type='text/html' href='http://fanlog.blogspot.com/2009/04/inline-block.html' title='inline-block属性'/><author><name>范儿</name><uri>http://www.blogger.com/profile/01229356702532235671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986490075995203742.post-539601066675100146</id><published>2009-04-12T15:51:00.000+08:00</published><updated>2009-04-12T15:51:06.502+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='工具'/><title type='text'>差异性同步工具cwRsync</title><content type='html'>&lt;p&gt;cwRsync是windows下的同步工具，比如在local的代码需要提交到测试服务器进行测试，如果一次两次的copy还好，但是代码涉及到的目录很多的话就需要频繁的切换本地以及服务器的目录，很烦躁的。cwRsync可以直接文件夹对文件夹同步，配置好同步的路径，执行一次.bat文件即可。cwRsync有client和server两个版本，如果&lt;/p&gt;
&lt;p&gt;下载cwRsync&lt;a href="http://www.itefix.no/i2/node/10650"&gt;http://www.itefix.no/i2/node/10650&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;分别下载server和client版本，如果需要从本地同步到服务器，服务器必须安装server版本，因为cwRsync需要通过SSH登录服务器并验证用户。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986490075995203742-539601066675100146?l=fanlog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fanlog.blogspot.com/feeds/539601066675100146/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://fanlog.blogspot.com/2009/04/cwrsync.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986490075995203742/posts/default/539601066675100146'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986490075995203742/posts/default/539601066675100146'/><link rel='alternate' type='text/html' href='http://fanlog.blogspot.com/2009/04/cwrsync.html' title='差异性同步工具cwRsync'/><author><name>范儿</name><uri>http://www.blogger.com/profile/01229356702532235671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986490075995203742.post-9104939667901348608</id><published>2009-04-07T21:25:00.001+08:00</published><updated>2009-04-07T21:26:46.262+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='html'/><title type='text'>了解HTML5</title><content type='html'>&lt;p&gt;W3C已经接受并发布了HTML5的草稿，浏览器厂商已经等不及xhtml4.2的发布，技术的更新永远是跟这需求走的，任何技术标准还是离不开广泛的应用，如果不切实际的追求标准，只能吃力不讨好。&lt;/p&gt;

&lt;p&gt;了解一下HTML5就明白，为什么这些大的厂商等不及xhtml4.2的发布。现在的web已经不是传统的内容呈现页面+超文本链接。丰富的交互体验需求以及风靡的AJAX应用对服务器的密集请求，迫使HTML5的促成。Google Gears要解决的问题，事实上也是HTML5要解决的问题。&lt;/p&gt;

&lt;p&gt;Google Gears这个浏览器插件可以使web应用程序在本地离线运行，允许JavaScript访问、操作存储在本地的格式化数据，用户所有的本地离线操作和数据都将在下一次联网与服务器同步。显然Cloud app是离不开Google Gears。&lt;/p&gt;

&lt;p&gt;HTML4.0或(X)HTML1.0+AJAX可以实现丰富的交互，AJAX带来前所未有的良好用户体验，但是HTML并不是标准的格式化数据标签，而客户端任何一次对数据的操作，都必须请求服务器，AJAX固然好，可是密集的数据请求所带来的性能问题，是Cloud App无法接受的。&lt;/p&gt;

&lt;p&gt;HTML5的部分新特性：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;新增了nav, aside, head, foot, article等更具有语义的标签&lt;/li&gt;
&lt;li&gt;新增了canvas, video等多媒体标签的支持&lt;/li&gt;
&lt;li&gt;对Javascript开放更多的API，Javascript更容易操作并且可以用sql语句访问存储在浏览器本地的格式化数据&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;可见HTML5希望带来更丰富的交互体验以及更高效的开发，目前HTML5和XHTML2仍然不是W3C官方推荐的语言标签，不过我个人认为，浏览器厂商的确有必要以官方的姿态站出来制定标准。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986490075995203742-9104939667901348608?l=fanlog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fanlog.blogspot.com/feeds/9104939667901348608/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://fanlog.blogspot.com/2009/04/html5.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986490075995203742/posts/default/9104939667901348608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986490075995203742/posts/default/9104939667901348608'/><link rel='alternate' type='text/html' href='http://fanlog.blogspot.com/2009/04/html5.html' title='了解HTML5'/><author><name>范儿</name><uri>http://www.blogger.com/profile/01229356702532235671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986490075995203742.post-3533233765658178789</id><published>2009-02-26T00:13:00.001+08:00</published><updated>2009-02-26T00:15:45.151+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='可用性'/><title type='text'>可持续访问的AJAX</title><content type='html'>&lt;p&gt;《ppk on Javascript》书中谈到Javascript的目的，Javascript其实是为web增加特别的一层可用性，我的理解Javascript的在web中的角色是增加web的易用性，让用户更好的体验web产品，开发者在设计产品时，就应该考虑到不同用户的复杂情况，例如禁用脚本的用户、盲人、手持设备用户等等。&lt;/p&gt;
&lt;p&gt;创建可持续访问性的web，也可以如上理解，具体在开发中的细节如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a链接一定有href地址，页面分离事件注册器，决绝行内时间注册（例如&amp;lt;a href="#" onclick="func();"&amp;gt;）&lt;/li&gt;
&lt;li&gt;有选择性的使用Javascript和CSS隐藏页面内容&lt;sup&gt;&lt;a href="#JSorCSS"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;不用Javascript做页面跳转，否则用户使用浏览器的后腿按钮将无限制跳转，最终只能强迫用户推出页面，这样的体验真的很糟糕，我想至少我收够了这样的方式；&lt;/li&gt;
&lt;li&gt;务必考虑脚本兼容主流的浏览器，招商银行的网银和之前淘宝的支付宝不支持Firefox就是例子，用户抱怨很囧
&lt;/ul&gt;
&lt;p&gt;另外，记录一下以前开发中的小技巧：&lt;/p&gt;
&lt;p&gt;当我们希望点击一个a链接，然后用一个DIV的popup容器来呈现内容而不刷新页面时，使用AJAX如果做到持续的可访问性呢？首先，来思考一下无脚本的情况下，这个a链接的地址一定是能够访问的，访问的页面应该是完整的页面（有head和foot），而不是HTML片段。然后，再思考一下有脚本情况下，我们给a链接注册一个事件func，事件func完成一个AJAX请求，把a链接的href地址通过异步获取到当前页面，并且创建一个DIV作为popup容器，那么这个popup容器内被请求的HTML不应该显示head和foot部分（HTML片段）。那么，现在的问题是，如果判断当a链接分别在有脚本、无脚本的的情况下，显示或者不显示页面的head、foot部分呢？如下：&lt;/p&gt;
&lt;p&gt;当脚本可用时，我们在func里给a链接加上一个参数"popup"：&lt;/p&gt;
&lt;pre class="prettyprint"&gt;
&amp;lt;a href="http://www.site.com/site.php"&amp;gt;Click&amp;lt;/a&amp;gt;//页面静态地址
&amp;lt;a href="http://www.site.com/site.php?popup=1"&amp;gt;Click&amp;lt;/a&amp;gt;//JS给a href添加“&amp;popup=1”
&lt;/pre&gt;
&lt;p&gt;那么现在当为AJAX请求页面时，a href带有一个popup=1的参数，当无脚本时，a href无popup=1的参数，这个参数有什么用呢？popup=1这个参数可以交给服务器脚本，服务器脚本判断当页面上有popup这个值时，就不编译head和foot的HTML，没有这个popup这个值，服务器脚本就编译head和foot的值。&lt;/p&gt;
&lt;p&gt;以上这种方法,&lt;a href="delicious.com"&gt;美味书签&lt;/a&gt;用到很多，有兴趣的可以登录体验一下美味书签的一些操作(删除、编辑)，操作方法就是禁用脚本，或者对美味书签的删除、编辑按钮用新窗口打开。&lt;/p&gt;

&lt;blockquote id="JSorCSS"&gt;
&lt;p&gt;有选择性的选择JS或者CSS隐藏内容，分情况例如：JS驱动的下拉菜单，禁用脚本用户是无法浏览到被隐藏的菜单，那么菜单的隐藏内容应该用JS隐藏，当无脚本的情况下，JS隐藏菜单的功能自然也无法工作，那么禁用脚本的用户自然也可以浏览到本该隐藏的菜单列表&lt;/p&gt;
&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986490075995203742-3533233765658178789?l=fanlog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fanlog.blogspot.com/feeds/3533233765658178789/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://fanlog.blogspot.com/2009/02/ajax.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986490075995203742/posts/default/3533233765658178789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986490075995203742/posts/default/3533233765658178789'/><link rel='alternate' type='text/html' href='http://fanlog.blogspot.com/2009/02/ajax.html' title='可持续访问的AJAX'/><author><name>范儿</name><uri>http://www.blogger.com/profile/01229356702532235671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986490075995203742.post-5635486131856567035</id><published>2009-02-23T22:30:00.000+08:00</published><updated>2009-02-23T22:30:49.852+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='haslayout'/><category scheme='http://www.blogger.com/atom/ns#' term='css'/><title type='text'>弄懂IE的haslayout（二）</title><content type='html'>&lt;p&gt;IE6中，如果list的子节点display为block属性，IE6会把HTML文档中的换行符呈现出来，以至于list之间出现空白的间隔，代码如下：&lt;/p&gt;
&lt;pre class="prettyprint"&gt;
&amp;lt;style type="text/css"&amp;gt;
* {margin:0;padding:0;}
li {list-style:none;}
li span {
  display: block;
  background-color:#f1f1f1;
  zoom:1; /*去掉zoom属性，查看IE6下span的haslayout值*/
}
&amp;lt;/style&amp;gt;

&amp;lt;ul&amp;gt;
  &amp;lt;li&amp;gt;&amp;lt;span&amp;gt;link items&amp;lt;/span&amp;gt;&amp;lt;/li&amp;gt;
  &amp;lt;li&amp;gt;&amp;lt;span&amp;gt;link items&amp;lt;/span&amp;gt;&amp;lt;/li&amp;gt;
  &amp;lt;li&amp;gt;&amp;lt;span&amp;gt;link items&amp;lt;/span&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986490075995203742-5635486131856567035?l=fanlog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fanlog.blogspot.com/feeds/5635486131856567035/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://fanlog.blogspot.com/2009/02/iehaslayout_23.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986490075995203742/posts/default/5635486131856567035'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986490075995203742/posts/default/5635486131856567035'/><link rel='alternate' type='text/html' href='http://fanlog.blogspot.com/2009/02/iehaslayout_23.html' title='弄懂IE的haslayout（二）'/><author><name>范儿</name><uri>http://www.blogger.com/profile/01229356702532235671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986490075995203742.post-1319624098810606348</id><published>2009-02-22T23:54:00.003+08:00</published><updated>2009-02-22T23:58:45.210+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='事件对象'/><title type='text'>获取鼠标位置</title><content type='html'>&lt;p&gt;获取鼠标位置，就是获取event对象的坐标属性，先看看如何获取event对象。在W3C的模型中，把参数传递的第一个参数当作当前的event对象，在MSIE的模型中，总是window.event。&lt;/p&gt;
&lt;pre class="prettyprint"&gt;
function myfunc(e) {
  var e = e || window.event;//如果e不存在，则获取window.event
}
&lt;/pre&gt;
&lt;p&gt;event对象的坐标属性pageX, pageY分别是当前鼠标相对body的X, Y的坐标值，但是在IE中没有pageX和pageY，不过可以通过clientX, clientY加上scrollTop, scrollLeft的值来确定当前鼠标的位置。clientX, clientY是当前鼠标相对window的坐标值。代码：&lt;/p&gt;
&lt;pre class="prettyprint"&gt;
function mouseCoords(e){
 if(e.pageX || e.pageY){//标准浏览器返回当前鼠标坐标值
  return {x:e.pageX, y:e.pageY};
 }
 else if(e.clientX || e.clientY) {//仅IE返回回当前鼠标坐标值
  return {
   x:(e.clientX + document.documentElement.scrollLeft + document.body.scrollLeft),
   y:(e.clientY + document.documentElement.scrollTop  + document.body.scrollTop)
  }
 }
}
function mouseMove(e){
 e = e || window.event;
 var mousePos = mouseCoords(e);//这里mousePos.x, mousePos.y分别为鼠标的X, Y坐标值
}
&lt;/pre&gt;
&lt;p&gt;以上代码中发现一个兼容性问题，如果文档声明为XHTML，document.body.scrollTop的值始终为0，所以在XHTML文档声明的时候，只能用document.documentElement.scrollTop。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986490075995203742-1319624098810606348?l=fanlog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fanlog.blogspot.com/feeds/1319624098810606348/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://fanlog.blogspot.com/2009/02/blog-post_22.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986490075995203742/posts/default/1319624098810606348'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986490075995203742/posts/default/1319624098810606348'/><link rel='alternate' type='text/html' href='http://fanlog.blogspot.com/2009/02/blog-post_22.html' title='获取鼠标位置'/><author><name>范儿</name><uri>http://www.blogger.com/profile/01229356702532235671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986490075995203742.post-2144702212873476865</id><published>2009-02-19T21:10:00.002+08:00</published><updated>2009-02-20T02:00:27.163+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='易用性'/><title type='text'>爸妈学电脑</title><content type='html'>&lt;p&gt;我真的没想到，难倒爸妈学习电脑，不是windows操作系统的各种&lt;strong&gt;按钮&lt;/strong&gt;以及各种&lt;strong&gt;术语&lt;/strong&gt;，也不是windows的难以理解的&lt;strong&gt;文件管理系统&lt;/strong&gt;。真正让他们头疼的是&lt;strong&gt;密密麻麻的键盘&lt;/strong&gt;和难以操作的&lt;strong&gt;双键鼠标&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;爸妈两个人几乎都无法适应鼠标的两个键操作，经常误击鼠标的右键。教他们的同时，我不得不想到苹果电脑的单键鼠标。80年代Apple公司的GUI操作系统及Windows的视窗普及之后，鼠标也随着普及，80年代至今，鼠标经历了滑动机械鼠标、光电鼠标等等。当然鼠标的形状及手感也越来越舒适，可是鼠标上的按键越来越复杂。这也怪不了我的爸妈用起来鼠标来那么吃力，苹果电脑的单键鼠标这么多年，从OS 8.6已经支持鼠标右键菜单，可是苹果一直随箱附送单键鼠标，&lt;a href="http://bbs.wdou.cn/thread-25428-1-1.html" title="苹果为何要坚持使用单键鼠标？"&gt;这里&lt;/a&gt;有一篇文章很有意思，可见苹果的设计师很多年前就碰到过我爸妈这样的用户。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986490075995203742-2144702212873476865?l=fanlog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fanlog.blogspot.com/feeds/2144702212873476865/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://fanlog.blogspot.com/2009/02/blog-post.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986490075995203742/posts/default/2144702212873476865'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986490075995203742/posts/default/2144702212873476865'/><link rel='alternate' type='text/html' href='http://fanlog.blogspot.com/2009/02/blog-post.html' title='爸妈学电脑'/><author><name>范儿</name><uri>http://www.blogger.com/profile/01229356702532235671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986490075995203742.post-3274462067579980155</id><published>2009-02-16T23:08:00.001+08:00</published><updated>2009-02-16T23:09:56.719+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='haslayout'/><category scheme='http://www.blogger.com/atom/ns#' term='css'/><title type='text'>弄懂IE的haslayout（一）</title><content type='html'>&lt;p&gt;&lt;strong&gt;haslayout到底是什么？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;haslayout是IE的私有概念，HTML部分元素默认拥有haslayout，而通过部分的CSS，可以给haslayout不为true的HTML元素触发为true。也就是说，如果某个HTML元素拥有haslayout属性，那么这个元素的haslayout的值一定只有true，否则，这个元素就没有haslayout，haslayout一旦被触发，就不可以逆转，haslayout为只读属性。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;查看haslayout的值&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;通过&lt;a href="http://www.google.com/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=1&amp;amp;url=http%3A%2F%2Fwww.microsoft.com%2FdownloadS%2Fdetails.aspx%3Ffamilyid%3DE59C3964-672D-4511-BB3E-2D5E1DB91038&amp;amp;ei=LHuZScqyIIPQkAWSg628Cw&amp;amp;usg=AFQjCNHRvU8zDeZeqx-y6oM9liTkPrGZGA&amp;amp;sig2=BCxeaJTvZu8_fgdp7efU-Q"&gt;IE Developer Toolbar&lt;/a&gt;可以查看IE下HTML元素是否拥有haslayout，在IE Developer Toolbar下，拥有haslayout的元素，通常显示为“haslayout = -1”。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;那些HTML元素默认拥有haslayout？&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;
&amp;lt;html&amp;gt;, &amp;lt;body&amp;gt;
&amp;lt;table&amp;gt;, &amp;lt;tr&amp;gt;, &amp;lt;th&amp;gt;, &amp;lt;td&amp;gt;
&amp;lt;img&amp;gt;
&amp;lt;hr&amp;gt;
&amp;lt;input&amp;gt;, &amp;lt;select&amp;gt;, &amp;lt;textarea&amp;gt;, &amp;lt;button&amp;gt;
&amp;lt;iframe&amp;gt;, &amp;lt;embed&amp;gt;, &amp;lt;object&amp;gt;, &amp;lt;applet&amp;gt;
&amp;lt;marquee&amp;gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;在IE下，哪些CSS属性可以触发haslayout为true?&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;
IE6:
position: absolute, float: left|right, display: inline-block, width: 任意值, height: 任意值, zoom: 任意值
IE7:
overflow: hidden|scroll|auto, position: fixed, min-width: 任意值, max-width: 除 none 之外的任意值, min-height: 任意值, max-height: 除 none 之外的任意值
&lt;/pre&gt;
&lt;p&gt;那么，了解haslayout有何意义呢？haslayout可以解决IE很多奇怪的bug和渲染bug，通常通过触发haslayout为true来解决。接下来，就了解下因为haslayout的临床表现：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://fks1945.googlepages.com/demo_haslayout_margin.html"&gt;负边框问题&lt;/a&gt;，下载这个demo然后去掉IE6注释，对比标准浏览器和IE6下不同的表现，并且用IE develop toolbar查看不同表现的HTML元素的haslayout。&lt;/li&gt;
&lt;li&gt;滤镜，IE的私有滤镜只有在元素被触发haslayout后，滤镜才会被执行。&lt;/p&gt;
&lt;/ul&gt;
&lt;p&gt;未完待续。。。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986490075995203742-3274462067579980155?l=fanlog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fanlog.blogspot.com/feeds/3274462067579980155/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://fanlog.blogspot.com/2009/02/iehaslayout.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986490075995203742/posts/default/3274462067579980155'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986490075995203742/posts/default/3274462067579980155'/><link rel='alternate' type='text/html' href='http://fanlog.blogspot.com/2009/02/iehaslayout.html' title='弄懂IE的haslayout（一）'/><author><name>范儿</name><uri>http://www.blogger.com/profile/01229356702532235671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986490075995203742.post-6050038695286654541</id><published>2009-01-11T00:31:00.003+08:00</published><updated>2009-01-11T02:00:13.690+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='position'/><category scheme='http://www.blogger.com/atom/ns#' term='fixed'/><category scheme='http://www.blogger.com/atom/ns#' term='IE6'/><category scheme='http://www.blogger.com/atom/ns#' term='css'/><title type='text'>IE6实现positon:fixed</title><content type='html'>&lt;p&gt;HTML代码：&lt;/p&gt;
&lt;pre class="prettyprint"&gt;
&amp;lt;div id="userPanel"&amp;gt;
 &amp;lt;h2&amp;gt;user panel&amp;lt;/h2&amp;gt;
 &amp;lt;ul&amp;gt;
  &amp;lt;li&amp;gt;&amp;lt;a href="#"&amp;gt;list item&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
  &amp;lt;li&amp;gt;&amp;lt;a href="#"&amp;gt;list item&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
  &amp;lt;li&amp;gt;&amp;lt;a href="#"&amp;gt;list item&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
  &amp;lt;li&amp;gt;&amp;lt;a href="#"&amp;gt;list item&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
  &amp;lt;li&amp;gt;&amp;lt;a href="#"&amp;gt;list item&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
  &amp;lt;li&amp;gt;&amp;lt;a href="#"&amp;gt;list item&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
 &amp;lt;/ul&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;div id="wrap"&amp;gt;
 &amp;lt;div id="content"&amp;gt;
  &amp;lt;div class="text"&amp;gt;
   &amp;lt;p&amp;gt; text &amp;lt;/p&amp;gt;
   &amp;lt;p&amp;gt; text &amp;lt;/p&amp;gt;
   &amp;lt;p&amp;gt; text &amp;lt;/p&amp;gt;
   &amp;lt;p&amp;gt; text &amp;lt;/p&amp;gt;
  &amp;lt;/div&amp;gt;
 &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/pre&gt;
&lt;p&gt;CSS代码：&lt;/p&gt;
&lt;pre class="prettyprint"&gt;
#userPanel {
 width: 160px;
 padding: 10px;
 background-color: #EEE;
 position: fixed;
 top: 50px;
 left: 25px;
}


#top {
 padding: 5px 15px;
 background-color: #ffffbb;
 position: fixed;
 right: 0;
 bottom: 0;
}

#content {
 width: 550px;
 margin-left: 220px;
 background-color: #eee;
}

.text {
 height: 1000px;
}

/* IE 6 only
------------------------------------- */
* html, * html body {
 /overflow: auto;
 width: 100%;*/
 height: 100%;
}

* html #wrap {
 height: 100%;
 width: 100%;
 overflow: auto;
 overflow-y: scroll;
 position: relative;
}

* html #userPanel {
 position: absolute;
}

*html #top {
 position: absolute;
 right: 16px;
}
&lt;/pre&gt;
&lt;p&gt;demo&lt;a href="http://fks1945.googlepages.com/ie6-position-fixed.html"&gt;预览&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986490075995203742-6050038695286654541?l=fanlog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fanlog.blogspot.com/feeds/6050038695286654541/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://fanlog.blogspot.com/2009/01/ie6positonfixed.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986490075995203742/posts/default/6050038695286654541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986490075995203742/posts/default/6050038695286654541'/><link rel='alternate' type='text/html' href='http://fanlog.blogspot.com/2009/01/ie6positonfixed.html' title='IE6实现positon:fixed'/><author><name>范儿</name><uri>http://www.blogger.com/profile/01229356702532235671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986490075995203742.post-3461884722554932762</id><published>2009-01-09T00:59:00.004+08:00</published><updated>2009-01-09T11:24:34.242+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IE6 bug'/><category scheme='http://www.blogger.com/atom/ns#' term='zoom'/><category scheme='http://www.blogger.com/atom/ns#' term='css'/><title type='text'>解决IE6渲染BUG</title><content type='html'>&lt;p&gt;js操作DOM，有时候在IE6下简直就是噩梦，不渲染的解决方法通常都是zoom强制IE渲染来解决：&lt;/p&gt;
&lt;p&gt;javascript代码：&lt;/p&gt;
&lt;pre class="prettyprint"&gt;
document.body.style.zoom = 1.1;
document.body.style.zoom = '';
&lt;/pre&gt;
&lt;p&gt;以上代码事实上是迫使body在IE下重新执行CSS渲染，简单点理解——IE6碰到zoom值发生变化，就一定会重新渲染。事实上我经常用zoom来解决IE6下CSS渲染问题，如果容器出现怪异，加上zoom: 100%，IE6就乖乖的驯服。做个demo&lt;a href="http://sites.google.com/site/fkslabs/demo-manual/ie6_bug_zoom"&gt;下载&lt;/a&gt;(下载的文件请加上后缀.html)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986490075995203742-3461884722554932762?l=fanlog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fanlog.blogspot.com/feeds/3461884722554932762/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://fanlog.blogspot.com/2009/01/ie6bug.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986490075995203742/posts/default/3461884722554932762'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986490075995203742/posts/default/3461884722554932762'/><link rel='alternate' type='text/html' href='http://fanlog.blogspot.com/2009/01/ie6bug.html' title='解决IE6渲染BUG'/><author><name>范儿</name><uri>http://www.blogger.com/profile/01229356702532235671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986490075995203742.post-5937370990475900929</id><published>2009-01-08T23:49:00.000+08:00</published><updated>2009-01-09T00:20:09.448+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='html'/><category scheme='http://www.blogger.com/atom/ns#' term='css'/><title type='text'>HTML、CSS设计应该注意的细节</title><content type='html'>&lt;p&gt;细节容易忽视，但是却很容易影响视觉美感，或者影响用户的体验，在使用HTML、CSS设计页面时，下面这些细节一定要注意到：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;body中定义中文字体，一定使用中文用户最普遍的字体，宋体一定不小于12像素，否则都会让用户阅读时视觉疲劳，当然也影响美观。关于字体size，建议使用em作为单位。&lt;/li&gt;
&lt;li&gt;如果列表条目链接有截断完整句子，那么在链接一定记得在&lt;code&gt;title&lt;/code&gt;内留下完整的信息。&lt;/li&gt;
&lt;li&gt;H1标签使用千万小心，公用的head区域不使用H1标签，否则所有使用了公用head的页面H1标题一样，这样不利用SEO。&lt;/li&gt;
&lt;li&gt;编码，这是老问题了，有时候切换不同的IDE编辑文件，更要注意。&lt;/li&gt;
&lt;li&gt;a链接请与普通文本区分开来，如果a:link状态是无下划线状态，那么请把a:hover状态加上下划线，链接就是链接。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;暂时想到这么多，以后慢慢补充。&lt;span style='color:#fff'&gt;doubanclaimad330bed027d67fc&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986490075995203742-5937370990475900929?l=fanlog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fanlog.blogspot.com/feeds/5937370990475900929/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://fanlog.blogspot.com/2009/01/htmlcss.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986490075995203742/posts/default/5937370990475900929'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986490075995203742/posts/default/5937370990475900929'/><link rel='alternate' type='text/html' href='http://fanlog.blogspot.com/2009/01/htmlcss.html' title='HTML、CSS设计应该注意的细节'/><author><name>范儿</name><uri>http://www.blogger.com/profile/01229356702532235671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986490075995203742.post-2006799422956318571</id><published>2009-01-08T17:05:00.000+08:00</published><updated>2009-01-08T17:11:05.035+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='css'/><title type='text'>[转]scrollLeft,scrollWidth,clientWidth等详解</title><content type='html'>&lt;ul&gt;
&lt;li&gt;scrollHeight: 获取对象的滚动高度。&lt;/li&gt;
&lt;li&gt;scrollLeft:设置或获取位于对象左边界和窗口中目前可见内容的最左端之间的距离&lt;/li&gt;
&lt;li&gt;scrollTop:设置或获取位于对象最顶端和窗口中可见内容的最顶端之间的距离&lt;/li&gt;
&lt;li&gt;scrollWidth:获取对象的滚动宽度&lt;/li&gt;
&lt;li&gt;offsetHeight:获取对象相对于版面或由父坐标 offsetParent 属性指定的父坐标的高度&lt;/li&gt;
&lt;li&gt;offsetLeft:获取对象相对于版面或由 offsetParent 属性指定的父坐标的计算左侧位置&lt;/li&gt;
&lt;li&gt;offsetTop:获取对象相对于版面或由 offsetTop 属性指定的父坐标的计算顶端位置&lt;/li&gt;
&lt;li&gt;event.clientX 相对文档的水平座标&lt;/li&gt;
&lt;li&gt;event.clientY 相对文档的垂直座标&lt;/li&gt;
&lt;li&gt;event.offsetX 相对容器的水平坐标&lt;/li&gt;
&lt;li&gt;event.offsetY 相对容器的垂直坐标&lt;/li&gt;
&lt;li&gt;document.documentElement.scrollTop 垂直方向滚动的值&lt;/li&gt;
&lt;li&gt;event.clientX+document.documentElement.scrollTop相对文档的水平座标+垂直方向滚动的量&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以上主要指IE之中，FireFox差异如下：&lt;/p&gt;
&lt;p&gt;IE6.0、FF1.06+：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;clientWidth = width + padding&lt;/li&gt;
&lt;li&gt;clientHeight = height + padding&lt;/li&gt;
&lt;li&gt;offsetWidth = width + padding + border&lt;/li&gt;
&lt;li&gt;offsetHeight = height + padding + border&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;IE5.0/5.5：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;clientWidth = width - border&lt;/li&gt;
&lt;li&gt;clientHeight = height - border&lt;/li&gt;
&lt;li&gt;offsetWidth = width&lt;/li&gt;
&lt;li&gt;offsetHeight = height&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;(需要提一下：CSS中的margin属性，与clientWidth、offsetWidth、clientHeight、offsetHeight均无关)&lt;/p&gt;
&lt;span class='hidden'&gt;doubanclaimad330bed027d67fc&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986490075995203742-2006799422956318571?l=fanlog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fanlog.blogspot.com/feeds/2006799422956318571/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://fanlog.blogspot.com/2009/01/scrollleftscrollwidthclientwidth.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986490075995203742/posts/default/2006799422956318571'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986490075995203742/posts/default/2006799422956318571'/><link rel='alternate' type='text/html' href='http://fanlog.blogspot.com/2009/01/scrollleftscrollwidthclientwidth.html' title='[转]scrollLeft,scrollWidth,clientWidth等详解'/><author><name>范儿</name><uri>http://www.blogger.com/profile/01229356702532235671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986490075995203742.post-2877963582544767942</id><published>2009-01-08T16:25:00.000+08:00</published><updated>2009-01-08T16:49:29.385+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='submit into iframe'/><title type='text'>用隐藏的iframe提交表单</title><content type='html'>&lt;p&gt;AJAX无法上传文件是很头疼的事情，不过我们可以用隐藏在页面上的iframe提交，这里讨论的是用iframe提交表单之后，如果获取返回数据。&lt;/p&gt;
&lt;p&gt;HTML代码片断：&lt;/p&gt;
&lt;pre class="prettyprint"&gt;
form method="post" action="upload_file" target="hiddenFrame"&gt;

form的target指向iframe，通过iframe提交表单
&lt;/pre&gt;
&lt;p&gt;Javascript代码：&lt;/p&gt;
&lt;pre class="prettyprint"&gt;
function uploadFile() {
  $('hiddenFrame').onreadystatechange = $('hiddenFrame').onload = function() {
      if(this.readyState &amp;amp;&amp;amp; this.readyState!= 'complete') {return;} //readyState判断iframe内容是否改变

      //获取iframe dom
      var frameBody = top.frames[0];
      if(!frameBody) return;
      frameBody = frameBody.document;
      if(!frameBody) return;        
      frameBody = frameBody.getElementsByTagName('body');
      if(!frameBody) return;
      frameBody = frameBody[0];
      if (!frameBody) return;
  }
}
&lt;/pre&gt;
&lt;p&gt;以上代码是通过DOM获取iframe的body下返回的数据，数据可以是文本，也可以是JSON格式，如果是JSON格式，就需要&lt;code&gt;evel()&lt;/code&gt;来解释。这种方法是在页面上写静态的iframe，复杂一点可以在页面上用JS创建iframe，不过考虑到可用性，建议还是在页面上写静态的iframe。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986490075995203742-2877963582544767942?l=fanlog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fanlog.blogspot.com/feeds/2877963582544767942/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://fanlog.blogspot.com/2009/01/iframe.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986490075995203742/posts/default/2877963582544767942'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986490075995203742/posts/default/2877963582544767942'/><link rel='alternate' type='text/html' href='http://fanlog.blogspot.com/2009/01/iframe.html' title='用隐藏的iframe提交表单'/><author><name>范儿</name><uri>http://www.blogger.com/profile/01229356702532235671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1986490075995203742.post-3464340692733094836</id><published>2009-01-08T13:32:00.000+08:00</published><updated>2009-01-08T16:12:28.882+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><title type='text'>封装鼠标跟随tips</title><content type='html'>&lt;p&gt;刚学习prototype.js的时候写的一个鼠标跟随提示的代码，后来在项目中发现一个很严重的问题，暂时没有修正。代码基于prototype.js v1.6。&lt;/p&gt;
&lt;p&gt;代码打包&lt;a href="http://sites.google.com/site/fkslabs/demo-manual/tips-demo.zip"&gt;下载&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Javascript代码:&lt;/p&gt;
&lt;pre class='prettyprint'&gt;function handleTips(idElement) {
    this.handleBtn = (typeof idElement == 'string')? $(idElement) : idElement;
    this.popuptips = (typeof idElement == 'string')? $(idElement + "-tips") : idElement.id + "tips";
   
    this.handleBtn.onmouseover = this.showTips.bind(this);
    this.handleBtn.onmouseout = this.hiddenTips.bind(this);
    this.handleBtn.onmousemove = this.cursorPosition.bind(this);
}

handleTips.prototype.showTips = function() {
 //debugger;
 Element.show(this.popuptips);
 this.cursorPosition(arguments[0]);
}

handleTips.prototype.hiddenTips = function() {
        Element.hide(this.popuptips);
}

handleTips.prototype.cursorPosition = function(){
 
    var event = arguments[0] || window.event;
    this.arrPageSize = getPageSize();
    this.pageWidth = this.arrPageSize.PageWidth;
    this.pageHeight = this.arrPageSize.PageHeight;

   
    this.leftSpace = Event.pointerX(event) + 20;
    this.topSpace = Event.pointerY(event) + 20;

    this.rightSpace = this.pageWidth - this.leftSpace;
    this.bottomSpace = this.pageHeight - this.topSpace;
   
    this.tipsWidth = this.popuptips.getWidth();
    this.tipsHeight = this.popuptips.getHeight();

   
    if (this.tipsWidth &lt; this.rightSpace &amp;&amp; this.tipsHeight &lt; this.bottomSpace) {
        this.popuptips.setStyle({
            left: Event.pointerX(event) + 20 + "px",
            top: Event.pointerY(event) + 20 + "px"
        });
    } else if(this.tipsWidth &gt; this.rightSpace &amp;&amp; this.tipsHeight &lt; this.bottomSpace) {
        this.popuptips.setStyle({
            left: Event.pointerX(event) - this.tipsWidth - 20 + "px",
            top: Event.pointerY(event) + 20 + "px"
        });
    } else if(this.tipsWidth &lt; this.rightSpace &amp;&amp; this.tipsHeight &gt; this.bottomSpace) {
        this.popuptips.setStyle({
            left: Event.pointerX(event) + 20 + "px",
            top: Event.pointerY(event) - this.tipsHeight - 20 + "px"
        });
    } else if(this.tipsWidth &gt; this.rightSpace &amp;&amp; this.tipsHeight &gt; this.bottomSpace) {
        this.popuptips.setStyle({
            left: Event.pointerX(event) - this.tipsWidth - 20 + "px",
            top: Event.pointerY(event) - this.tipsHeight - 20 + "px"
        });
    }
}


function getPageSize() {
    var scrW, scrH;
    if(window.innerHeight &amp;&amp; window.scrollMaxY) {
        // Mozilla
        scrW = window.innerWidth + window.scrollMaxX;
        scrH = window.innerHeight + window.scrollMaxY;
    } else if(document.body.scrollHeight &gt; document.body.offsetHeight){
        // all but IE Mac
        scrW = document.body.scrollWidth;
        scrH = document.body.scrollHeight;
    } else if(document.body) {
        // IE Mac
        scrW = document.body.offsetWidth;
        scrH = document.body.offsetHeight;
    }
   
    var winW, winH;
    if(window.innerHeight) {
        // all except IE
        winW = window.innerWidth;
        winH = window.innerHeight;
    } else if (document.documentElement &amp;&amp; document.documentElement.clientHeight) {
        // IE 6 Strict Mode
        winW = document.documentElement.clientWidth;
        winH = document.documentElement.clientHeight;
    } else if (document.body) { // other
        winW = document.body.clientWidth;
        winH = document.body.clientHeight;
    }
   
    // for small pages with total size less then the viewport
    var pageW = (scrW &lt; winW) ? winW : scrW;
    var pageH = (scrH &lt; winH) ? winH : scrH;
   
    return {PageWidth:pageW, PageHeight:pageH, WinWidth:winW, WinHeight:winH};
}

Event.observe(window, 'load', function() {new handleTips('note')});&lt;/pre&gt;&lt;p&gt;CSS代码:&lt;/p&gt;&lt;pre class='prettyprint'&gt;.tips {
    position: absolute;
    z-index: 9999;
    padding: 5px;
    background-color: #FFFFFF;
    border: 1px solid #FF6600;
}

#note {
 margin: 100px 0 0 300px;
}

#note-tips {
 width: 120px;
}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1986490075995203742-3464340692733094836?l=fanlog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fanlog.blogspot.com/feeds/3464340692733094836/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://fanlog.blogspot.com/2009/01/tips.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1986490075995203742/posts/default/3464340692733094836'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1986490075995203742/posts/default/3464340692733094836'/><link rel='alternate' type='text/html' href='http://fanlog.blogspot.com/2009/01/tips.html' title='封装鼠标跟随tips'/><author><name>范儿</name><uri>http://www.blogger.com/profile/01229356702532235671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
