<?xml version="1.0" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="css/rss.xslt"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>Roc's blog - Javascript</title><link>http://www.liquidroc.name/</link><description>内心的呐喊来自于对前路的追求～ - </description><generator>RainbowSoft Studio Z-Blog 1.8 Arwen Build 81206</generator><language>zh-CN</language><copyright>Copyright 2006-2008 Rocstudio. Some Rights Reserved.</copyright><pubDate>Thu, 09 Sep 2010 06:24:06 +0800</pubDate><item><title>JavaScript渐进增强</title><author>a@b.com (rocchow)</author><link>http://www.liquidroc.name/post/progressive-enhancement-with-javascript.html</link><pubDate>Tue, 11 Nov 2008 07:52:32 +0800</pubDate><guid>http://www.liquidroc.name/post/progressive-enhancement-with-javascript.html</guid><description><![CDATA[<div id="notice"><p>原文：<a href="http://www.alistapart.com/articles/progressiveenhancementwithjavascript">Progressive Enhancement with JavaScript</a></p><p>作者：<a href="http://www.alistapart.com/authors/g/aarongustafson">Aaron Gustafson</a></p><p>翻译：Roc</p></div><p>如果你已经阅读了本系列的前两篇文章，对于渐进增强你应该游刃有余了。在本文中，我们要继续探讨的是如何理性地把渐进增强应用于客户端脚本技术上。你接下来要了解的无外乎两件事：有节制的和有计划的。</p><h2>学会四两拨千斤</h2><p>你或许听过&ldquo;权利腐败&rdquo;这种专业术语。这个词有很多想象的空间，但对我们而言，还是聊聊这两个词的本意吧。JavaScript绝对是能力非凡的一种工具，但却在很长一段时期内臭名远扬于网络界。它给在网络冲浪者制造各种麻烦，带来各种错误信息以及数不胜数的弹窗广告。正是由于对JavaScript的滥用，使其被深深的误解为一种罪恶之源。</p><p>JavaScript不光是弊大于利，更可怕的是它还会变得难以驾驭。事实上，它更像纵横交错的盘丝洞，让你在想要让它派上用场的时候才发现，该来的（效果）没来，不该来的（状况）全来了；维护这些不断纠结并且晦涩难懂的代码简直是噩梦。</p><p>在那段岁月中，JavaScript的在人们眼里毫无形象可言：浏览器还没有很好的支持标准化，开发者也正忙着往HTML里面不断掺入各自的特有代码。为了实现任何一个跨浏览器的兼容性，哪怕只是简单到家的图像翻转效果，JavaScript也只能揽下这些脏活。</p><p>值得欣慰的是，现在我们的处境好多了，JavaScript也干净许多。但是，我们必须要负责任的思考它的能力了。琢磨JavaScript能做什么，不如把更多精力放在思考如何合理使用JavaScript。千万别冲动。渐进增强法会助我们一臂之力，是它让我们把内容放在首位，然后从中衍生开去。</p><h2>做到心有原则</h2><p>利用渐进增强，在一个可用代码的基础之上构建站点。必须牢记在心的JavaScript核心精神是：在客户端不支持脚本的情况下，任何用户依然能够理解页面要传达出的目的。没错，我要说的就是这些。</p><p>例如：也许你要面对的是一个产品销售对照表。该站点的需求里写到，数据应当可以按纵列分类，你可能会想利用Ajax技术把这个表格加载到页面上，因为这样一来，你可以快速的在服务器端将其分类。听起来这方法完美极了？</p><p>大错特错！</p><p>当关闭了JavaScript的潜在用户光临本页的时候，会发生什么状况？如果内容是通过JavaScript技术载入页面的话，客户将一无所获（哪怕是处于未排序的最初内容）。谁会购买一件压根看不到的产品呢？</p><p>上述情景中还不包括搜索这个因素。搜索引擎不会加载运行JavaScript，也就是说，如果你在页面上使用JavaScript载入内容，搜索引擎将永远不去读取或索引你的内容。试想一个不被谷歌、微软和雅虎纳入索引的、永远搜不到的产品，又能有几个客户上门呢？</p><p>按渐进增强的思路去做同样的事，可以先将基础的表格写入HTML。绝大多数情况下该表格仍然由后台生成，但采用直接的嵌入页面要比通过Ajax加载好。你还需要编写一个通过DOM定位这个表格的脚本，使其拥有如下的交互：生成分类链接，把它们的onclick事件和Ajax调用绑定。一个可分类版的表格诞生了。</p><p>至此，你不仅满足了需求，并且提供给搜索引擎蜘蛛和禁用JavaScript用户一个&ldquo;降级&rdquo;的体验。</p><p>再深入一步，你甚至可以在表头手动添加一个分类链接，通过（点击）这些带有参数的链接，得到重新分类表格的刷新页。这样一来，禁用JavaScript的用户也同样可将数据分类，虽然没有那么炫的体验了，但功能上却保持完整。</p><p>脚本里再做一些细微调整，更可以让你拦截（这些手动添加的）链接，执行原有的Ajax请求，从而带给大多数有能力的用户以最佳体验。终于，你得到了一个完美的渐进增强案例。</p><p>你已经对JavaScript的渐进增强有了一个基本了解，接下来我们讨论一些入门的实用技术。</p><h2>别让脚本失控了</h2><p>有效融入渐进增强的关键一点就是建立有序的脚本规划。要做到这一点，你必须先对&ldquo;<a href="http://en.wikipedia.org/wiki/Unobtrusive_JavaScript">非扰性JavaScript</a>&rdquo;<sup>注1</sup>有一个清晰的认识。非扰性JavaScript技术乃是用于客户端脚本渐进增强的基石。</p><p>&ldquo;非干扰&rdquo;的第一步是去除所有的行内事件处理代码，这些都是可以轻而易举地通过DOM注册替代：</p><pre>&lt;a href=&quot;http://msdn.com&quot;<del> onclick=&quot;return newWin(this.href);&quot;</del>&gt;</pre><p>接着是把所有的脚本移到外链JS文件里，这远远好于把代码都写在script元素中：</p><pre><del>&lt;script type=&quot;text/javascript&quot;&gt;  // my script&lt;/script&gt;</del><ins>&lt;script type=&quot;text/javascript&quot; src=&quot;myscript.js&quot;&gt;&lt;/script&gt;</ins></pre><p>此举将使维护变得更为容易，不过也要额外开销。（说老实话，以上两点改动需要费些精力，因为许多基于<strong>所见即所得</strong>模式工作的编辑和网络应用程序开发框架生成极其烦人的JavaScript会导致无法预测的结果，万幸的是，在许多系统里你可以利用补丁和插件去纠正他们的陋习。）</p><p>要使得脚本&ldquo;非干扰&rdquo;的接下来一步取决与何时以及如何把它们加进来。最简单来说就是，为了确保脚本能够在用户的浏览器中运行，在调用方法之前要先检查是否支持此方法：</p><pre>if( document.getElementById ){  scriptUsingGetElementById();}</pre><p>你或许还想测试你所需的任一对象，或许甚至想检查用作脚本挂钩（Hooks）的标识元素是否存在。对于你所使用的每一个脚本都按照这个流程处理下来，一种<strong>点单式</strong>的交互体验就创建成形了，只有那些用户浏览器可以识别处理的，且在当前页面HTML标记中运行的标记才会被执行。</p><p>关于非扰性JavaScript的更多信息，你可以访问<a target="_blank" href="http://www.alistapart.com/articles/behavioralseparation">专题中Jeremy Keith的文章</a>。</p><h2>样式分离</h2><p>脚本的存在不能脱离实际的土壤，所以就像上面所说的脚本和标记应当分离，同理，脚本和样式之间也要分离。</p><p>总体而言，当你在DOM创建或试图控制某个元素时，你不应当再在里面添加行内样式了。取而代之的是使用类名，该类名和全局样式表或某一对应特定脚本的样式表相关联：</p><pre>var el = document.getElementById( 'message' );<del>el.style.color = '#f00';el.style.backgroundColor = '#ffcfcf';</del><ins>el.className = 'highlighted';</ins></pre><p>如果脚本需要许多样式才能交互起来，那么使用对应特定脚本的样式表会是个不错的选择。在使用样式表的脚本中这样的设置，使得我们可以独立于站点其它样式表之外去维护这些样式表。此外，它还可以让样式表只有在脚本被执行时才能被引用链接，因此，对于那些不使用或是不支持该脚本的浏览器来说，页面加载时间也得到了缩短。</p><p>一旦你决定将样式嵌入主样式表，必须确保一点，那就是采用上述方法给元素添加样式，以便让这些样式只有在脚本成功运行后才显示出来。</p><p>关于样式和脚本分离的更多信息，你可以阅读<a target="_blank" href="http://scrollmagazine.com/number-1">Scoll首发</a>的<a target="_blank" href="http://scrollmagazine.com/number-1/keeping-the-hot-side-hot">这篇文章</a>（现在只能在实体书上看到了）。</p><h2>向着&ldquo;渐进增强&rdquo;进发吧</h2><p>我们通篇回顾了在JavaScript中实现渐进增强的思路以及实践的一些技术。我们也涉及了一点&ldquo;非干扰&rdquo;脚本技术的概念，并从中学习到不少管理CSS和JavaScript内部关系的技巧。</p><p>我们关于渐进增强以及如何在CSS和JavaScript中使用渐进增强的一系列介绍就到本文为止了。希望这些文章能够引发你的思考，并且促使你最终在工作中使用渐进增强。</p><div id="note"><p>注1：unobtrusive JavaScript,这里我翻译为非扰性JavaScript，可能更专业更统一的说法是&ldquo;非侵入式&rdquo;</p><p>P.S. 这篇文章翻译好了很久因为没有校对，放了很久，却发现来自淘宝UED的<a href="http://lifesinger.org/blog/?p=786">射雕也翻译了一个版本</a>，犹豫再三，想想还是不要浪费自己的翻译劳动吧，而且给关注渐进增强的朋友多一个选择。</p></div>]]></description><category>Javascript</category><comments>http://www.liquidroc.name/post/progressive-enhancement-with-javascript.html#comment</comments><wfw:comment>http://www.liquidroc.name/</wfw:comment><wfw:commentRss>http://www.liquidroc.name/feed.asp?cmt=75</wfw:commentRss><trackback:ping>http://www.liquidroc.name/cmd.asp?act=tb&amp;id=75&amp;key=aff186fc</trackback:ping></item><item><title>IE浏览器下:first-letter的混乱之治</title><author>a@b.com (rocchow)</author><link>http://www.liquidroc.name/post/pseudo-element-first-letter-chaos.html</link><pubDate>Sat, 26 Jul 2008 16:13:05 +0800</pubDate><guid>http://www.liquidroc.name/post/pseudo-element-first-letter-chaos.html</guid><description><![CDATA[<p>写这篇文章的起因来自与<a target="_blank" href="http://andymao.com/andy/">毅博客</a>的《<a target="_blank" href="http://andymao.com/andy/post/100.html">美化段落文本 2</a>》，在这篇文章的最后振之谈到了关于:first-letter这样的伪类元素的特点：</p><blockquote><p>有一次我试图让&lt;div id=&quot;acticle&quot;&gt;&lt;p&gt;&hellip;&hellip;&lt;/p&gt;&lt;/div&gt;中的P也能实现首字下沉，可是结果却失败了，得出的结论是：我们并不能隔着一层标签去控制子对象中的第一个字符。</p></blockquote><p>由于这句存在误解的可能性（我就误解了他的意思），振之在第一时间就删除这句话。他的意思准确地说，是:first-letter这个伪类无法向下&ldquo;继承&rdquo;。例如：</p><div class="csharpcode"><pre class="alt"><span class="lnum">   1:  </span><span class="kwrd">&lt;</span><span class="html">div</span> <span class="attr">id</span><span class="kwrd">=&quot;demo&quot;</span><span class="kwrd">&gt;</span></pre><pre><span class="lnum">   2:  </span>    <span class="kwrd">&lt;</span><span class="html">p</span><span class="kwrd">&gt;</span>我要实现首字下沉<span class="kwrd">&lt;/</span><span class="html">p</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">   3:  </span><span class="kwrd">&lt;/</span><span class="html">demo</span><span class="kwrd">&gt;</span></pre><style type="text/css">.csharpcode, .csharpcode pre{	font-size: small;	color: black;	font-family: consolas, "Courier New", courier, monospace;	background-color: #ffffff;	/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {	background-color: #f4f4f4;	width: 100%;	margin: 0em;}.csharpcode .lnum { color: #606060; }</style></div><p>&nbsp;</p><p>如果只定义#demo:first-letter，我们将看不到任何结果，必须使用#demo p:first-letter。和a:link这样的链接伪类不同，:first-letter（当然还有其他的）无法向下&ldquo;继承&rdquo;。之所以加上引号，是因为:first-letter的这种无法穿透子对象的特性和通常定义的继承有所区别。这一概念在《<a target="_blank" href="http://www.china-pub.com/36900">CSS权威指南</a>》中是这样定义的：基于继承机制，样式不仅应用到指定元素，还会应用到它的后代元素。假设在上面的html代码中我们给外层定义一个边框：#demo { border： 1px solid #000; }，我们知道这里无法向下继承的是border属性，而:first-letter是一个伪类元素，换个说法，:first-letter中的任何属性均不向下继承。</p><div class="csharpcode"><pre class="alt"><span class="lnum">   1:  </span>#demo:first-letter { font-size:2.5em; font-family:&quot;楷体_GB2312&quot;; font-weight:bold; </pre><pre><span class="lnum">   2:  </span>line-height:1.2em; float:left; padding:5px 2px 0 0; color:#c00 }</pre><pre class="alt"><span class="lnum">   3:  </span>&nbsp;</pre><pre><span class="lnum">   4:  </span>#demo p:first-letter { font-size:2.5em; font-family:&quot;楷体_GB2312&quot;; font-weight:bold; </pre><pre class="alt"><span class="lnum">   5:  </span>line-height:1.2em; float:left; padding:5px 2px 0 0; color:#c00 }</pre></div><p><style type="text/css">.csharpcode, .csharpcode pre{	font-size: small;	color: black;	font-family: consolas, "Courier New", courier, monospace;	background-color: #ffffff;	/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {	background-color: #f4f4f4;	width: 100%;	margin: 0em;}.csharpcode .lnum { color: #606060; }</style></p><p>&nbsp;</p><p>如果问题仅仅是这个，那么文章也到此结束了。但是在我测试:first-letter这个伪类元素的特质是否存在于各大浏览器的时候，我发现在IE8下，不论我如何设置我的css(如上)，效果都是不可见的。原谅我的孤陋寡闻，我竟然怀疑起<a target="_blank" href="http://www.my-debugbar.com/wiki/IETester/HomePage">IE Tester</a>的性能，我第一想到的是它对IE8的渲染核心设置有误。接着我升级了我的IE7&hellip;&hellip;直到我在崭新的IE8 beta1浏览器中打开测试页的时候，我还是没有怀疑IE8，因为即使是IE5.5也是支持:first-letter伪类的。</p><p>叼着烟斗的名侦探说过：&ldquo;除掉所有不可能的，留下来的，无论多么不合理，但它就是真相......！&rdquo;是的，真相就是IE8 beta1不支持:first-letter（还有:first-line）。我希望这是beta1版本中的一处来不及修复的bug，因为在微软官方的<a target="_blank" href="http://msdn.microsoft.com/en-us/library/cc351024(VS.85).aspx">IE5~IE8 CSS兼容表</a>中，明确的标明了出去IE5不支持:first-letter外，其他版本一律支持。这一点，在许多博客中都被提及，例如<a href="http://www.planabc.net/about/">怿飞</a>的<a target="_blank" href="http://www.planabc.net/2008/03/06/css_features_in_ie8/">IE8 beta1 中的 CSS 属性</a>。</p><p>如果你的兼容性检查列表中还没有IE8的名字，如果你觉得诸如首字下沉这样的额外视觉效果可有可无，那么你可以在这一行结束浏览了。但，如果你执着于此，希望IE8的用户也可以在你的网页上看到类似于报刊文章上的效果，你可以往下看。</p><p>在多次努力之后，我放弃折腾那可怜的css，IE8b1对于:first-letter的不支持，不是在css hack层面能解决的。我们只能求助于js。我们需要找到一个页面中第一个段落开始的地方，找到这个段落第一个字，让js将其处理为特殊样式：</p><div class="csharpcode"><pre><span class="lnum">   1:  </span>window.onload = initial;</pre><pre><span class="lnum">   2:  </span><span class="kwrd">function</span> initial() {</pre><pre><span class="lnum">   3:  </span>    <span class="kwrd">var</span> letter = document.getElementsByTagName(<span class="str">'p'</span>)[0];</pre><pre><span class="lnum">   4:  </span>    <span class="kwrd">var</span> word = letter.firstChild.nodeValue;</pre><pre><span class="lnum">   5:  </span>    <span class="kwrd">var</span> num = word.substring(0,1);</pre><pre><span class="lnum">   6:  </span>    <span class="kwrd">var</span> other = word.substring(1,word.length);</pre><pre><span class="lnum">   7:  </span>    document.getElementsByTagName(<span class="str">'p'</span>)[0].innerHTML= </pre><pre>           <span class="str">&quot;&lt;span id='first-letter-plus'&gt;&quot;</span> + num + <span class="str">&quot;&lt;/span&gt;&quot;</span> + other;</pre><pre><span class="lnum">   8:  </span>}</pre></div><p><style type="text/css">.csharpcode, .csharpcode pre{	font-size: small;	color: black;	font-family: consolas, "Courier New", courier, monospace;	background-color: #ffffff;	/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {	background-color: #f4f4f4;	width: 100%;	margin: 0em;}.csharpcode .lnum { color: #606060; }</style><style type="text/css">.csharpcode, .csharpcode pre{	font-size: small;	color: black;	font-family: consolas, "Courier New", courier, monospace;	background-color: #ffffff;	/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {	background-color: #f4f4f4;	width: 100%;	margin: 0em;}.csharpcode .lnum { color: #606060; }</style></p><p>&nbsp;</p><p>原谅我的js水平，我始终无法直接定义num的方法，我只能给其添加一些标记，以至于代码如此臃肿，我相信一定有更简单、更强大的js方法。</p><p>接下来，我们只需要在css中这样定义：</p><div class="csharpcode"><pre><span class="lnum">   1:  </span>#demo #first-letter-plus { font-size:40px; font-family:&quot;楷体_GB2312&quot;; </pre><pre><span class="lnum">   2:  </span>font-weight:bold; font-style: normal; line-height:1.2em; float:left; </pre><pre><span class="lnum">   3:  </span>padding:5px 2px 0 0; color:#c00; }<br /></pre></div><p><style type="text/css">.csharpcode, .csharpcode pre{	font-size: small;	color: black;	font-family: consolas, "Courier New", courier, monospace;	background-color: #ffffff;	/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {	background-color: #f4f4f4;	width: 100%;	margin: 0em;}.csharpcode .lnum { color: #606060; }</style></p><p>查看<a target="_blank" href="http://www.liquidroc.name/download/demo/ie8-pseudo-classes1.html">效果页面1</a>，所有的浏览器都搞定了，这一切都建立在不关闭js的前提下。但是对于一些完美者来说，考虑到有人会关闭js运行浏览器时，我们需要再额外添加一些代码：</p><div class="csharpcode"><pre><span class="lnum">   1:  </span>#demo p:first-child:first-letter { font-size: 40px; font-family:&quot;楷体_GB2312&quot;;</pre><pre><span class="lnum">   2:  </span> font-weight:bold; line-height:1.2em; float:left; padding:5px 2px 0 0; color:#c00; }</pre></div><p><style type="text/css">.csharpcode, .csharpcode pre{	font-size: small;	color: black;	font-family: consolas, "Courier New", courier, monospace;	background-color: #ffffff;	/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {	background-color: #f4f4f4;	width: 100%;	margin: 0em;}.csharpcode .lnum { color: #606060; }</style></p><p>这样在关闭js的情况下，FF、Opera以及Safari都可以正常显示应有的首字下沉效果，不过IE们就有些混乱，IE8b1天生不支持，无效果；IE7正常；IE6不识别:first-child:first-letter这样的用法；IE5.5神奇的识别了:first-letter，但是它忽略了:first-child，这导致了所有段落p都会有一个首字下沉的效果，这可不是我们排版上希望看到的。并且当你回复使用js的时候，在Opera中会产生一个有趣的现象，段落的前两个字都有了效果，查看<a target="_blank" href="http://www.liquidroc.name/download/demo/ie8-pseudo-classes2.html">效果页面2</a>。这是因为在Opera中，第一个字包含在&lt;span&gt;&lt;/span&gt;中，效果由js实现，Opera认为p的:first-letter应该在&lt;span&gt;&lt;/span&gt;之后开始。</p><p>因此，我们需要改动一下css:</p><div class="csharpcode"><pre><span class="lnum">   1:  </span>#demo <strong>p <span class="kwrd">&gt;</span> *:first-child:first-letter</strong> { font-size: 40px; font-family:&quot;楷体_GB2312&quot;; </pre><pre><span class="lnum">   2:  </span>font-weight:bold; line-height:1.2em; float:left; padding:5px 2px 0 0; color:#c00; }</pre></div><p><style type="text/css">.csharpcode, .csharpcode pre{	font-size: small;	color: black;	font-family: consolas, "Courier New", courier, monospace;	background-color: #ffffff;	/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {	background-color: #f4f4f4;	width: 100%;	margin: 0em;}.csharpcode .lnum { color: #606060; }</style></p><p>这样以来，Opera中的奇怪现象也消失了。查看这个<a target="_blank" href="http://www.liquidroc.name/download/demo/ie8-pseudo-classes3.html">效果页面3</a>。</p><p>说实话，我并不推荐使用如此繁复的代码（效果页面2和3）实现一个首字下沉。就好像在html中不推荐使用&lt;q&gt;&lt;/q&gt;那样。直接使用效果页面1的代码，让js去做这个在IE中找不到平衡点的事情&mdash;&mdash;js开启，大家都有同样的效果；js关闭，效果也一起消失。因为它不仅使得IE8可以应用首字下沉的效果，也避免了其他版本IE在对:first-child:first-letter这样的一个css应用上的处理差异（直接使用:first-letter会让每个段落开头都有一个首字下沉效果，这也是为什么振之在他的博客正文中不使用这个效果的原因）。</p><p>上帝保佑，IE8正式推出的时候可以支持:first-child（还有:first-line）。</p>]]></description><category>Javascript</category><comments>http://www.liquidroc.name/post/pseudo-element-first-letter-chaos.html#comment</comments><wfw:comment>http://www.liquidroc.name/</wfw:comment><wfw:commentRss>http://www.liquidroc.name/feed.asp?cmt=33</wfw:commentRss><trackback:ping>http://www.liquidroc.name/cmd.asp?act=tb&amp;id=33&amp;key=86288771</trackback:ping></item><item><title>iframe高度自适应，兼容FF、Opera、Safari</title><author>a@b.com (rocchow)</author><link>http://www.liquidroc.name/post/iframe_auto_fit_height.html</link><pubDate>Fri, 20 Jun 2008 20:44:22 +0800</pubDate><guid>http://www.liquidroc.name/post/iframe_auto_fit_height.html</guid><description><![CDATA[<p>网上关于iframe高度自适应的代码有很多，但比较杂乱，有一些过于复杂，有一些存在明显错误。<a href="http://www.welcome58.cn/">缘由心生</a>给出了一段修改后的精简版本，感觉不错，简单修正了其中一处Opera下的错误，代码如下：</p><p>JavaScript部分：</p><p class="code"><code>&lt;script&nbsp;type="text/javascript"&gt;<br/>function&nbsp;SetCwinHeight(iframeObj){<br/>if&nbsp;(document.getElementById){&nbsp;<br/>&nbsp;&nbsp;if&nbsp;(iframeObj){<br/>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(iframeObj.contentDocument&nbsp;&&&nbsp;iframeObj.contentDocument.body.offsetHeight){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iframeObj.height&nbsp;=&nbsp;iframeObj.contentDocument.body.offsetHeight;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;(document.frames[iframeObj.name].document&nbsp;&&&nbsp;document.frames[iframeObj.name].document.body.scrollHeight){&nbsp;&nbsp;iframeObj.height&nbsp;=&nbsp;document.frames[iframeObj.name].document.body.scrollHeight;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;}<br/>}<br/>&lt;/script&gt;</code></p><p>html部分：</p><p class="code"><code>&lt;iframe&nbsp;name="frameContent"&nbsp;src="*"&nbsp;frameborder="0"&nbsp;width="100%"&nbsp;onload="SetCwinHeight(this)"&gt;&lt;/iframe&gt;</code></p><p>标记*号的地方填入iframe页面的地址。需要注意的是，src地址必须是在同一网站下，否则会出现&ldquo;权限被禁止&rdquo;的错误。</p><p>以上只是一个简单的iframe高度自适应版本，口碑网UED小组有一篇专门讨论iframe高度的文章，那里有<a href="http://ued.koubei.com/?p=243" target="_blank">更强壮的Js脚本</a>。</p>]]></description><category>Javascript</category><comments>http://www.liquidroc.name/post/iframe_auto_fit_height.html#comment</comments><wfw:comment>http://www.liquidroc.name/</wfw:comment><wfw:commentRss>http://www.liquidroc.name/feed.asp?cmt=4</wfw:commentRss><trackback:ping>http://www.liquidroc.name/cmd.asp?act=tb&amp;id=4&amp;key=f85d6681</trackback:ping></item></channel></rss>
