<?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>Lefter &#187; 前端开发&amp;架构</title>
	<atom:link href="http://lefter.net/blog/category/web-dev/feed/" rel="self" type="application/rss+xml" />
	<link>http://lefter.net/blog</link>
	<description>blog of lefter</description>
	<lastBuildDate>Mon, 23 Nov 2009 10:27:56 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>CSS,JS文件压缩工具</title>
		<link>http://lefter.net/blog/compressor/</link>
		<comments>http://lefter.net/blog/compressor/#comments</comments>
		<pubDate>Mon, 23 Nov 2009 10:27:56 +0000</pubDate>
		<dc:creator>lujo</dc:creator>
				<category><![CDATA[前端开发&架构]]></category>
		<category><![CDATA[程序相关]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[yuicompressor]]></category>

		<guid isPermaLink="false">http://lefter.net/blog/?p=1122</guid>
		<description><![CDATA[js/css文件常见的压缩工具有：		

			YUIcompressor GUI TBcompressor
			ESC(ECMAScript cruncher)
			JSmin
  GUI:JsMinGUI
			Dojo ShrinkSafe
			在线Js压缩
			Google Closure compiler   Closure Tools			
打包下载地址
		
Yuicompre... ]]></description>
			<content:encoded><![CDATA[<h4>js/css文件常见的压缩工具有：</h4>		
<ul>
			<li><a href="http://yuilibrary.com/downloads/#yuicompressor">YUIcompressor</a><sup> GUI TBcompressor</sup></li>
			<li><a href="http://www.saltstorm.net/depo/esc/">ESC(ECMAScript cruncher)</a></li>
			<li><a href="http://www.crockford.com/javascript/jsmin.html">JSmin</a>
 <sup> GUI:JsMinGUI</sup></li>
			<li><a href="http://www.dojotoolkit.org/docs/shrinksafe">Dojo ShrinkSafe</a></li>
			<li><a href="http://dean.edwards.name/packer/">在线Js压缩</a></li>
			<li><a href="http://code.google.com/closure/compiler/">Google Closure compiler</a>  <sup> <a href="http://code.google.com/closure/">Closure Tools</a></sup></li>			
<li><strong><a href="http://lefter.googlecode.com/files/JS-css%E5%8E%8B%E7%BC%A9%E5%B7%A5%E5%85%B7.7z">打包下载地址</a></strong></li>
		</ul>
<h4>Yuicompressor的用法</h4>
<pre><code>java -jar D:\yuicompressor-2.4.2\build\yuicompressor-2.4.2.jar 
--charset UTF-8 D:\my.js -o D:\my-min.js
	
java -jar D:\yuicompressor-2.4.2\build\yuicompressor-2.4.2.jar 
--charset UTF-8 D:\my.css -o D:\my-min.css 
</code></pre>
<p>具体语法和其他参数参考：<a href="http://www.julienlecomte.net/yuicompressor/">julienlecomte Yuicompressor</a>。 也可以写一个批处理文件<a href="http://hi.baidu.com/wymwon/blog/item/f060cd6e868b6adc80cb4a6f.html">具体格式</a>，同时处理多个文件，例如:将D盘中的WEBsite文件夹下的所有.CSS , .JS文件进行压缩</p>
<pre><code>@echo off
::设置YUI Compressor启动目录
SET YUIFOLDER=D:\yuicompressor-2.4.2\build
::设置你的JS和CSS根目录，脚本会自动按树层次查找和压缩所有的JS和CSS
SET JSFOLDER=D:\WEBsite
echo look for JavaScript, CSS ...
chdir /d %JSFOLDER%
for /r . %%a in (*.js *.css) do (
@echo It's compressing  %%~a ...
@java -jar %YUIFOLDER%\yuicompressor-2.4.2.jar --charset UTF-8 %%~fa -o %%~fa
 )
@echo OK!
pause &amp; exit</code></pre>
<h4>ESC(ECMAScript cruncher)</h4>
<p>这个工具只能在Windows下使用,ESC.wsf提供5种压缩级别，从0到4：<br/>
Level 0 :: No compression 不对JS文件进行压缩<br/>
Level 1 :: Comment removal 移除JS文件中的注释<br/>
Level 2 :: Whitespace removal 移除JS文件中的注释及空行（默认，一般选择此级别就足够了）<br/>
Level 3 :: Newline removal 移除JS文件中的注释，将所有代码合并为一行<br/>
Level 4 :: Variable substitution 提供最新的压缩率，移除JS文件中的注释，将所有代码合并为一行，并且修改JS文件中的变量名。例如：将"big.js"按照压缩级别2来压缩（ESC.wsf默认压缩级别为2）为"min.js"</p>
<pre><code>cscript ESC.wsf -ow min.js big.js </code></pre>
<h4>Google Closure Tools 包含三大块</h4>
<ol>
<li><a href="http://code.google.com/closure/compiler/">Closure Compiler</a>：这是个JavaScript优化器，可以将JavaScript编译成压缩的、高性能代码。它除了能移除无效代码，重写代码使其最小化且运行更快，还能检查语法、变量引用和类型，并对一些常见JavaScript错误提出警告。同时，它还提供了Closure Inspector（一个Firefox插件）用于调试编译后的代码。<a href="http://closure-inspector.googlecode.com/files/closureinspector09.xpi">FireFox插件</a></li>
<li><a href="http://code.google.com/closure/library/">Closure Library</a>：这是个广泛的、经过良好测试、模块化且跨浏览器的JavaScript库。在例子中可以看到，Google Docs就是用这个库写的。</li>
<li><a href="http://code.google.com/closure/templates/">Closure Templates</a>：这是一个为Java和JavaScript实现的模板系统，可在服务器和客户端使用相同的模板。值得一提的是，JavaScript模板会进行预编译处理，以提高其性能。此外，Gmail和Google Docs也是使用该模板系统。</li>
</ol>]]></content:encoded>
			<wfw:commentRss>http://lefter.net/blog/compressor/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>让IE支持HTML5的两种方案</title>
		<link>http://lefter.net/blog/ie_html5/</link>
		<comments>http://lefter.net/blog/ie_html5/#comments</comments>
		<pubDate>Mon, 28 Sep 2009 06:41:03 +0000</pubDate>
		<dc:creator>lefter</dc:creator>
				<category><![CDATA[前端开发&架构]]></category>
		<category><![CDATA[ie]]></category>
		<category><![CDATA[semantic]]></category>

		<guid isPermaLink="false">http://lefter.net/blog/?p=1069</guid>
		<description><![CDATA[

HTML5 最主要的特性就是加入了更加具有语义的标签比如：嵌入音频、视频、图片的函数、客户端数据存储，以及交互式文档，和页面元素，比如 header, section, footer, figure等。更详细的介绍可... ]]></description>
			<content:encoded><![CDATA[<img src="/blog/wp-content/uploads/2009/09/structure-html5.gif" alt="structure-html5" title="html5"/>
<p>
<a href="http://www.w3.org/TR/html5/">HTML5</a> 最主要的特性就是加入了更加具有语义的标签比如：嵌入音频、视频、图片的函数、客户端数据存储，以及交互式文档，和页面元素，比如 header, section, footer, figure等。更详细的介绍可以看下面几篇文章的介绍:
<br/><a href="http://www.alistapart.com/articles/previewofhtml5/">A Preview of HTML 5</a>
<br/><a href="http://articles.sitepoint.com/article/html-5-snapshot-2009/">Yes, You Can Use HTML 5 Today!</a>
<br/><a href="http://www.w3.org/TR/html5/">W3C HTML5</a>
</p>
<p>但IE不支持HTML5这些有用的标签，<a href="http://www.w3.org/TR/html5/">HTML5</a>,有两种方法让IE支持HTML5.</p>
<h3>1.用 Google Chrome Frame插件</h3>
<p>这中方法没什么好说的，参见<a href="http://code.google.com/chrome/chromeframe/">Google Chrome Frame</a>的说明。</p>
<h3>2.用JS将HTML5增加的标签创建出来</h3>
<pre><code>&lt;script>
var html5Tags=['header' ,'footer','article','nav' ,'section','aside']
for(var i=0;i&lt;html5Tags.length;i++){
    document.createElement(html5Tags[i]);
}
&lt;/script>
</code></pre>
<p><strong><a href="/demo/ie_html5.htm">查看演示</a></strong></p>
<ins datetime="2009-09-28T06:31:32+00:00">今天才发现这个方法早就有人这样实施了:</ins><a href="http://www.fofronline.com/2009-06/moving-markup-towards-html5/">Moving markup towards HTML5</a>]]></content:encoded>
			<wfw:commentRss>http://lefter.net/blog/ie_html5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>小窗口的的浏览体验</title>
		<link>http://lefter.net/blog/minify_view/</link>
		<comments>http://lefter.net/blog/minify_view/#comments</comments>
		<pubDate>Sat, 19 Sep 2009 03:58:56 +0000</pubDate>
		<dc:creator>lujo</dc:creator>
				<category><![CDATA[体验&交互&平面&策划]]></category>
		<category><![CDATA[前端开发&架构]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[ue]]></category>

		<guid isPermaLink="false">http://lefter.net/blog/?p=1026</guid>
		<description><![CDATA[小窗口的的浏览体验是必须的，在保证页面内容的完整性的前提下，满足多终端设备的访问，细小部分的处理更能体现一个企业的水准。出现小窗口浏览的情形有很多，比如和女朋友抢电脑用... ]]></description>
			<content:encoded><![CDATA[小窗口的的浏览体验是必须的，在保证页面内容的完整性的前提下，满足多终端设备的访问，细小部分的处理更能体现一个企业的水准。出现小窗口浏览的情形有很多，比如和女朋友抢电脑用的时候，女朋友要看电影，用户要看新闻，在难分高下的时候只能“AA”，因此浏览新闻就只能缩小窗口了：）
<br/><strong>看了一下国内网站（满屏自适应部分）基本上没有考虑这点</strong>
<img src="/blog/wp-content/uploads/2009/09/tenPay_full.gif" alt="tenPay_full" title="tenPay_full" />
<img src="/blog/wp-content/uploads/2009/09/tenPay_minify.gif" alt="tenPay_minify" title="tenPay_minify" />
<img src="/blog/wp-content/uploads/2009/09/baidu.gif" alt="baidu" title="baidu" />
<img src="/blog/wp-content/uploads/2009/09/baidu_full.gif" alt="baidu_full" title="baidu_full" />
<img src="/blog/wp-content/uploads/2009/09/taobao.gif" alt="taobao" title="taobao" />
<img src="/blog/wp-content/uploads/2009/09/qq.gif" alt="qq" title="qq"  />
<strong>再看Yahoo</strong>最上面的提示条满屏的时候是100%，占据整个宽度
<img src="/blog/wp-content/uploads/2009/09/yahoo.gif" alt="yahoo" title="yahoo" />
缩小的时候页面内容完整，布局没有错乱
<img src="/blog/wp-content/uploads/2009/09/yahoo_small.gif" alt="yahoo_small" title="yahoo_small" />
<p>对于块级元素,宽度默认会继承父级的宽度也就是100%（内联元素没有宽度，即使定义了也无效），而最外层元素HTML的宽度一般是随窗口的改变而改变的(改变窗口大小再点击下面代码)</p>
<pre><code>alert(document.body.offsetWidth + "px")</code></pre>
<p>YAHOO的做法是为满屏的元素（顶部提示条）加上min-width ,IE6不支持此属性不知道是YAHOO是怎么解决的，但是让IE6支持min-width实现方法可以用执行表达式 Expression:</p>
<pre><code>width:expression((documentElement.clientWidth &lt; 400) ? "400px" : "auto" )</code></pre>
<p>另一种方法是用border-width来模拟</p>
<pre><code>* html .minwidth { 
	border-left:600px solid #fff; float:left
}
* html .container { 
	margin-left:-600px; float:left;	 position:relative;
}</code></pre>
<p><strong><a href="/demo/ie6_min-width.htm">查看演示</a></strong></p>]]></content:encoded>
			<wfw:commentRss>http://lefter.net/blog/minify_view/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Marking up content with RDFa</title>
		<link>http://lefter.net/blog/about_rdfa/</link>
		<comments>http://lefter.net/blog/about_rdfa/#comments</comments>
		<pubDate>Sat, 19 Sep 2009 03:05:53 +0000</pubDate>
		<dc:creator>lujo</dc:creator>
				<category><![CDATA[前端开发&架构]]></category>
		<category><![CDATA[semantic]]></category>

		<guid isPermaLink="false">http://lefter.net/blog/?p=1024</guid>
		<description><![CDATA[
上图左边是代理对页面的理解，右边是人的理解，代理可读的和人类可读的数据之间的关联是相当少的，结果就是现在的浏览器在解析和处理web数据上的能力很差，因为浏览器更多的功能是负... ]]></description>
			<content:encoded><![CDATA[<a href="http://www.w3.org/TR/rdfa-syntax/"><img src="/blog/wp-content/uploads/2009/09/presentation-vs-semantics.png" alt="presentation-vs-semantics" title="presentation-vs-semantics" /></a>
<p>上图左边是代理对页面的理解，右边是人的理解，代理可读的和人类可读的数据之间的关联是相当少的，结果就是现在的浏览器在解析和处理web数据上的能力很差，因为浏览器更多的功能是负责展示这些信息。因此为了耦合人类和机器的理解可以通过为一些可视化的数据提供一系列的XHML属性而使得这些数据可以被机器所理解，让页面更有语意<a href="http://www.w3.org/TR/rdfa-syntax/">RDFa</a>就是一种解决办法,（还有<a href="/blog/microformats_web/">微格式-Microformats</a>）</p>
<p><a href="http://www.w3.org/TR/rdfa-syntax/">RDFa</a> “Resource Description Framework in attributes” 即资源描述框架，其应用格式可以参见<a href="http://www.w3.org/TR/rdfa-syntax/">W3C</a>。例如为了表明h2代表页面的标题而h3代表作者可以用RDFa这样描述：</p>
<pre><code>&lt;div xmlns:dc="http://purl.org/dc/elements/1.1/">
   &lt;h2 property="dc:title">Marking up content with RDFa&lt;/h2>
   &lt;h3 property="dc:creator">Lefter&lt;/h3>
&lt;/div>
</code></pre>
<p>为什么要用dc:creator和dc:title而不简单地用creator和title呢？这是因为XHTML并没有为这两个概念保留关键词；而xmlns:dc="http://purl.org/dc/elements/1.1/ 个人理解有点类似XML的命名空间,RDFa还提供了@property 来自定义属性因此也可以简写为：</p>
<pre><code>&lt;h2 property="title">RDFa: Now everyone can have an API&lt;/h2>
&lt;h3 property="creator">Lefter&lt;/h3>
</code></pre>
<strong>可以看出其优势为</strong>
<ul>
<li>增强的搜索功能</li>
<li>用户自定义，可扩展性</li>
<li>数据再利用性</li>
<li>自我控制</li>
<li>模块化架构</li>
<li>更具可访问性</li>
</ul>
<strong>推荐阅读</strong>
<ul>
<li><a href="http://www.w3.org/TR/rdfa-syntax/">W3C RDFa in XHTML</a></li>
<li><a href="http://www.w3.org/TR/xhtml-rdfa-primer/">W3C xhtml rdfa primer</a></li>
<li><a href="http://www.w3.org/MarkUp/2009/rdfa-for-html-authors">RDFa for HTML Authors</a></li>
<li><a href="http://www.alistapart.com/articles/introduction-to-rdfa/">alistapart introduction tordfa</a></li>
<li><a href="http://www.xml.com/pub/a/2007/02/14/introducing-rdfa.html">XML introduction tordfa</a></li>
<li><a href="http://www.google.com/support/webmasters/bin/answer.py?hl=en&#038;answer=146898">Google About RDFa</a></li>
<li><a href="http://en.wikipedia.org/wiki/RDFa/">wikipedia</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://lefter.net/blog/about_rdfa/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>用XBL实现FireFox连续字符自动换行</title>
		<link>http://lefter.net/blog/word-break_for_firefox/</link>
		<comments>http://lefter.net/blog/word-break_for_firefox/#comments</comments>
		<pubDate>Thu, 03 Sep 2009 10:03:26 +0000</pubDate>
		<dc:creator>lefter</dc:creator>
				<category><![CDATA[前端开发&架构]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[浏览器]]></category>

		<guid isPermaLink="false">http://lefter.net/blog/?p=973</guid>
		<description><![CDATA[一般来讲，在排版中,中文及一些亚洲国家的文字标点不会在每行的起始位置显示，一个完整的英文单词不会出现在两行中，因此当连续的文字过长是会破坏所在区域的布局；IE下有word-break和word... ]]></description>
			<content:encoded><![CDATA[<p>一般来讲，在排版中,中文及一些亚洲国家的文字标点不会在每行的起始位置显示，一个完整的英文单词不会出现在两行中，因此当连续的文字过长是会破坏所在区域的布局；IE下有<a href="http://www.w3.org/TR/css3-text/#word-wrap">word-break</a>和<a href="http://www.w3.org/TR/css3-text/#word-break">word-warp</a>来解决这个方法，但是Firefox不支持这两属性，用XBL能让Firefox达到相应的效果</p>
<p><a href="https://developer.mozilla.org/en/XBL">XBL</a>eXtensible Bindings Language也即是可扩展绑定语言,有点类似IE的HTC,HTC在CSS中的引用格式为：</p>
<pre><code>p{behavior:url(test.htc)}</code></pre>主要作用就是用来定义XUL组件的行为模式,XBL语法结构为：
<pre>
<code>&lt;?xml version="1.0"?>
&lt;bindings xmlns="http://www.mozilla.org/xbl">
  &lt;binding id="binding1">
    &lt;!-- content, property, method and event descriptions go here -->
  &lt;/binding>
  &lt;binding id="binding2">
    &lt;!-- content, property, method and event descriptions go here -->
  &lt;/binding>
&lt;/bindings>
</code>
</pre>
<p>
然后就可以通过Firefox的私有属性<a href="https://developer.mozilla.org/en/CSS/-moz-binding">-moz-binding</a> 将一个元素关联到一个XBL文件中的指定项上:</p>
<pre><code>p {
    -moz-binding:(url('lefter.net/demo/wordwrap.xml.xml#wordwrap');
}</code></pre>
<a href="/demo/FF_word_break.htm"><strong>Firefox演示效果</strong></a><br/>
<strong>推荐阅读</strong>
<ol>
<li><a href="https://developer.mozilla.org/en/CSS_Reference/Mozilla_Extensions">FireFox私有属性</a></li>
<li><a href="https://developer.mozilla.org/en/XBL">Firefox XBL</a></li>
<li><a href="http://blog.stchur.com/2007/02/22/emulating-css-word-wrap-for-mozillafirefox/">Emulating CSS word-wrap for Mozilla/Firefox</a></li>
<li><a href="http://www.hedgerwow.com/360/dhtml/css-word-break.html">Cross Browser Word Breaker</a></li>
<li><a href="http://dancewithnet.com/2008/12/04/word-break-all/">连续字体换行的解决方案</a></li>
</ol>
<ins datetime="2009-09-03T12:38:36+00:00">回家在自己的电脑上升级Firefox到Firefox/3.5.2，发现Firefox/3.5.2已经对word-breakz支持了，对text-shadow也已经支持了。</ins>]]></content:encoded>
			<wfw:commentRss>http://lefter.net/blog/word-break_for_firefox/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>两种解决IE6不支持固定定位的方法</title>
		<link>http://lefter.net/blog/ie6_position_fixed/</link>
		<comments>http://lefter.net/blog/ie6_position_fixed/#comments</comments>
		<pubDate>Wed, 02 Sep 2009 03:40:05 +0000</pubDate>
		<dc:creator>lujo</dc:creator>
				<category><![CDATA[前端开发&架构]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[浏览器]]></category>

		<guid isPermaLink="false">http://lefter.net/blog/?p=966</guid>
		<description><![CDATA[有两种让IE6支持position:fixed
1.用CSS执行表达式

*{margin:0;padding:0;}
* html,* html body{ 
	background-image:url(about:blank);
 	background-attachment:fixed;
}
* html .fixed{
    position:absolute;
    bottom:auto;
    top:expres... ]]></description>
			<content:encoded><![CDATA[<h4>有两种让IE6支持position:fixed</h4>
<h3>1.用CSS执行表达式</h3>
<pre>
<code>*{margin:0;padding:0;}
* html,* html body{ 
	background-image:url(about:blank);
 	background-attachment:fixed;
}
* html .fixed{
    position:absolute;
    bottom:auto;
    top:expression(eval(document.documentElement.scrollTop+
    document.documentElement.clientHeight-this.offsetHeight-
    (parseInt(this.currentStyle.marginTop,10)||0)-
    (parseInt(this.currentStyle.marginBottom,10)||0)));
}      
.fixed{
    position:fixed;
    bottom:0px;
    top:auto;
}   
</code>
</pre>
<a href="/demo/IE6position_fix.htm"><strong>查看演示</strong></a>
<h3>2.让body保持其原有高度，让html只有一个窗口那么高</h3>
<pre><code>*{margin:0;padding:0}
*html{overflow:hidden;}
*html body{height:100%;overflow:auto;}        
.fixed{
    position:fixed; _position:absolute;
    left:0;
    bottom:0;
}</code>
</pre>
<a href="/demo/IE6positionfixed_bug.htm"><strong>查看演示</strong></a>
<p><strong>推荐阅读</strong> <br/><a href="http://tagsoup.com/cookbook/css/fixed/">http://tagsoup.com/cookbook/css/fixed/</a><br/><a href="http://subtlegradient.com/articles/2009/07/29/css_position_fixed_for_ie6.html">http://subtlegradient.com/</a></p>]]></content:encoded>
			<wfw:commentRss>http://lefter.net/blog/ie6_position_fixed/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>微格式和语意网</title>
		<link>http://lefter.net/blog/microformats_web/</link>
		<comments>http://lefter.net/blog/microformats_web/#comments</comments>
		<pubDate>Sat, 29 Aug 2009 09:50:33 +0000</pubDate>
		<dc:creator>lujo</dc:creator>
				<category><![CDATA[前端开发&架构]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[microformats]]></category>

		<guid isPermaLink="false">http://lefter.net/blog/?p=931</guid>
		<description><![CDATA[

微格式（Microformat）
是在标准 XHTML 代码中嵌入结构化数据的一种新方法。理念非常简单。获得一个包含某些事件信息的页面,开始时间、结束时间、位置、主题、Web 页面，等等。过去的方法... ]]></description>
			<content:encoded><![CDATA[<img src="http://lefter.net/blog/wp-content/uploads/2009/08/microformats.gif" alt="microformats" title="microformats" width="445" height="213" />
<dl>
<dt><a href="http://microformats.org/">微格式</a>（Microformat）</dt>
<dd>是在标准 XHTML 代码中嵌入结构化数据的一种新方法。理念非常简单。获得一个包含某些事件信息的页面,开始时间、结束时间、位置、主题、Web 页面，等等。过去的方法是将这些信息放置在页面的超文本标记语言（HTML）中，微格式摒弃了这种做法，而是添加一些标准化 HTML 标记和层叠样式表（CSS）类名。</dd>
</dl>
<dl>
<dt>语义 Web</dt>
<dd>富含语义的 HTML 是一种 Web 应用开发的实践，它强调从文档所需要表达的语义出发，使用 HTML 语法中表示文档结构和富含语义的元素来编写 HTML 文档，从而使得 Web 应用的结构与展示分离，降低各部分之间的耦合度</dd>
</dl>
<pre>
<code>&lt;DIV class="vcard">
	&lt;A rel="me" class="url fn" href="http://lefter.net/">Lefter &lt;/A>
	&lt;ADDRESS title="UESTC" class="adr hidden">
		&lt;SPAN class="locality">SiChuan Chengdu &lt;/SPAN>
		&lt;SPAN class="country-name">China &lt;/SPAN>  
	&lt;/ADDRESS>
&lt;/DIV></code>
</pre>
<p>上面就是定义了一个Hcard，描述个人信息包括联系方式，地址之类的一种微格式，然后用FF下一个插件<a href="https://addons.mozilla.org/zh-CN/firefox/addon/2240">Tails Export</a>就能从页面上导出相应的信息，还可以导出后缀名为<abbr title="vCard format">.vcf</abbr>的实体文件。
<img src="http://lefter.net/blog/wp-content/uploads/2009/08/microformats.jpg" alt="microformats" title="microformats" /><strong>除了Vcard还有很多常见的有</strong>:</p>
<dl>
               <dt>People and Organizations </dt>
               <dd><a href="http://microformats.org/wiki/hcard">hCard</a>, <a href="http://gmpg.org/xfn"><abbr title="XHTML Friends Network">XFN</abbr></a></dd>
               <dt>Calendars and Events</dt> 
               <dd><a href="http://microformats.org/wiki/hcalendar">hCalendar</a></dd>
               <dt>Opinions, Ratings and Reviews</dt>
               <dd><a href="http://microformats.org/wiki/vote-links">VoteLinks</a>, <a href="/wiki/hreview">hReview</a></dd>
               <dt>Licenses:</dt>
               <dd><a href="http://microformats.org/wiki/rel-license">rel-license</a></dd>               
               <dt>Tags, Keywords, Categories</dt>
               <dd><a href="http://microformats.org/wiki/rel-tag">rel-tag</a></dd>
               <dt>Lists and Outlines</dt>
               <dd><a href="http://microformats.org/wiki/xoxo">XOXO</a></dd>
               <dt>More…</dt>
               <dd>See <a href="http://microformats.org/wiki/">the list of all microformats</a></dd>
</dl>]]></content:encoded>
			<wfw:commentRss>http://lefter.net/blog/microformats_web/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>浏览器检测</title>
		<link>http://lefter.net/blog/check-agent/</link>
		<comments>http://lefter.net/blog/check-agent/#comments</comments>
		<pubDate>Wed, 26 Aug 2009 10:30:44 +0000</pubDate>
		<dc:creator>lefter</dc:creator>
				<category><![CDATA[前端开发&架构]]></category>
		<category><![CDATA[浏览器]]></category>

		<guid isPermaLink="false">http://lefter.net/blog/?p=880</guid>
		<description><![CDATA[判断浏览器的型号一般有两种：一是可以通过DOM的userAgent来判断；另一种是通过浏览器的私有属性来判断
通过userAgent来判断
通过查找userAgent返回的字符串中一些特定的字符来判断浏览器类型,... ]]></description>
			<content:encoded><![CDATA[<p>判断浏览器的型号一般有两种：一是可以通过DOM的userAgent来判断；另一种是通过浏览器的私有属性来判断</p>
<h4>通过userAgent来判断</h4>
<p>通过查找userAgent返回的字符串中一些特定的字符来判断浏览器类型,可以通过indexOf()，返回值是所查找的字符串在整个字符串中首次出现的位置，没有找到要查的字符串其返回值是-1；indexOf()对大小写敏感，而userAgent方法返回值一般为大写混合，以下是常见浏览器的userAgent值</p>
<pre><code><strong>IE7</strong>:mozilla/4.0 (compatible; msie 7.0; windows nt 5.1; 
.net clr 2.0.50727; .net clr 3.0.04506.648; .net clr 3.5.21022; ciba)
<strong>IE6:</strong>mozilla/4.0 (compatible; msie 6.0; windows nt 5.1; 
.net clr 2.0.50727; .net clr 3.0.04506.648; .net clr 3.5.21022; ciba) 
<strong>FF</strong>:mozilla/5.0 (windows; u; windows nt 5.1; zh-cn; rv:1.9.0.10) 
gecko/2009042316 firefox/3.0.10 
<strong>Opera</strong>:opera/9.64 (windows nt 5.1; u; edition ibis; zh-cn) presto/2.1.1
<strong>Safari</strong>:mozilla/5.0 (windows; u; windows nt 5.1; zh-cn) 
applewebkit/528.16 (khtml, like gecko) version/4.0 safari/528.16
<strong>Chrome</strong>:mozilla/5.0 (windows; u; windows nt 5.1; en-us) applewebkit/531.3 
(khtml, like gecko) chrome/3.0.193.0 safari/531.3
</code></pre>
<p>对比上面返回值的差异可以用下面的方法对浏览器进行检查</p>
<pre><code>var ua = navigator.userAgent.toLowerCase();
var _isOpera = ua.indexOf('opera') != -1,
_isChrome = ua.indexOf('chrome') != -1,
_isSafari = !_isChrome &amp;&amp; ua.indexOf('safari') != -1,
_isGecko = !_isChrome &amp;&amp; !_isSafari &amp;&amp; ua.indexOf('gecko') != -1,
_isIE = !_isOpera &amp;&amp;ua.indexOf('msie') != -1, 
_isIE6 = ua.indexOf('msie 6') != -1,
_isIE7 = ua.indexOf('msie 7') != -1;		
</code></pre>
<p><a href="/demo/ua.html"><strong>点击查看示例</strong></a></p>
<h4>通过浏览器的私有属性来判断</h4>
<ul>
<li><strong>IE</strong>支持创建ActiveX控件，因此ActiveXObject函数也是IE独有的</li>
<li><strong>Opera</strong>提供了专门的浏览器标志，就是window.opera属性</li>
<li><strong>Safari</strong>有一个私有的openDatabase属性</li>
<li><strong>Chrome</strong>和Firefox有一个MessageEvent函数，但没有Firefox的getBoxObjectFor</li>
<li><strong>Firefox</strong>有一个getBoxObjectFor函数用来获取DOM的位置和大小,类似IE的getBoundingClientRect</li>
</ul>
<p>因此可以大概用一下代码</p>
<pre><code>var ua = navigator.userAgent.toLowerCase();
var _isOpera = window.opera,
_isChrome = window.MessageEvent &amp;&amp; !document.getBoxObjectFor,
_isSafari = window.openDatabase,
_isGecko = document.getBoxObjectFor,
_isIE = window.ActiveXObject;
if(_isIE ) alert("ie");
if(_isGecko ) alert("isGecko ");
if(_isChrome ) alert("isChrome ");
if(_isOpera ) alert("isOpera ");
if(_isSafari ) alert("isSafari ");</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://lefter.net/blog/check-agent/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaScript中的Function对象</title>
		<link>http://lefter.net/blog/javascript-function/</link>
		<comments>http://lefter.net/blog/javascript-function/#comments</comments>
		<pubDate>Sat, 22 Aug 2009 15:33:54 +0000</pubDate>
		<dc:creator>lujo</dc:creator>
				<category><![CDATA[前端开发&架构]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://lefter.net/blog/?p=841</guid>
		<description><![CDATA[函数的类型分为三类

	作为普通逻辑代码容器
	作为对象方法
作为构造函数	

函数逻辑代码容器
function Add(x,y){
    return x+y
}
alert(Add(2,8));

定义一个函数有三种方式

	函数声明function fo... ]]></description>
			<content:encoded><![CDATA[<p>函数的类型分为三类</p>
<ol>
	<li><a href="#content">作为普通逻辑代码容器</a></li>
	<li><a href="#method">作为对象方法</a></li>
<li><a href="#constructor">作为构造函数</a></li>	
</ol>
<h4><a name="content">函数逻辑代码容器</a></h4>
<pre><code>function Add(x,y){
    return x+y
}
alert(Add(2,8));
</code></pre>
定义一个函数有三种方式
<ol>
	<li>函数声明function foo(){}</li>
	<li>函数表达式 var foo=function(){}</li>
<li>Function对象 var foo=new Function</li>	
</ol>
而函数声明和函数表达式是有差别的,先看两个例子：<pre><code>函数表达式：var example = function(){
return 1;
}
example();//1

var example = function(){
return 2;
}
example();//2</code></pre>
<pre><code>函数声明：function example(){
return 1;
}
example();//1

function example(){
return 2;
}
example();//2</code></pre>
<p>在采用函数声明创建同名函数时，后创建的函数会覆盖先创建的函数。这种差别是由于JavaScript解释引擎的工作机制所导致的。JavaScript解释引擎在执行任何函数调用之前，首先会在全局作用域中注册以函数声明创建的函数，然后再依次执行函数调用。由于注册函数时，后定义的函数重写了先定义的函数，因此无论调用语句位于何处，执行的都是后定义的函数。<br/>相反，对于函数表达式创建的函数，JavaScript解释引擎会像对待任何声明的变量一样，等到执行调用该变量的代码时才会对变量求值。由于JavaScript代码是从上到下顺序执行的，因此当执行第一个example()调用时，example函数的代码就是首先定义代码；而当执行第二个example()调用时，example函数的代码又变成了后来定义的代码。</p>

<h4><a name="method">作为对象方法</a></h4>
<p>JavaScript在解析代码时，会为声明或定义的函数指定调用对象。所谓调用对象，就是函数的执行环境。如果函数体内有以关键字this声明的变量，则this引用的就是调用对象。事实上，在普通的函数中，也存在调用对象，只不过这个调用对象是默认的全局window对象而已。例如上面的例子相当于：</p>
<pre><code>var Add= window.Add(26,26); // Add= 52</code></pre>
<p>这说明，默认情况下，在全局作用域中定义或声明的函数的调用对象就是window。
在面向对象编程中，通常将作为对象成员的函数称为方法。
</p>
<pre><code>var people={}
people.name="lefter";
people.age="24 years old"
people.intro=function(){
    alert(this.name+" is "+this.age)
}
people.intro();//lefter is 24years old

var animal ={}
animal .name='huahua'
animal .age='1years old';
animal .wangwang=people.intro;//对象可以借用其他对象的方法
animal .wangwang();//huahua is 1years
</code></pre>
<p>使用函数对象的call和apply方法，还可以动态指定函数或方法的调用对象
<br/><strong>call 方法</strong>:调用一个对象的一个方法，以另一个对象替换当前对象(其实就是更改对象的内部指针，即改变对象的this指向的内容)
<br/>
call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。如果没有提供 thisObj 参数，那么 Global 对象被用作 thisObj。 
</p>
<p><strong>apply方法</strong>apply方法的第一个参数也是要传入给当前对象的对象，即函数内部的this。后面的参数都是传递给当前对象的参数。<br/>
对于apply和call两者在作用上是相同的，但两者在参数上有区别的。对于第一个参数意义都一样，但对第二个参数：apply传入的是一个参数数组，也就是将多个参数组合成为一个数组传入，而call则作为call的参数传入（从第二个参数开始）。<br/>
如 func.call(func1,var1,var2,var3)对应的apply写法为：func.apply(func1, [var1,var2,var3])同时使用apply的好处是可以直接将当前函数的arguments对象作为apply的第二个参数传入</p>
因此上面可以写为：<pre><code>animal.wangwang.call(people);
或者：animal.wangwang.apply(people); </code></pre>
<h4><a name="constructor">作为构造函数</a></h4>
<pre><code>function Man(name,age){
this.name= name;
this.age = age;
}
//然后可以new一个实例
var lefter=new Man("lefter",24);</code></pre>
<p>
创建lefter的对象的过程如下：首先，new运算符创建一个空对象({})，然后以这个空对象为调用对象调用函数Man，为这个空对象添加两个属性name和age，接着，再将这个空对象的默认constructor属性修改为构造函数的名称（即Man；空对象创建时默认的constructor属性值是Object），并且将空对象的__proto__属性设置为指向Man.prototype——这就是所谓的对象初始化。最后，返回初始化完毕的对象。这里将返回的新对象赋值给了变量lefter,除了new外还可以用这样的方式来创建。
</p>
<pre><code>var lefter = {};
Man.call(lefter,"lefter",24);</code></pre>
<p>区别是后者新创建的lefter对象失去了通过Man.prototype属性继承其他对象的能力。只要与前面采用new运算符调用构造函数创建对象的过程对比一下，就会发现，new运算符在初始化新对象期间，除了为新对象添加显式声明的属性外，还会对新对象进行了一番“暗箱操作”——即将新对象的constructor属性重写为Man，将新对象的__proto__属性设置为指向Man.prototype。虽然手工“初始化对象”也可以将dog.constructor重写为Man，但根据ECMA262规范，对象的__proto__属性对开发人员是只读的，对它的设置只能在通过new运算符创建对象时由JavaScript解释引擎替我们完成。
<br/>JavaScript是基于原型继承的，如果不能正确设置对象的__proto__属性，那么就意味着默认的继承机制会失效：
</p><pre><code>Man.prototype.say="hellow";
lefter.say;//undefine</code></pre>]]></content:encoded>
			<wfw:commentRss>http://lefter.net/blog/javascript-function/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>充分利用javascript参数对象</title>
		<link>http://lefter.net/blog/making-full-use-of-the-arguments-object/</link>
		<comments>http://lefter.net/blog/making-full-use-of-the-arguments-object/#comments</comments>
		<pubDate>Sun, 09 Aug 2009 10:29:23 +0000</pubDate>
		<dc:creator>lujo</dc:creator>
				<category><![CDATA[前端开发&架构]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://lefter.net/blog/?p=780</guid>
		<description><![CDATA[ 在javascript中，参数是传递给函数的变量,可以理解为一个自动售货机，你投入什么面值的硬币就给出什么样的商品。硬币就是arguments,一下是一般的使用参数的方法。

(function (str1, str2) {
    ale... ]]></description>
			<content:encoded><![CDATA[ 在javascript中，参数是传递给函数的变量,可以理解为一个自动售货机，你投入什么面值的硬币就给出什么样的商品。硬币就是arguments,一下是一般的使用参数的方法。
<pre>
<code>(function (str1, str2) {
    alert( str1 + str2);
})('left', 'er');
// returns 'lefter';
</code></pre>
但是这样在有些时候访问参数并不是很方便，因此javascript提供了Arguments对象。
<pre>
<code>(function  () {
    alert(arguments[0] + arguments[1];)
})('left','er');
// returns 'lefter'
</code></pre>
在我们不确定有多少参数的时候更能体现Arguments对象的好处。
<pre>
<code>function concatenate () {
    var result = '' ";
    for(var i=0; i &lt;arguments.length; ++i){
        result += arguments[i];
    }
    return result;
}
concatenate('lefter', 'crockford', 'has', 'a', 'posse');
// returns 'leftercrocfordhasaposse'
</code></pre>
javascript提供了两个方法call和apply，做为每一个function的属性,提供了很强的灵活性，看下面两个例子
<pre>
<code>function concatenate () {
    return Array.prototype.slice.call(arguments).join('');
}
concatenate('douglas', 'crockford', 'has', 'a', 'posse');
// returns 'douglascrocfordhasaposse'
</code></pre>
<pre><code>function concatenate (separator) {
    return Array.prototype.slice.call(arguments, 1).join(separator);
}
concatenate(' ', 'lefter', 'crockford', 'has', 'a', 'posse');
// returns 'lefter crockford has a posse'
</code></pre>

]]></content:encoded>
			<wfw:commentRss>http://lefter.net/blog/making-full-use-of-the-arguments-object/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>自动改变CSS，JS版本</title>
		<link>http://lefter.net/blog/automatically-version-your-css-and-javascript-files/</link>
		<comments>http://lefter.net/blog/automatically-version-your-css-and-javascript-files/#comments</comments>
		<pubDate>Sun, 09 Aug 2009 03:35:36 +0000</pubDate>
		<dc:creator>lujo</dc:creator>
				<category><![CDATA[前端开发&架构]]></category>
		<category><![CDATA[程序相关]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://lefter.net/blog/?p=759</guid>
		<description><![CDATA[在雅虎工程师，史蒂夫Souders 的高性能网站建设中，有很多条关于网站性能优化的建议,其中第3条建议您使用树立了一个Expires头的静态文件（图片， CSS和JavaScript ），实施Expires头很简单，在您... ]]></description>
			<content:encoded><![CDATA[在雅虎工程师，史蒂夫Souders 的<a href="http://oreilly.com/catalog/9780596529307/">高性能网站建设</a>中，有很多条关于网站性能优化的<a href="http://developer.yahoo.com/performance/rules.html">建议</a>,其中<a href="http://developer.yahoo.com/performance/rules.html#expires">第3条建议</a>您使用树立了一个Expires头的静态文件（图片， CSS和JavaScript ），实施Expires头很简单，在您的<a href="http://www.freewebmasterhelp.com/tutorials/htaccess/1" title="Apache非常强大的分布式配置文件">.htaccess</a>的文件，您可以使用下面的代码
<pre><code>#Far Future Expires Header
&lt;FilesMatch "\.(gif|png|jpg|js|css|swf)$"&gt;
    ExpiresActive On
    ExpiresDefault "access plus 10 years"
&lt;/FilesMatch&gt;
</code>
</pre>
作者指出：<blockquote>Keep in mind, if you use a far future Expires header you have to change the component’s filename whenever the component changes. At Yahoo! we often make this step part of the build process: a version number is embedded in the component’s filename, for example, yahoo_2.0.6.js.</blockquote>
要生成像yahoo_2.0.6.js可以按照下面的方法：
<p>第一步，建立一些可规则重写的存储模块，一边存储文件的版本号，因此还是在.htaccess的文件中加入下面的代码</P><pre><code>#Rules for Versioned Static Files
RewriteRule ^(scripts|css)/(.+)\.(.+)\.(js|css)$ $1/$2.$4 [L]
</code></pre>
<p>然后写一个PHP函数来检查文件的最后修改日期，然后将服务器的修改时间作为版本号</p>
<pre><code>&lt;?php 
function autoVer($url){$path = pathinfo($url); 
$ver = '.'.filemtime($_SERVER['DOCUMENT_ROOT'].$url).'.';
echo $path['dirname'].'/'.str_replace('.', $ver, $path['basename']); } 
?&gt; 
</code></pre>
然后我们可以将这个函数包含到页面中
<pre><code>include($_SERVER['DOCUMENT_ROOT'].'/path/to/autoVer.php'); 
&lt;link rel="stylesheet" href="&lt;?php autoVer('/css/structure.css'); ?&gt;" 
type="text/css" /&gt; 
&lt;script type="text/javascript" src="&lt;?php autoVer('/scripts/prototype.js'); ?&gt;"&gt;
&lt;/script&gt; :include($_SERVER['DOCUMENT_ROOT'].'/path/to/autoVer.php'); 
&lt;link rel="stylesheet" href="&lt;?php autoVer('/css/structure.css'); ?&gt;"
type="text/css" /&gt;
&lt;script type="text/javascript" src="&lt;?php autoVer('/scripts/prototype.js'); ?&gt;"&gt;
&lt;/script&gt; 
</code></pre>
然后经过解析之后在页面文件看到的HTML代码将会是
<pre><code>&lt;script type="text/javascript" src="/prototype.197993206.js">&lt;/script&gt; 
</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://lefter.net/blog/automatically-version-your-css-and-javascript-files/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>wordpress自定义字段</title>
		<link>http://lefter.net/blog/wordpress-custom-fields/</link>
		<comments>http://lefter.net/blog/wordpress-custom-fields/#comments</comments>
		<pubDate>Sun, 21 Jun 2009 12:39:49 +0000</pubDate>
		<dc:creator>lujo</dc:creator>
				<category><![CDATA[前端开发&架构]]></category>
		<category><![CDATA[生活及其他]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://lefter.net/blog/?p=701</guid>
		<description><![CDATA[我在做我的相册的时候,主要用到了wordpress自定义字段可以说wordpress自定义字段是wordpress很强的一个扩展之一，用有改功能就可以把wordpress完全做成一个很全面的CMS ，点击欣赏一个很棒的基于Wor... ]]></description>
			<content:encoded><![CDATA[<p>我在做<a href="http://lefter.net/photo/">我的相册</a>的时候,主要用到了<a href="http://codex.wordpress.org/Using_Custom_Fields">wordpress自定义字段</a><a title="点击进入我的相册" href="http://lefter.net/photo/"><img src="http://lh4.ggpht.com/_M2p9f-QlWt4/Sj4pIffAi2I/AAAAAAAABxI/ZChtCQH-leE/s800/gll.jpg" /></a>可以说wordpress自定义字段是wordpress很强的一个扩展之一，用有改功能就可以把wordpress完全做成一个很全面的CMS ，点击欣赏<a href="http://www.cssremix.com/">一个很棒的基于Wordpress的相册</a></p>
<p>什么是自定义字段呢？一般来讲wordpress提供了博客文章的作者，分类，标签，时间等，然后你可以根据你的需要自定义出一系列的其他信息，比如图片的拍摄器材，相册的缩略图，发表文章时候的心情等。</p>
<p>一个自定义字段有两个显而易见的变量 — 键 ( key ) 和值 ( value )
<pre><code>&lt;?php if ( get_post_meta($post->ID, 'index_image', true) ) { ?&gt;
&lt;a href="<?php the_permalink() ?>" title="<?php the_title(); ?>"&gt;
&lt;img src="<?php echo get_post_meta($post->ID, "index_image", $single = true) ?>" title="<?php the_title(); ?>" /&gt;
&lt;/a>
&lt;?php } else {?&gt;
&lt;a href="<?php the_permalink() ?>" title="<?php the_title(); ?>" &gt;
&lt;img src="<?php bloginfo('stylesheet_directory'); ?>/images/fix.jpg" alt="<?php the_title(); ?>" title="<?php the_title(); ?>"/&gt;
&lt;/a>
&lt;?php } ? &gt;</code></pre>
<p>get_post_meta($post_id, $key, $single = true)。这个函数能够能让你按自己所需列出自定义字段;。上面代码的解释就是查找自定义字段“index_image”属性，如果能找到该属性，就显示该属性对应的值（这里是一个图片地址）,如果没有找到该属性，则为一个固定的图片 fix.jpg来代替。</p>
<p>参考资料
<ul>
<li><a target="_blank" class="external" href="http://codex.wordpress.org/Using_Custom_Fields">Using_Custom_Fields</a></li>
<li><a target="_blank" class="external" href="http://www.wpdesigner.com/2007/06/05/one-way-to-use-custom-fields/">One Way To Use Custom Fields</a></li>
<li><a target="_blank" class="external" href="http://www.wpdesigner.com/2007/07/26/using-wordpress-as-a-css-gallery/">Using WordPress as a CSS gallery</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://lefter.net/blog/wordpress-custom-fields/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>META,http-equiv,name</title>
		<link>http://lefter.net/blog/meta/</link>
		<comments>http://lefter.net/blog/meta/#comments</comments>
		<pubDate>Sun, 21 Jun 2009 04:19:13 +0000</pubDate>
		<dc:creator>lujo</dc:creator>
				<category><![CDATA[前端开发&架构]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[html]]></category>

		<guid isPermaLink="false">http://lefter.net/blog/?p=694</guid>
		<description><![CDATA[今天在上看一个positioniseverything查看IE6的border混乱的BUG说明页面发现Firefox的滚动条有点不一样，心想难道Firefox也可以像IE一样控制其滚动条的颜色之内的了么？于是研究了一下原来是这段代码... ]]></description>
			<content:encoded><![CDATA[<p>今天在上看一个<a href="http://www.positioniseverything.net/">positioniseverything</a>查看<a href="http://www.positioniseverything.net/explorer/border-chaos.html">IE6的border混乱的BUG说明页面</a>发现Firefox的滚动条有点不一样，心想难道Firefox也可以像IE一样控制其滚动条的颜色之内的了么？于是研究了一下原来是这段代码的作用<code>&lt;meta http-equiv="MSThemeCompatible" content="yes"/&gt;</code>其作用是：是否在浏览器中中关闭操作系统的的主题用法，比如按钮样式，选择菜单的样式等，一般和WINDOW经典主题一致</p>
<p>BTW : 用IE私有属性能控制滚动条的样比如：scrollbar-3dlight-color,scrollbar-highlight-color，scrollbar-face-color，scrollbar-arrow-color，scrollbar-shadow-color，scrollbar-darkshadow-color，scrollbar-base-color，scrollbar-track-color</p>
<p>在此对常用的META标签的属性进行一些总结，</p>
<h4>HTTP-EQUIV</h4>
<p>HTTP-EQUIV类似于HTTP的头部协议，它回应给浏览器一些有用的信息，以帮助正确和精确地显</p>
<dl>
<dt>Refresh (刷新)</dt>
<dd>让网页多长时间（秒）刷新自己，或在多长时间后让网页自动跳转到其它网页<code>&lt;Meta http-equiv="Refresh" Content="5; Url=http://lefter.net"/&gt;</code></dd>
<dt>Expires (期限)</dt>
<dd>指定网页在缓存中的过期时间，一旦网页过期，必须重发请求到服务器获取更新<code>&lt;Meta http-equiv="Expires" Content="Wed, 26 Feb 1997 08:21:57 GMT"/&gt;</code></dd>
<dt>Pragma (cach模式)</dt>
<dd>禁止浏览器从本地机的缓存中调阅页面内容<code>&lt;Meta http-equiv="Pragma " Content="No-cach"/&gt;</code></dd>
<dt>X-UA-Compatible</dt>
<dd>X-UA-Compatible是针对ie8新加的一个设置，对于ie8之外的浏览器是不识别的，这个区别与content=&#8221;IE=7&#8243;在无论页面是否包含指令，都像是使用了 Windows Internet Explorer 7的标准模式。而content=&#8221;IE=EmulateIE7&#8243;模式遵循指令。对于多数网站来说，它是首选的兼容性模式。<code>&lt;Meta http-equiv="X-UA-Compatible " Content="IE=7"/&gt;</code></dd>
</dl>
<h4>NAME变量</h4>
<p>name是描述网页的，对应于Content网页内容，以便于搜索引擎机器人查找、分类，目前几乎所有的搜索引擎都使用网上机器人自动查找meta值来给网页分类。name的value值name=&#8221;"；指定所提供信息的类型。有些值是已经定义好的。</p>
<p>例如description，keyword，Author，Copyright等，这些常见的就不特地说明了</p>
<dl>
<dt>name=&#8221;Robots&#8221; (搜索引擎向导)</dt>
<dd>说明：Robots用来告诉搜索机器人哪些页面需要索引，哪些页面不需要索引。Content的参数有all、none、index、noindex、follow、nofollow。默认是all。index针对，页面文件本身，而Follow针对页面的链接，搜索引擎顺着连接往下抓取</dd>
</dl>
]]></content:encoded>
			<wfw:commentRss>http://lefter.net/blog/meta/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>新闻网被人攻击啦</title>
		<link>http://lefter.net/blog/someone-into-newscenter/</link>
		<comments>http://lefter.net/blog/someone-into-newscenter/#comments</comments>
		<pubDate>Fri, 19 Jun 2009 02:04:14 +0000</pubDate>
		<dc:creator>lujo</dc:creator>
				<category><![CDATA[前端开发&架构]]></category>
		<category><![CDATA[程序相关]]></category>
		<category><![CDATA[css]]></category>

		<guid isPermaLink="false">http://lefter.net/blog/?p=667</guid>
		<description><![CDATA[今天早上还在睡觉的时候，工作室同学打电话说新闻网不能访问了，我用Firefox能打开,但是用IE打开会报错XML 文档只能有一个顶层元素。处理资源'http://www.news.uestc.edu.cn/' 时出错。第 163 行，位... ]]></description>
			<content:encoded><![CDATA[<p>今天早上还在睡觉的时候，工作室同学打电话说新闻网不能访问了，我用Firefox能打开,但是用IE打开会报错<img  title="IE下报错" alt="IE下报错" src="http://lh6.ggpht.com/_M2p9f-QlWt4/SjrnoeMCKII/AAAAAAAABuA/GdCzYD0J-Qs/s640/%E6%9C%AA%E6%A0%87%E9%A2%98-1.jpg" /><code>XML 文档只能有一个顶层元素。处理资源'http://www.news.uestc.edu.cn/' 时出错。第 163 行，位置: 2<br />
< a href="http://devturkler.com" title="devturk">< font color="#FFFFFF" >turkler< /a ><br />
-^<br />
</code>我看怎么多出了一个链接，然后代开这个链接，好像能打开，我想知道是那个国家的人攻击的，想查一下其IP地址是那个国家的，但是PING不通，太强了 <ins datetime="2009-06-19T02:16:54+00:00">现在知道是土耳其人侵略了我们:)</ins></p>
<p>后来才注意到Firefox里面也是不正常的，因为下面多出了一行空白，因为他给链接用的白色的字体，背景也是白色的所以就不能看见；但是FIREFOX为什么不报错呢，我想是因为我们新闻网的前端架构采用XSL解析XML的方式,而XSL也是一种XML,XML相对html要规范的多,很多标签如CENTER，FONT等都被取消了,还有所有的标签必须关闭,而他用的<code>< a >< font color="#FFFFFF" >turkler< /a ></code>这两点都不满足，而Firefox渲染的时候是把XML直接转换为HTML(在IE，和firefox下分别查看源文件就可以知道)，因此不报错！但是能解析出来，只是此人用了白色的字体，而背景也是白色的，所以看不出来罢了，全选的时候就能看出来了<img alt="FIREFOX下面的效果" title="FIREFOX下面的效果" src="http://lh3.ggpht.com/_M2p9f-QlWt4/SjrnokIOpBI/AAAAAAAABuE/-vscosXBTpU/s640/%E6%9C%AA%E6%A0%87%E9%A2%98s-1.jpg"/></p>
<p>我滴神啦，被改掉的DEFAULT文件，还不知道有没有其他的文件被改掉<img alt="被改之后的文件" title="被改之后的文件"  src="http://lh6.ggpht.com/_M2p9f-QlWt4/SjrnooQVYkI/AAAAAAAABuI/7rv6GfDx2ck/s640/%E6%9C%AA%E5%91%BD%E5%90%8D.jpg" /></p>
<p>还好此人没有多少恶意，只是加上他的链接在上面，可能是想赚取PR，也给我们敲了个警钟。现在应该找出我们的服务器的漏洞出在哪里，大家不要在上面安装其他的软件</p>
]]></content:encoded>
			<wfw:commentRss>http://lefter.net/blog/someone-into-newscenter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Anonymous function</title>
		<link>http://lefter.net/blog/anonymous-function/</link>
		<comments>http://lefter.net/blog/anonymous-function/#comments</comments>
		<pubDate>Wed, 29 Apr 2009 05:56:37 +0000</pubDate>
		<dc:creator>lujo</dc:creator>
				<category><![CDATA[前端开发&架构]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://lefter.net/blog/?p=540</guid>
		<description><![CDATA[定义一个函数常见的三种格式

函数关键字(function)语句：
function add(a,b){alert(a+b);}

函数字面量(Function Literals)：
var add= function(a,b){alert(a+b);}

Function()构造函数：
var add= new Function('a','b','alert(a+b);')
... ]]></description>
			<content:encoded><![CDATA[<p>定义一个函数常见的三种格式</p>
<ol>
<li><strong>函数关键字(function)语句</strong>：
<pre><code>function add(a,b){alert(a+b);}</code></pre>
</li>
<li><strong>函数字面量(Function Literals)</strong>：
<pre><code>var add= function(a,b){alert(a+b);}</code></pre>
</li>
<li><strong>Function()构造函数</strong>：
<pre><code>var add= new Function('a','b','alert(a+b);')</code></pre>
</li>
</ol>
<p>一个匿名函数就是一个没有名字的函数。你可以认为他们是一次性函数。当你只需要用一次某个函数式，他们就特别有用。通过使用匿名函数，没有必要把函数一直放在内存中，所以使用匿名函数更加有效率。</p>
<h3><a href="http://www.hedgerwow.com/360/dhtml/js-anonymous-function-patterns.html">Code patterns for anonymous function（代码模式）</a></h3>
<pre><code>function(){  alert(1);}();
</code></pre>
<p><strong>错误模式</strong>：其无法工作，浏览器会报语法错。</p>
<ol>
<li><strong>函数字面量</strong>：首先声明一个函数对象，然后执行它。
<pre><code>(function(){
  alert(1);
} ) ( );</code></pre>
</li>
<li><strong>优先表达式</strong>：由于Javascript执行表达式是从圆括号里面到外面，所以可以用圆括号强制执行声明的函数。如果你写了括号，那么在括号中的代码就会被先计算。在计算之后，括号所在的地方就会有一个值。
<pre><code>( function(){
  alert(2);
} ( ) );</code></pre>
</li>
<li><strong>Void操作符</strong>：用void操作符去执行一个没有用圆括号包围的一个单独操作数。
<pre><code>void function(){
  alert(3);
}()</code></pre>
</li>
<li><strong>!操作符</strong>：用！操作符去执行一个没有用圆括号包围的一个单独操作数。
<pre><code>!function(){
  alert(4);
}()</code></pre>
</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://lefter.net/blog/anonymous-function/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>程序运行机制</title>
		<link>http://lefter.net/blog/scope/</link>
		<comments>http://lefter.net/blog/scope/#comments</comments>
		<pubDate>Sat, 18 Apr 2009 06:23:52 +0000</pubDate>
		<dc:creator>lujo</dc:creator>
				<category><![CDATA[前端开发&架构]]></category>
		<category><![CDATA[程序相关]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://lefter.net/blog/?p=491</guid>
		<description><![CDATA[先看下面两个例子：试试看将弹出什么消息？
var a = 1;
function foo(a) {
     alert(a);
      var a = 2;
}
foo(3);
var a = "right";
(function() {
    alert(a);
    var a = "wrong";
})();

来自《编译原理》：对于传统编译型... ]]></description>
			<content:encoded><![CDATA[<p>先看下面两个例子：试试看将弹出什么消息？</p>
<pre><code>var a = 1;
function foo(a) {
     alert(a);
      var a = 2;
}
foo(3);</code></pre>
<pre><code>var a = "right";
(function() {
    alert(a);
    var a = "wrong";
})();
</code></pre>
<blockquote><p>来自《编译原理》：对于传统编译型语言来说，编译步骤分为：词法分析、语法分析、语义检查、代码优化和字节生成。<br />
但对于解释型语言来说，通过<a href="http://en.wikipedia.org/wiki/Lexical_analysis">词法分析</a>和语法分析得到语法树后，就可以开始解释执行了。</p></blockquote>
<p>
第二个函数输出结果是undefined, 这种现象被称成“预解析”：JavaScript引擎会优先解析var变量和function定义。在预解析完成后，才会执行代码。如果一个文档流中包含多个script代码段运行顺序是：<br />
<strong>step1.</strong> 读入第一个代码段<br />
<strong>step2.</strong> 做语法分析，有错则报语法错误（比如括号不匹配等），并跳转到step5<br />
<strong>step3.</strong>对var变量和function定义做“预解析”（永远不会报错的，因为只解析正确的声明,在step2的语法分析阶段完成，并存储在语法树中。当执行到函数实例时，会将varDelcs和funcDecls从语法树中复制到执行环境的scriptObject上）<br />
<strong>step4.</strong> 执行代码段，有错则报错（比如变量未定义,未定义变量意味着在scriptObject的变量表中找不到，JS引擎会沿着scriptObject的upvalue往上寻找，如果都没找到，对于写操作i = 1; 最后就会等价为 window.i = 1; 给window对象新增了一个属性。对于读操作，如果一直追溯到全局执行环境的scriptObject上都找不到，就会产生运行期错误）<br />
<strong>step5.</strong> 如果还有下一个代码段，则读入下一个代码段，重复step2<br />
<strong>step6.</strong> 结束<br />
通过编译，JavaScript代码已经翻译成了语法树，然后会立刻按照语法树执行。进一步的执行过程，需要理解JavaScript的作用域机制，JavaScript采用的是词法作用域（lexcical scope）。通俗地讲，就是JavaScript变量的作用域是在定义时决定而不是执行时决定，也就是说词法作用域取决于源码，编译器通过静态分析就能确定，因此词法作用域也叫做静态作用域（static scope）。但需要注意，with和eval的语义无法仅通过静态技术实现，实际上，只能说JS的作用域机制非常接近lexical scope.</p>
]]></content:encoded>
			<wfw:commentRss>http://lefter.net/blog/scope/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>White space around images and objects</title>
		<link>http://lefter.net/blog/hspace/</link>
		<comments>http://lefter.net/blog/hspace/#comments</comments>
		<pubDate>Wed, 01 Apr 2009 06:09:05 +0000</pubDate>
		<dc:creator>lujo</dc:creator>
				<category><![CDATA[前端开发&架构]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://ilujo.cn/?p=428</guid>
		<description><![CDATA[以前给图片和文字之间加间隙的方法使用的MARGIN或者PADDING值！今天无意中发现了img标签里面有一个专门的属性hspace&#038;vspace可设置或返回图片(或者OBJECT)的水平间距,可以配合align使用
The vspace an... ]]></description>
			<content:encoded><![CDATA[<p>以前给图片和文字之间加间隙的方法使用的MARGIN或者PADDING值！今天无意中发现了img标签里面有一个专门的属性hspace&#038;vspace可设置或返回图片(或者OBJECT)的水平间距,可以配合align使用<br />
<blockquote><p>The vspace and hspace attributes specify the amount of white space to be inserted to the left and right (hspace) and above and below (vspace) an IMG, APPLET, OBJECT. The default value for these attributes is not specified, but is generally a small, non-zero length. Both attributes take values of type length.</p></blockquote>
<p>这样做更有语意，<a href="http://www.w3.org/TR/WD-html40-970917/struct/objects.html#adef-vspace">w3c</a>也是支持的<strong>语法格式如下</strong><br/>imageObject.hspace=pixels</p>
<pre><code>
function setSpace(){
  document.getElementById("el").hspace="50"
  document.getElementById("el").vspace="50"
}
</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://lefter.net/blog/hspace/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>浮动居中float:center</title>
		<link>http://lefter.net/blog/float-center/</link>
		<comments>http://lefter.net/blog/float-center/#comments</comments>
		<pubDate>Wed, 04 Mar 2009 09:36:43 +0000</pubDate>
		<dc:creator>lujo</dc:creator>
				<category><![CDATA[前端开发&架构]]></category>
		<category><![CDATA[css]]></category>

		<guid isPermaLink="false">http://ilujo.cn/?p=342</guid>
		<description><![CDATA[今天看到了一种浮动居中方法，用float:center实现li是浮动的，并且是居中的（li个数不固定，ul宽度未知）。平时一般设置ul的text-align:center，再设置li的display，可以实现居中。
下面说一下float:cen... ]]></description>
			<content:encoded><![CDATA[<p>今天看到了一种浮动居中方法，用float:center实现li是浮动的，并且是居中的（li个数不固定，ul宽度未知）。平时一般设置ul的text-align:center，再设置li的display，可以实现居中。</p>
<p>下面说一下float:center实现浮动居中的思路，采用的是相对定位：ul为position:relative;left:50%，然后再让li像左浮动，在让它position:relative;right:50%（或者left:-50%），那么li就像向中间浮动一样居中了。</p>
<p><strong><a title="float center" href="../demo/float-center.html">demo</a></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://lefter.net/blog/float-center/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CSS Syestem体系格局参考图</title>
		<link>http://lefter.net/blog/css-system/</link>
		<comments>http://lefter.net/blog/css-system/#comments</comments>
		<pubDate>Mon, 10 Nov 2008 09:25:44 +0000</pubDate>
		<dc:creator>lujo</dc:creator>
				<category><![CDATA[前端开发&架构]]></category>
		<category><![CDATA[css]]></category>

		<guid isPermaLink="false">http://ilujo.cn/?p=293</guid>
		<description><![CDATA[关于整个CSS Syestem:

... ]]></description>
			<content:encoded><![CDATA[<p>关于整个CSS Syestem:<br />
<img title="css_system" src="http://lefter.net/blog/wp-content/uploads/2008/11/17_222831_css_system.gif" alt="" width="550" /><br />
<img title="css system" src="http://lefter.net/blog/wp-content/uploads/2008/11/17_223829_css_property_name.gif" alt="" width="550" /></p>
]]></content:encoded>
			<wfw:commentRss>http://lefter.net/blog/css-system/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>190 Bugs in  IE8 for Windows</title>
		<link>http://lefter.net/blog/190-bugs-in-8-for-windows/</link>
		<comments>http://lefter.net/blog/190-bugs-in-8-for-windows/#comments</comments>
		<pubDate>Fri, 07 Nov 2008 01:29:44 +0000</pubDate>
		<dc:creator>lujo</dc:creator>
				<category><![CDATA[体验&交互&平面&策划]]></category>
		<category><![CDATA[前端开发&架构]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[ie]]></category>
		<category><![CDATA[浏览器]]></category>

		<guid isPermaLink="false">http://ilujo.cn/?p=277</guid>
		<description><![CDATA[以前只是在css-discuss上的BrowserBugs上看到了一些总结性的BUG，positioniseverything上也有不少！今天看了一个更详细的,废话少说贴上地址！http://www.gtalbot.org/BrowserBugsSection

有兴趣的朋友去看看看！有... ]]></description>
			<content:encoded><![CDATA[<p>以前只是在<a href="http://css-discuss.incutio.com/" target="_blank">css-discuss</a>上的<a href="http://css-discuss.incutio.com/?page=BrowserBugs">BrowserBugs</a>上看到了一些总结性的BUG，<a href="http://www.positioniseverything.net/" target="_blank">positioniseverything</a>上也有不少！今天看了一个更详细的,废话少说贴上地址！<a href="http://www.gtalbot.org/BrowserBugsSection/">http://www.gtalbot.org/BrowserBugsSection</a><br />
<img  title="bug5s4g8" src="http://lefter.net/blog/wp-content/uploads/2008/11/bug5s4g8-650x336.jpg" width="550" /></p>
<p>有兴趣的朋友去看看看！有个疑问了，为什么IE的版本越到后来，bug越多呢？</p>
]]></content:encoded>
			<wfw:commentRss>http://lefter.net/blog/190-bugs-in-8-for-windows/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Quirks模式与Standards模式</title>
		<link>http://lefter.net/blog/quirks-standards/</link>
		<comments>http://lefter.net/blog/quirks-standards/#comments</comments>
		<pubDate>Fri, 31 Oct 2008 00:50:30 +0000</pubDate>
		<dc:creator>lujo</dc:creator>
				<category><![CDATA[前端开发&架构]]></category>
		<category><![CDATA[浏览器]]></category>

		<guid isPermaLink="false">http://ilujo.cn/?p=268</guid>
		<description><![CDATA[如何进入Standards模式?
一般来讲浏览器是通过DTD来判断模式的；浏览器进入Standards模式的DTD有：HTML的strict.dtd和loose.dtd这两个DTD的简单区别是

strict去掉了许多表现的标签，有利于结构和表现的... ]]></description>
			<content:encoded><![CDATA[<h3>如何进入Standards模式?</h3>
<p>一般来讲浏览器是通过DTD来判断模式的；浏览器进入Standards模式的DTD有：HTML的strict.dtd和loose.dtd这两个DTD的简单区别是</p>
<ul>
<li>strict去掉了许多表现的标签，有利于结构和表现的分离</li>
<li>loose会导致Firefox进入Almost Standards模式，在图片的处理上会有微小的差别</li>
</ul>
<p><strong>在IE6下，如果在DTD之前有任何字符都将导致其进入quirks模式</strong><br />
<img style="width: 550px;" src="http://lefter.net/blog/wp-content/uploads/2008/10/quirks-standards_html_m5ab95b5f-650x418.png" alt="" /></p>
<h3>Quirks模式与Standards模式的区别</h3>
<p>quirks和standards的区别很多都可以归为IE5和IE6的区别。</p>
<dl>
<dt>盒模型的高宽包含内补丁和边框</dt>
<dd>在W3C标准中，如果设置一个元素的宽度和高度，指的是元素内容的宽度和高度，而在Quirks模式下，IE的宽度和高度还包含了padding和border。IE5.5及以下的浏览器即使在Standards模式下，也会有这个问题</dd>
<dt>可以设置行内元素的高宽</dt>
<dd>在Standards模式下，给span等行内元素设置wdith和height都不会生效，而在quirks模式下，则会生效</dd>
<dt>可设置百分比的高度</dt>
<dd>在standards模式下，一个元素的高度是由其包含的内容来决定的，如果父元素没有设置百分比的高度，子元素设置一个百分比的高度是无效的</dd>
<dt>用margin:0 auto设置水平居中在IE下会失效</dt>
<dd>使用margin:0 auto在standards模式下可以使元素水平居中，但在quirks模式下却会失效,quirk模式下的解决办法，用text-align属性:
<pre><code>body{text-align:center};#{content:text-align:left}</code></pre>
</dd>
<dt>可以设置行内元素的高宽</dt>
<dd>在Standards模式下，给span等行内元素设置wdith和height都不会生效，而在quirks模式下，则会生效</dd>
<dt>设置图片的padding会失效</dt>
<dt>Table中的字体属性不能继承上层的设置</dt>
<dt>white-space: pre会失效</dt>
<dt>许多CSS默认样式将不同</dt>
<dd>在Standards模式下，给span等行内元素设置wdith和height都不会生效，而在quirks模式下，则会生效</dd>
<dt>JavaScript中的区别</dt>
<dd>Quirks mode的<a href="http://www.quirksmode.org/js/doctypes.html">Table of measurements</a></dd>
</dl>
<h4>参考</h4>
<ul>
<li><a href="http://www.quirksmode.org/js/doctypes.html">Table of measurements</a></li>
<li><a href="http//msdn2.microsoft.com/en-us/library/bb250395.aspx">MSDN</a></li>
</ul>
<p><ins datetime="2009-08-25T06:16:22+00:00">dom中的document有一个属性叫compatMode,其返回值是BackCompat和CSS1Compat，分别对应quirks mode和strict mode</ins>
<pre><code>void function(){
var mode=document.compat
if (mode="BackCompat")
alert("当前以quirks mode的方式渲染页面");
else if(mode="CSS1Compat")
alert("当前已strict mode的方式渲染页面");
else alert("浏览器版本不支持compatMode");
}()</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://lefter.net/blog/quirks-standards/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>分享一些优化网页加载速度的小技巧</title>
		<link>http://lefter.net/blog/load-page-faster/</link>
		<comments>http://lefter.net/blog/load-page-faster/#comments</comments>
		<pubDate>Wed, 24 Sep 2008 23:59:33 +0000</pubDate>
		<dc:creator>lujo</dc:creator>
				<category><![CDATA[体验&交互&平面&策划]]></category>
		<category><![CDATA[前端开发&架构]]></category>
		<category><![CDATA[css]]></category>

		<guid isPermaLink="false">http://ilujo.cn/?p=223</guid>
		<description><![CDATA[优化图片
1、减少图片数：去除不必要的图片。
2、降低图像质量：如果不是很必要，尝试降低图像的质量，尤其是jpg格式，降低5%的质量看起来变化不是很大，但文大小的变化是比较大的。
3、... ]]></description>
			<content:encoded><![CDATA[<h3>优化图片</h3>
<p>1、减少图片数：去除不必要的图片。<br />
2、降低图像质量：如果不是很必要，尝试降低图像的质量，尤其是jpg格式，降低5%的质量看起来变化不是很大，但文大小的变化是比较大的。<br />
3、常识使用脚本文件代替效果：<br />
比如一些web2.0的样式，如果使用ps制作，每个图片基本会增加%5-%25的大小成本.<br />
相反，使用javascript代码来实现效果,仅仅只增加几个字节.<br />
图像格式的选择<br />
一般在网页上使用的图片格式有三种，jpg、png、gif。<br />
1、JPG：一般用于展示风景、人物、艺术照的摄影作品。有时也用在电脑截屏上。<br />
2、GIF：提供的颜色较少，可用在一些对颜色要求不高的地方，比如网站logo、按钮、表情等等。当然，gif的一个重要的应用是动画图片。<br />
3、PNG：PNG格式能提供透明背景，是一种专为网页展示而发明的图片格式。一般用于需要背景透明显示或对图像质量要求较高的网页上。</p>
<h3>网址后加斜杠</h3>
<p>有些网址，比如www.yahoo.com当服务器收到这样一个地址请求的时候，它需要花费时间去确定这个地址的文件类型。如果220是一个目录，不妨在网址后多加一个斜杠，让其变成http://www.www.yahoo.com，这样服务器就能一目了然地知道要访问该目录下的index或default文件，从而节省了加载时间。</p>
<h3>五、标明高度和宽度</h3>
<p>当你在网页上添加图片或表格时，你应该指定它们的高度和宽度，也就是height和width参 数。如果浏览器没有找到这两个参数，它需要一边下载图片一边计算大小，如果图片很多，浏览器需要不断地调整页面。这不但影响速度，也影响浏览体验。</p>
<h3>减少http请求</h3>
<p>当浏览者打开某个网页，浏览器会发出很多组件（图像、脚本等等），视乎网络延时情况，每个对象加载都会有所延迟。如果网页上对象很多，这可以需要花费大量的时间。</p>
<p>因此，要为http请求减负。如何减负？</p>
<p>1、去除一些不必要的对象。<br />
2、将临近的两张图片合成一张。<br />
3、合并CSS文件<br />
看看下面这段代码，需要加载三个CSS文件：<br />
&lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;/body.css&#8221; /&gt;<br />
&lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;/side.css&#8221; /&gt;<br />
&lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;/footer.css&#8221; /&gt;<br />
我们可以将其合成一个：<br />
&lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; href=&#8221;/style.css&#8221; /&gt;<br />
从而减少http请求。<br />
<strong>其它小技巧:</strong><br />
1、去除不必要加载项。<br />
2、如果在网页上嵌入了其它网站的widget，如果有选择余地，一定要选择速度快的。<br />
3、尽量用图片代替flash，这对SEO也有好处。<br />
4、有些内容可以静态化就将其静态化，以减少服务器的负担。<br />
5、统计代码和JS文件一般放在页尾(或者使用延迟加载)。</p>
]]></content:encoded>
			<wfw:commentRss>http://lefter.net/blog/load-page-faster/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>建立优美的面向对象JS编程风格</title>
		<link>http://lefter.net/blog/oo-js-style/</link>
		<comments>http://lefter.net/blog/oo-js-style/#comments</comments>
		<pubDate>Tue, 12 Aug 2008 16:03:51 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[体验&交互&平面&策划]]></category>
		<category><![CDATA[前端开发&架构]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://ilujo.cn/?p=32</guid>
		<description><![CDATA[由于js语言自身语法的灵活性，使得在js程序中出现了各种各样的代码风格，但也正因为如此，导致了代码的可读性和可维护性大大降低，特别随着项目的不断更新，js代码的不断增多，到后期... ]]></description>
			<content:encoded><![CDATA[<p>由于js语言自身语法的灵活性，使得在js程序中出现了各种各样的代码风格，但也正因为如此，导致了代码的可读性和可维护性大大降低，特别随着项目的不断更新，js代码的不断增多，到后期维护时甚至连自己写的代码都不知所以然了，因此确定一种好的代码风格是很有必要的。近两年随着ajax的兴起，js变得越来越受“重用”，js开始在web开发中中充当着非常重要的角色，因此也开始遇到了各种各样的问题。于是很多牛人们就提出了js的面向对象编程方法。</p>
<p>使用面向对象的编程思想实现js代码其实也并不难，实现方法也又多种，比如prototype原型，new object()等方法。前面的每个方法都有其自己的优缺点，但都存在一个问题，那就是对于js变量作用域的控制。如果不能很好控制js变量作用域，就可能导致对象内部变量被外部肆意修改，从而导致程序被破坏，不便于程序的维护，对象的封装特性和程序健壮性都大打折扣。被由于js本身没有很好的对变量范围的定义（public/private等限定符），因此在js的面向对象编程中也就遇到了变量的控制问题，特别是对于对象内部的公有变量在prototype原型方法中都很难实现。</p>
]]></content:encoded>
			<wfw:commentRss>http://lefter.net/blog/oo-js-style/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HTML应当给予更多重视</title>
		<link>http://lefter.net/blog/html-important/</link>
		<comments>http://lefter.net/blog/html-important/#comments</comments>
		<pubDate>Tue, 12 Aug 2008 14:32:54 +0000</pubDate>
		<dc:creator>lujo</dc:creator>
				<category><![CDATA[体验&交互&平面&策划]]></category>
		<category><![CDATA[前端开发&架构]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[xhtnl]]></category>

		<guid isPermaLink="false">http://ilujo.cn/?p=9</guid>
		<description><![CDATA[国内关于 HTML 的文章不多，可能因为它过于容易上手而被很多前端人员所忽略，但不管怎样HTML仍然是Web的核心，所以彻底的了解HTML以及它背后的思想是非常有用的。
可惜的是，我国对于HTML的... ]]></description>
			<content:encoded><![CDATA[<p>国内关于 <acronym title="HyperText Markup Language"><span class="caps">HTML</span></acronym> 的文章不多，可能因为它过于容易上手而被很多前端人员所忽略，但不管怎样HTML仍然是Web的核心，所以彻底的了解HTML以及它背后的思想是非常有用的。</p>
<p>可惜的是，我国对于HTML的认识，特别在一些初学者中，有非常严重的错误。</p>
<p>让我们首先看看国内的一些术语。一些国内采用的术语：</p>
<ul>
<li>xhtml + css</li>
<li>div + css</li>
</ul>
<p>以上两种术语的流行也有一定的道理。使用table进行页面布局在我国仍然占据了大部分的网站，所以以上术语用来区分那些默认使用table来标记页面的技术还是十分直观和易于理解的。而对于国外的开发人员和设计师来说他们不需要使用以上这两个术语，因为采用符合语意的标记和使用CSS来制作网页已经大大超过了使用table，所以table已经被完全忽略了，这样还需要用“xhtml+css”或“div+css”来标识制作网页时采用的技术吗？显然默认的东西就没有必要提出了。</p>
<p><acronym title="eXtensible HyperText Markup Language"><span class="caps">XHTML</span></acronym> 是为了能够让HTML和XML兼容的一种产物，他的优势在于能够和W3C的其他XML的应用，如MathML、SVG兼容。但是我们现在写的网页是XHTML吗？显然不是。</p>
<p>你应当记住XHTML就是XML，所以它的content type应当 <strong>是application/xhtml+xml，而不是text/html</strong> 。所以如果你仍然象目前的Internet上的大多数网站一样，使用text/html作为你的站点的content type，那么你并没有使用XHTML，你用的仍然是HTML，只不过你在声明中添加了</p>
<pre><code>&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;
</code></pre>
<p>这条声明仅仅标识你的文档符合XHTML的标记标准，但是它并不表明你的文档正在以XHTML要求的方式被浏览器解析。事实上，人们不使用application/xhtml+xml因为，Internet Explorer 6 以及以下版本不能够解析application/xhtml+xml这种MIME type，如果你采用XHTML标准要求的content type发送文档，那么目前地球上大部分的人都看不到你的网页，所以人们仍然使用HTML。</p>
<p>所以xhtml+css是一个糟糕的术语。目前你至少应该使用HTML + CSS，而div+css更是荒谬的。但是如果你在编写HTML时，符合XHTML标准，那也非常好，至少在未来所有浏览器都支持XHTML后，你可以不用修改你的文档了，但是你心里应该明白，真正起作用的仅仅是HTML。</p>
<p>我想我们大部分人都应当重新审视HTML。</p>
<p>目前，W3C推荐的HTML版本是 <a href="http://www.w3.org/TR/REC-html40/"><span class="caps">HTML</span> 4.01</a> ，这一版本早在近十年前就已出现。在当时的HTML 4.01的设计来看，它早已突出了在我们现在看来非常重要的设计。</p>
<ul>
<li>国际化</li>
<li>文档与表现分离</li>
<li>无障碍性</li>
<li>符合语意的HTML</li>
</ul>
<p>HTML文档应当是一份要让全世界任何角落的人，不管他们本身和使用Internet的环境如何，都应当能够正常访问的文档。因此在我们编写HTML文档之前，脑中应当始终放着HTML的设计思想。其中，容易被很多人所忽略的是，中文网站不应当使用gb2312作为文档的字符编码，最好采用UTF-8。</p>
]]></content:encoded>
			<wfw:commentRss>http://lefter.net/blog/html-important/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>页面中 CSS 加载方式的优化</title>
		<link>http://lefter.net/blog/load-css-faster/</link>
		<comments>http://lefter.net/blog/load-css-faster/#comments</comments>
		<pubDate>Tue, 12 Aug 2008 13:57:24 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[前端开发&架构]]></category>
		<category><![CDATA[css]]></category>

		<guid isPermaLink="false">http://lujo.wasmy.name/?p=7</guid>
		<description><![CDATA[1、应该将 CSS 放置于结构的上方（一般放置于 head 元素内）。CSS 是解释型语言，Firefox 和 IE 在等待 CSS 传输完成之前不会渲染任何东西。只有将 CSS 前置，才可在浏览器解析结构时，对页面进行... ]]></description>
			<content:encoded><![CDATA[<p>1、应该将 CSS 放置于结构的上方（一般放置于 head 元素内）。CSS 是解释型语言，Firefox 和 IE 在等待 CSS 传输完成之前不会渲染任何东西。只有将 CSS 前置，才可在浏览器解析结构时，对页面进行渲染。</p>
<blockquote><p>This causes the blank white screen problem. The page is totally blank until the stylesheet at the bottom is downloaded, on the order of 6-10 seconds for this page. The browser is waiting for the stylesheet to be loaded before it renders anything else in the page, even the static text.</p></blockquote>
<p>导致的问题就是，页面会有一段时间“朴素”，突然之间又“华丽”，用户体验很不好。</p>
<p>2、尽量使用 &lt;link rel=”stylesheet” href=”http://www.planabc/yuanxin.css” type=”text/css”&gt; 的样式导入方式，而减少 @import 的使用，更勿使用多层嵌套的 @import 。因为在 IE 里， @import 相当于将 &lt;link&gt; 放在页面尾部。</p>
<blockquote><p>This is a valid syntax, but, even though it’s in the document’s HEAD, it breaks progressive rendering and instead causes the blank white screen and Flash of Unstyled Content problems</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://lefter.net/blog/load-css-faster/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
