<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet href='http://feed.feedsky.com/styles/feedsky8.xsl' type='text/xsl' ?><!--这是一个由Feedsy提供技术支持的Feed，为了提高读者阅读的体验，以及满足用户美化自己Feed的需要，我们设计了多种精美的Feed模板，提供给大家选择，所有最终呈现出来的样式，皆由用户自愿选择使用，未经许可，任何团体和个人，请不要擅自修改样式或者盗用，这是对于用户选择权的尊重。--><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:fs="http://www.feedsky.com/namespace/feed" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link href="http://feed.pmme.cn" type="application/rss+xml" rel="self"></atom:link><fs:self_link href="http://feed.feedsky.com/berg" type="application/rss+xml"></fs:self_link><lastBuildDate>Tue, 29 Dec 2009 13:49:53 GMT</lastBuildDate><title>冰山一角</title><description>关注技术、世界上各种新奇的事物、思想以及记录自己</description><link>http://www.pmme.cn</link><sy:updatePeriod>hourly</sy:updatePeriod><sy:updateFrequency>1</sy:updateFrequency><language>en</language><pubDate>Tue, 29 Dec 2009 14:09:41 GMT</pubDate><item><title>添加第一个功能按钮 – 在线编辑器(3)</title><link>http://www.pmme.cn/archive/first-functio/</link><content:encoded>&lt;p&gt;在实现了在网页中插入一个可编辑区域以后，用户已经可以在这个区域中操作富文本内容。但是做为一个真正的编辑器是要有工具栏的，用户能通过工具栏上的按钮方便的对选中的文本进行操作。本文将介绍如何添加编辑器功能按钮。&lt;/p&gt;
&lt;h3&gt;加粗按钮&lt;/h3&gt;
&lt;p&gt;首先，我们在页面中添加工具条的HTML代码：&lt;/p&gt;
&lt;pre&gt;&amp;lt;div id=&quot;editor_toolbar&quot;&amp;gt;
    &amp;lt;input id=&quot;editor_toolbar_bold&quot; type=&quot;button&quot; value=&quot;B&quot;
style=&quot;font-weight:bold;&quot; onclick=&quot;editorInstance.bold()&quot; /&amp;gt;
&amp;lt;/div&amp;gt;&lt;/pre&gt;
&lt;p&gt;工具条中包含一个按钮，在按钮被按下时，调用editorInstance的bold()方法。期望的结果是：在编辑框内，选中的区域将被加粗。&lt;/p&gt;
&lt;h3&gt;加粗操作&lt;/h3&gt;
&lt;p&gt;接下来需要实现加粗功能，在此之前，需要对execCommand()有一定了解&lt;/p&gt;
&lt;h4&gt;execCommand&lt;/h4&gt;
&lt;p&gt;execCommand浏览器自带的一个接口，通过它，我们可以对document、selection、或者一个给定的range进行操作。如加粗、斜体等。&lt;/p&gt;
&lt;p&gt;语法：&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;javascript&quot; style=&quot;font-family:monospace;&quot;&gt;bSuccess &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; object.&lt;span style=&quot;color: #660066;&quot;&gt;execCommand&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;sCommand &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; bUserInterface&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#93;&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; vValue&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp;
sCommand
    String，指定需要执行的命令，如Bold
&amp;nbsp;
bUserInterface
    Boolean，可选，决定是否显示用户界面，如弹出一个提示框让用户输入，默认为&lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;false&lt;/span&gt;。
&amp;nbsp;
vValue
    Variant，可选，一个字符串、数字、或者其他需要assign的值&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;一般来说，第二个参数会传入false，因为编辑器本身会接管用户界面，第三个参数按照实际需要传入。这样就可以实现对选区的加粗：&lt;/p&gt;
&lt;div&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;javascript&quot; style=&quot;font-family:monospace;&quot;&gt;document.&lt;span style=&quot;color: #660066;&quot;&gt;execCommand&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;Bold&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;h4&gt;代码实现&lt;/h4&gt;
&lt;p&gt;只需调用浏览器的execCommand方法，选区就被加粗了。&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;javascript&quot; style=&quot;font-family:monospace;&quot;&gt;editor.&lt;span style=&quot;color: #660066;&quot;&gt;Editor&lt;/span&gt;.&lt;span style=&quot;color: #660066;&quot;&gt;prototype&lt;/span&gt;.&lt;span style=&quot;color: #660066;&quot;&gt;bold&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#123;&lt;/span&gt;
    &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;this&lt;/span&gt;.&lt;span style=&quot;color: #660066;&quot;&gt;document&lt;/span&gt;.&lt;span style=&quot;color: #660066;&quot;&gt;execCommand&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;Bold&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;简单极了！但是总觉得少了什么？是的，没有状态反射。不论用户选中的是否一段加粗的文本，按钮只有一个状态，用户无法感知当前选中文本的状态。&lt;/p&gt;
&lt;h3&gt;状态反射&lt;/h3&gt;
&lt;p&gt;添加状态反射的思路是：在选区发生变化的时候，编辑器核心派发一个事件，在此事件发生时判断此时选区的状态，根据状态设置按钮样式。&lt;/p&gt;
&lt;p&gt;为何不由编辑器核心直接设置按钮样式呢？这是因为通过事件通讯能最大程度的降低模块和核心之间的耦合，也是模块可插拔的基础。&lt;/p&gt;
&lt;h4&gt;监听选区变化&lt;/h4&gt;
&lt;p&gt;造成选区发生变化的根源是鼠标点击或者键盘击键。因此，通过监听onkeydown和onmouseup事件就可以较粗略的得知选区变化。其实，此处将成为编辑器复杂后的第一个性能瓶颈，具体优化办法今后将具体描述。&lt;/p&gt;
&lt;h4&gt;事件机制&lt;/h4&gt;
&lt;p&gt;在本示例中，我实现了一个很简单的事件机制，外部模块通过 addEventListener 方法绑定方法到指定的事件，编辑器可以通过 dispatchEvent 方法派发指定的事件。具体代码见文末示例，不再赘述。&lt;/p&gt;
&lt;h4&gt;queryCommandState&lt;/h4&gt;
&lt;p&gt;在获得选区变化信息，并且能成功派发事件后，就需要使用浏览器提供的queryCommandState方法来获知选区状态了。&lt;/p&gt;
&lt;p&gt;语法：&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;javascript&quot; style=&quot;font-family:monospace;&quot;&gt;bDone &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; object.&lt;span style=&quot;color: #660066;&quot;&gt;queryCommandState&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;sCmdID&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;其中的sCmdID是命令标识符，和execCommand接受的第一个参数是相同的。&lt;/p&gt;
&lt;p&gt;于是，只需使用：&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;javascript&quot; style=&quot;font-family:monospace;&quot;&gt;editor.&lt;span style=&quot;color: #660066;&quot;&gt;document&lt;/span&gt;.&lt;span style=&quot;color: #660066;&quot;&gt;queryCommandState&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;Bold&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;就可以获得当前选区是否处于加粗状态了。&lt;/p&gt;
&lt;p&gt;好了，加粗按钮到此就完成了，大家可以看看&lt;a href=&quot;/files/demo/editor/editor-2.html&quot; target=&quot;_blank&quot;&gt;示例&lt;/a&gt;，只在上次示例的基础上新增了60行代码。&lt;/p&gt;
&lt;h3&gt;浏览器差异&lt;/h3&gt;
&lt;p&gt;最后不得不提的是浏览器差异。&lt;/p&gt;
&lt;p&gt;execCommand和queryCommandState各个浏览器支持的程度相去甚远，ppk大神有一个execCommand浏览器支持程度的详细表格：&lt;a href=&quot;http://www.quirksmode.org/dom/execCommand.html&quot; target=&quot;_blank&quot;&gt;execCommand Compatibility&lt;/a&gt;。正是由于这些浏览器的差异，可能会造成一些在A浏览器下编辑好的内容，在B浏览器下无法修改，或者状态无法反射。&lt;/p&gt;
&lt;p&gt;因此，一些成熟的编辑器都会重写这些命令和查询方法，以达到浏览器之间表现一致的目的。做的最好的当属&lt;a href=&quot;http://ckeditor.com/&quot; target=&quot;_blank&quot;&gt;ckeditor&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;小结&lt;/h3&gt;
&lt;p&gt;本文完成了加粗按钮，一个按钮一般包括两个部分，设置选区状态，反射选区状态。可以使用浏览器的接口 execCommand 和 queryCommandState 来简单实现。&lt;/p&gt;
&lt;p&gt;通过前几篇文章，大家应该对编辑器的基本知识有了一定了解了，下一篇文章开始，我将和大家一起分析编辑器的需求，首先会从功能层面开始。本文是在线编辑器系列文章的第三篇，在这个系列文章中，我会逐步深入和大家分享编辑器开发过程中的奥妙和各种奇怪的问题。如果你对我的文章感兴趣，欢迎&lt;a href=&quot;http://feed.pmme.cn/&quot; target=&quot;_blank&quot;&gt;订阅&lt;/a&gt;我的博客及时收到更新。&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/316521719/berg/feedsky/s.gif?r=http://www.pmme.cn/archive/first-functio/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/berg/316521719/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/berg/316521719/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content:encoded><wfw:commentRss>http://www.pmme.cn/archive/first-functio/feed/</wfw:commentRss><slash:comments>0</slash:comments><description>在实现了在网页中插入一个可编辑区域以后，用户已经可以在这个区域中操作富文本内容。但是做为一个真正的编辑器是要有工具栏的，用户能通过工具栏上的按钮方便的对选中的文本进行操...&lt;img src=&quot;http://www1.feedsky.com/t1/316521719/berg/feedsky/s.gif?r=http://www.pmme.cn/archive/first-functio/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/berg/316521719/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/berg/316521719/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description><category>Experience</category><category>Front-End Development</category><pubDate>Tue, 29 Dec 2009 21:49:53 +0800</pubDate><author>berg</author><comments>http://www.pmme.cn/archive/first-functio/#comments</comments><guid isPermaLink="false">http://www.pmme.cn/?p=1391</guid><dc:creator>berg</dc:creator><fs:srclink>http://www.pmme.cn/archive/first-functio/</fs:srclink><fs:srcfeed>http://www.pmme.cn/?feed=rss2</fs:srcfeed><fs:itemid>feedsky/berg/~1230757/316521719/1233376</fs:itemid></item><item><title>得到一个可编辑区域 – 在线编辑器(2)</title><link>http://www.pmme.cn/archive/get-a-editable-area/</link><content:encoded>&lt;p&gt;让一个区域可编辑是实现编辑器最基础的内容之一。&lt;/p&gt;
&lt;p&gt;在应用场景中，编辑器的初始状态，要么是从一个空的编辑器（新建文档），要么是从一个已经有内容的编辑器（编辑文档），因此设计这样一个接口：&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;javascript&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;var&lt;/span&gt; editorInstance &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; editor.&lt;span style=&quot;color: #660066;&quot;&gt;create&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;document.&lt;span style=&quot;color: #660066;&quot;&gt;getElementById&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;editor_source&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
document.&lt;span style=&quot;color: #660066;&quot;&gt;getElementById&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;editor_wrapper&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;.&lt;span style=&quot;color: #660066;&quot;&gt;innerHTML&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; editorInstance.&lt;span style=&quot;color: #660066;&quot;&gt;render&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;对应的HTML：&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;html&quot; style=&quot;font-family:monospace;&quot;&gt;&amp;lt;div id=&amp;quot;editor_source&amp;quot;&amp;gt;
    &amp;lt;h2&amp;gt;在线编辑器&amp;lt;/h2&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div id=&amp;quot;editor_wrapper&amp;quot;&amp;gt;
&amp;lt;/div&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;调用者创建编辑器，然后将编辑器放在自己希望的位置上，这样的实现对调用者的限制最小，而create方法内部，可以通过实例化一个Editor类来实现多例。此时，页面的加载流程是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;调用render()方法返回编辑器的html代码&lt;/li&gt;
&lt;li&gt;将html代码插入指定位置&lt;/li&gt;
&lt;li&gt;让编辑器的iframe可编辑&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;render()&lt;/span&gt;方法很简单，返回一段拼接好的HTML字符串，供用户插入到任何需要的地方。唯一要做的是在返回之前调用&lt;span style=&quot;color: #0000ff&quot;&gt;checkIframeAvailable()&lt;/span&gt;方法.&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;checkIframeAvailable()&lt;/span&gt;使用setTimeout轮询iframe是否被用户加入到dom中，一旦被加入，通过&lt;span style=&quot;color: #0000ff&quot;&gt;makeEditable()&lt;/span&gt;方法令其中的iframe进入编辑状态。&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;makeEditable()&lt;/span&gt;中，需要对IE和非IE进行分别处理，在IE通过&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;javascript&quot; style=&quot;font-family:monospace;&quot;&gt;document.&lt;span style=&quot;color: #660066;&quot;&gt;body&lt;/span&gt;.&lt;span style=&quot;color: #660066;&quot;&gt;contentEditable&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;true&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;进入编辑状态，其他w3c标准兼容的浏览器则是&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;javascript&quot; style=&quot;font-family:monospace;&quot;&gt;document.&lt;span style=&quot;color: #660066;&quot;&gt;designMode&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;on&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;进入编辑状态之后，还有一些其他的事情要做，为了在firefox和webkit浏览器下和IE通过execCommand()产生的代码尽量一样，需要设置styleWithCSS或者useCSS两个command的值为false。另外，在firefox 2下，在创建iframe后，无法立即读取editor.document.body，需要使用setTimeout在下一个时间片读取。&lt;/p&gt;
&lt;p&gt;这样，通过寥寥几十行代码，一个最基础的编辑器框就完成了，请看&lt;a href=&quot;http://www.pmme.cn/files/demo/editor/editor-1.html&quot; target=&quot;_blank&quot;&gt;最终示例&lt;/a&gt;。你可以从外面粘贴一些带有格式的文本进入编辑器看看效果。&lt;/p&gt;
&lt;p&gt;本文是在线编辑器系列文章的第二篇，在这个系列文章中，我会逐步深入和大家分享编辑器开发过程中的奥妙和各种奇怪的问题。下一篇文章将介绍如何给编辑器添加按钮操作，如果你对我的文章感兴趣，欢迎从页面右边&lt;a href=&quot;http://feed.pmme.cn/&quot; target=&quot;_blank&quot;&gt;订阅&lt;/a&gt;我的博客及时收到更新。&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/316496395/berg/feedsky/s.gif?r=http://www.pmme.cn/archive/get-a-editable-area/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/berg/316496395/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/berg/316496395/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content:encoded><wfw:commentRss>http://www.pmme.cn/archive/get-a-editable-area/feed/</wfw:commentRss><slash:comments>0</slash:comments><description>让一个区域可编辑是实现编辑器最基础的内容之一。
在应用场景中，编辑器的初始状态，要么是从一个空的编辑器（新建文档），要么是从一个已经有内容的编辑器（编辑文档），因此设计这...&lt;img src=&quot;http://www1.feedsky.com/t1/316496395/berg/feedsky/s.gif?r=http://www.pmme.cn/archive/get-a-editable-area/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/berg/316496395/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/berg/316496395/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description><category>Uncategorized</category><pubDate>Fri, 25 Dec 2009 17:57:44 +0800</pubDate><author>berg</author><comments>http://www.pmme.cn/archive/get-a-editable-area/#comments</comments><guid isPermaLink="false">http://www.pmme.cn/?p=1387</guid><dc:creator>berg</dc:creator><fs:srclink>http://www.pmme.cn/archive/get-a-editable-area/</fs:srclink><fs:srcfeed>http://www.pmme.cn/?feed=rss2</fs:srcfeed><fs:itemid>feedsky/berg/~1230757/316496395/1233376</fs:itemid></item><item><title>历史、现状和目标 – 在线编辑器(1)</title><link>http://www.pmme.cn/archive/get-a-editable-area-editor-chapter/</link><content:encoded>&lt;h2&gt;关于本系列文章&lt;/h2&gt;
&lt;p&gt;计划暂时是这样，首先介绍一些历史、知识背景，然后详细分析现状和需求，开始设计一个可扩展，低耦合的编辑器，最后针对一些难点问题进行单个分析。&lt;/p&gt;
&lt;h2&gt;历史、现状&lt;/h2&gt;
&lt;p&gt;起初，世界上的浏览器本没有编辑器功能。到了IE4.0 (1997年)，微软提供了&lt;span style=&quot;color: #0000ff&quot;&gt;document.selection&lt;/span&gt;，利用这个对象，前端开发人员可以让一个iframe进入编辑状态，里面可以输入富文本内容，并且能通过程序添加复杂的编辑操作。那个时候还没有W3C的相关规范，这个selection对象以及两种选区类型（textRange和controlRange）都是微软自己实现的。&lt;/p&gt;
&lt;p&gt;三年后，有了W3C的相关规范(2000年)，&lt;strong&gt;这个规范和IE的实现完全不同&lt;/strong&gt;，firefox等一干浏览器陆续根据规范实现了自己的selection和Range对象。&lt;/p&gt;
&lt;p&gt;前端工程师的悲剧就这样酿成了，有两套截然不同的方式来处理选区(selection)，不仅仅如此，对execCommand()方法的支持也大相径庭，一个相同的命令在不同的浏览器下执行会出现不同的效果。最要命的，浏览器还经常会有一些诡异的问题，比如在某些时候对选区的不当操作会导致IE直接崩溃等。&lt;/p&gt;
&lt;p&gt;但是在线编辑器的使用场景相当广泛：写blog、论坛发帖、淘宝卖东西、在线聊天等应用场景都需要使用编辑器，他们对编辑器的要求各不相同。编辑器已经成为了一个基础件，几乎所有的互联网公司都需要用到。&lt;/p&gt;
&lt;p&gt;后来出现了一些开源编辑器，比较出名的有：&lt;a href=&quot;http://ckeditor.com/&quot; target=&quot;_blank&quot;&gt;ckeditor&lt;/a&gt;（原来叫fckeditor）， &lt;a href=&quot;http://tinymce.moxiecode.com/&quot; target=&quot;_blank&quot;&gt;tinymce&lt;/a&gt;，&lt;a href=&quot;http://www.ewebeditor.com/&quot; target=&quot;_blank&quot;&gt;eWebEditor&lt;/a&gt;等，最近，淘宝也开源了他们的&lt;a href=&quot;http://kissy.googlecode.com/svn/trunk/src/editor/demo/basic.html&quot; target=&quot;_blank&quot;&gt;kissy编辑器&lt;/a&gt;（功能尚不完善）。但是开源编辑器都各有不足，ckeditor足够强大，重写了浏览器的所有操作。但是模块之间的耦合性很高（3.0有所改善，但仍然不够），体积过于庞大，其他的一些编辑器则要么bug太多，功能不全，要么不方便二次开发。另外，一些对编辑器要求很高的服务，像&lt;a href=&quot;http://www.zoho.com/&quot; target=&quot;_blank&quot;&gt;zoho&lt;/a&gt;、&lt;a href=&quot;http://docs.google.com/&quot;&gt;Google docs&lt;/a&gt;等等，都带有一个很强大的编辑器。&lt;/p&gt;
&lt;h2&gt;目标&lt;/h2&gt;
&lt;p&gt;一个优秀的编辑器，首先要尽量解决浏览器之间的差异，在不同的浏览器下表现一致。&lt;/p&gt;
&lt;p&gt;另外，为了让编辑器在各种不同环境下适应不同的需求，尤其是二次开发的需求，这个编辑器还应该是“&lt;strong&gt;通用&lt;/strong&gt;”、“&lt;strong&gt;可扩展&lt;/strong&gt;”、“&lt;strong&gt;低耦合&lt;/strong&gt;”的。&lt;/p&gt;
&lt;p&gt;具体的设计思路在后面我会专门撰文说明，首先的这几篇文章，是让一些没有接触过编辑器开发的童鞋了解一些基础知识。&lt;/p&gt;
&lt;p&gt;本文是在线编辑器系列文章的第一篇，在这个系列文章中，我会逐步深入和大家分享编辑器开发过程中的奥妙和各种奇怪的问题。下一篇文章将介绍如何拥有一个可编辑区域，如果你对我的文章感兴趣，欢迎从页面右边&lt;a href=&quot;http://feed.pmme.cn/&quot; target=&quot;_blank&quot;&gt;订阅&lt;/a&gt;我的博客及时收到更新。&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/316496399/berg/feedsky/s.gif?r=http://www.pmme.cn/archive/get-a-editable-area-editor-chapter/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/berg/316496399/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/berg/316496399/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content:encoded><wfw:commentRss>http://www.pmme.cn/archive/get-a-editable-area-editor-chapter/feed/</wfw:commentRss><slash:comments>0</slash:comments><description>关于本系列文章
计划暂时是这样，首先介绍一些历史、知识背景，然后详细分析现状和需求，开始设计一个可扩展，低耦合的编辑器，最后针对一些难点问题进行单个分析。
历史、现状
起初...&lt;img src=&quot;http://www1.feedsky.com/t1/316496399/berg/feedsky/s.gif?r=http://www.pmme.cn/archive/get-a-editable-area-editor-chapter/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/berg/316496399/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/berg/316496399/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description><category>Experience</category><category>Front-End Development</category><category>编辑器</category><category>editor</category><category>javascript</category><pubDate>Wed, 23 Dec 2009 08:10:07 +0800</pubDate><author>berg</author><comments>http://www.pmme.cn/archive/get-a-editable-area-editor-chapter/#comments</comments><guid isPermaLink="false">http://www.pmme.cn/?p=1359</guid><dc:creator>berg</dc:creator><fs:srclink>http://www.pmme.cn/archive/get-a-editable-area-editor-chapter/</fs:srclink><fs:srcfeed>http://www.pmme.cn/?feed=rss2</fs:srcfeed><fs:itemid>feedsky/berg/~1230757/316496399/1233376</fs:itemid></item><item><title>善用分布式版本管理系统管理个人代码</title><link>http://www.pmme.cn/archive/manage-your-code-with-mercurial/</link><content:encoded>&lt;p&gt;大多数人都知道或者善用多种版本管理系统，传统集中式版本管理系统有CVS、&lt;a href=&quot;http://subversion.tigris.org/&quot; target=&quot;_blank&quot;&gt;SVN&lt;/a&gt;等，后来，出现了一些分布式管理系统，如&lt;a href=&quot;http://git-scm.com/&quot; target=&quot;_blank&quot;&gt;GIT&lt;/a&gt;、&lt;a href=&quot;http://mercurial.selenic.com/&quot; target=&quot;_blank&quot;&gt;mercurial&lt;/a&gt;等。几乎所有有开发工作的公司，都会选择一个版本管理系统，并且制定一些规范来管理代码，道理很简单，使用版本管理系统能在多人开发，跟进bug，追查问题方面减少很多管理和沟通的成本。&lt;/p&gt;
&lt;p&gt;但是，我觉得个人的代码，包括一些软件配置文件，完全可以使用分布式版本管理系统来管理，可以让我们减轻很多麻烦。&lt;/p&gt;
&lt;p&gt;使用传统的集中式版本控制软件来管理，好处如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;不用担心因为无意的错误修改，删除而丢失过去的代码&lt;/li&gt;
&lt;li&gt;可以随时查看历史情况，你就不用为“xx功能、yy修改到底是什么时候加进来的，为什么要加”这类事情而挠破头皮了&lt;/li&gt;
&lt;li&gt;可以进行分支开发，比如说一个功能你不是很确定能否实现，拉一个分支开发就是了&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;更进一步，使用分布式的版本控制还有如下好处：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在本地就有版本仓库，你可以在任何时候进行ci和roolback，无需联网&lt;/li&gt;
&lt;li&gt;超级快速的分支切换&lt;/li&gt;
&lt;li&gt;方便的和他人（其他机器）共享代码，一个push，或者pull，就能快速的同步修改&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;下面我举几个例子来让大家感受一下善用分布式版本管理的好处。&lt;/p&gt;
&lt;h3&gt;保证多台机器上的配置文件统一&lt;/h3&gt;
&lt;p&gt;我们有很多很多配置文件，尤其是linux下。vim配置，apache站点设置，桌面的配置，pidgin的账号设置等等。&lt;br /&gt;
但是如果有多台计算机，如果两台机器上配置不统一，用起来不顺手，更可能会带来麻烦，我们需要找到这些配置文件，并且拷贝一份最新的到当前机器，但是如果两边都有修改，就可能会丢失修改，或者需要手动merge。&lt;br /&gt;
过去可能用人使用过rsync来同步文件，能解决部分问题，但是如果使用分布式版本管理系统，在每台机器上都有一个独立的代码仓库，用这来管理配置文件再方便不过了！&lt;/p&gt;
&lt;p&gt;首先，我们现在一台拥有最新版本配置文件的机器上初始化一个版本库&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;linux&quot; style=&quot;font-family:monospace;&quot;&gt;cd ~/
hg init
hg add .vimrc .screenrc .fvwm #添加所有你关注的配置文件&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;然后，一旦有新机器需要使用这个配置，clone一份即可&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;linux&quot; style=&quot;font-family:monospace;&quot;&gt;cd ~/
hg clone ssh://berg@lastPC://home/berg/
hg up&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;如果在任何一台机器上有修改，只需要ci到当前机器，并且到其他机器上pull这份修改。&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;linux&quot; style=&quot;font-family:monospace;&quot;&gt;hg ci
ssh berg@anotherPC://home/berg/&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;我们不需要关心代码的合并，也不需要关心配置文件的具体名称和位置（在linux下面，所有的配置都是隐藏文件），一切细节都交给mercurial来管理。&lt;/p&gt;
&lt;h3&gt;使用中心服务器&lt;/h3&gt;
&lt;p&gt;分布式管理原则上是没有一个强制的中心服务器，但是如果我们在管理的规则中加上中心服务器，在某些时候就能避免一些尴尬的发生。&lt;/p&gt;
&lt;p&gt;举一个例子，假设我有三个开发环境，一台在公司，一台在家里，还有一台服务器。在公司时，我家里的机器是离线的，在家里则反过来。于是我白天在公司开发完毕后，想在家里获得最新的版本，最简单的办法就是在服务器上架设一个中心版本库，下班时，push代码到服务器上，回家就可以直接pull了。&lt;/p&gt;
&lt;p&gt;使用中心服务器可以避免在需要开发时，发现最新版本所在计算机不在身边，并且处于离线状态的尴尬。&lt;/p&gt;
&lt;h3&gt;灵活的分支开发&lt;/h3&gt;
&lt;p&gt;不要以为分支功能在小项目中就毫无用处，有的时候，善用分支可以减少很多麻烦。而集中的版本控制系统处理分支很麻烦，让人避退三舍，可是到了分布式版本控制这里，分支变得很简单，看看下面的例子。&lt;/p&gt;
&lt;p&gt;我在开发一个项目时，遇到了一个较大的修改，涉及面较广。&lt;br /&gt;
如果直接在主干上开发，如果在开发过程中发现了bug，或者其他临时插入的想法，我有两种选择：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;直接在线上修改，或者重新clone一份到本地的其他目录进行开发&lt;/li&gt;
&lt;li&gt;把“projectA”这个项目做为一个分支在本地开发&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;两种好处的优劣是很明显的，第一种，我要么需要冒线上修改的风险，要么需要在本地配置另外一套环境；而第二种，我只需要在碰到其他问题的时候，将分支切换回去就好了。下面是命令示例：&lt;/p&gt;
&lt;p&gt;首先，将本地仓库的当前branch设置成项目A的名称：projectA&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;linux&quot; style=&quot;font-family:monospace;&quot;&gt;hg branch projectA&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;我进行projectA分支的开发，如果在开发的过程中，我需要切换到原来的分支：&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;linux&quot; style=&quot;font-family:monospace;&quot;&gt;hg ci -m &amp;quot;projectA commit&amp;quot;
&amp;nbsp;
hg up default #切换到主干&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;开发完毕后提交并且push到线上：&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;linux&quot; style=&quot;font-family:monospace;&quot;&gt;hg ci -m &amp;quot;modified something&amp;quot;
&amp;nbsp;
hg push&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;接下来我又能迅速的切换回原来开发到原来开发到一半的uploadify分支&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;linux&quot; style=&quot;font-family:monospace;&quot;&gt;hg up projectA&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;分布式版本管理的好处一下就体现出来了，我可以在本地迅速的切换分支，分支建立的成本也很低。这样能让我们更灵活的应对需求&lt;/p&gt;
&lt;h3&gt;小结&lt;/h3&gt;
&lt;p&gt;好了，本文就写到这里。小结一下，使用分布式版本管理系统管理个人mini项目、软件配置文件，能给开发和管理带来很大的便利，使用中心版本仓库能避免机器离线导致无法获取最新代码的问题，善用分支能让开发者更灵活的应对需求。&lt;/p&gt;
&lt;p&gt;看了本文后，是否你对分布式管理系统也充满了兴趣呢？或者你有一些更好的实践？欢迎在下面留言共同探讨。&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/316496400/berg/feedsky/s.gif?r=http://www.pmme.cn/archive/manage-your-code-with-mercurial/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/berg/316496400/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/berg/316496400/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content:encoded><wfw:commentRss>http://www.pmme.cn/archive/manage-your-code-with-mercurial/feed/</wfw:commentRss><slash:comments>0</slash:comments><description>大多数人都知道或者善用多种版本管理系统，传统集中式版本管理系统有CVS、SVN等，后来，出现了一些分布式管理系统，如GIT、mercurial等。几乎所有有开发工作的公司，都会选择一个版本管理...&lt;img src=&quot;http://www1.feedsky.com/t1/316496400/berg/feedsky/s.gif?r=http://www.pmme.cn/archive/manage-your-code-with-mercurial/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/berg/316496400/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/berg/316496400/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description><category>Experience</category><category>linux</category><category>Linux</category><category>mercurial</category><category>scm</category><category>分布式</category><pubDate>Sun, 13 Dec 2009 23:03:37 +0800</pubDate><author>berg</author><comments>http://www.pmme.cn/archive/manage-your-code-with-mercurial/#comments</comments><guid isPermaLink="false">http://www.pmme.cn/?p=1318</guid><dc:creator>berg</dc:creator><fs:srclink>http://www.pmme.cn/archive/manage-your-code-with-mercurial/</fs:srclink><fs:srcfeed>http://www.pmme.cn/?feed=rss2</fs:srcfeed><fs:itemid>feedsky/berg/~1230757/316496400/1233376</fs:itemid></item><item><title>在javascript编程中灵活使用try-catch</title><link>http://www.pmme.cn/archive/use-try-catch-in-javascript-programing/</link><content:encoded>&lt;p&gt;上周，在&lt;a href=&quot;http://www.sharej.com&quot; target=&quot;_blank&quot;&gt;分享家&lt;/a&gt;的qq交流群里，经常有人向我反馈不能下载东西。于是直接联系了一个用户，发现他的浏览器报出pageTracker对象不存在错误。&lt;/p&gt;
&lt;p&gt;问题很显然了，由于我在下载链接的onmousedown事件中添加了Event统计，如果用户的Google Analytics代码没有加载成功（显然是万恶的教育网造成的），那么就会报出这样错误。&lt;/p&gt;
&lt;p&gt;请看原来的代码片段：&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;javascript&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;function&lt;/span&gt; analytics&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;category&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; action&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; label&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; value&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp;
    pageTracker._trackEvent&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;category&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; action&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; label&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; value&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;修改一下，加上try-catch屏蔽这个错误：&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;javascript&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;function&lt;/span&gt; analytics&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;category&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; action&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; label&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; value&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp;
    &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;try&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp;
        pageTracker._trackEvent&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;category&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; action&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; label&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; value&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
&amp;nbsp;
    &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;catch&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;e&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;用try-catch来屏蔽浏览器错误是一个Javascript编程中很常用的一个技巧，灵活使用可以给开发者减少很多麻烦，下面再举一例。&lt;/p&gt;
&lt;p&gt;最近，我在开发一个通用的所见即所得编辑器。某些时候，程序需要记录住当前状态的节点，给后续程序处理。但麻烦来了，用户如果持续的在进行编辑动作，在程序后续处理时，节点可能已经不在DOM树中了。&lt;/p&gt;
&lt;p&gt;在IE下，如果你调用一个&lt;strong&gt;不存在的文本节点&lt;/strong&gt;(nodeType == 3)的任何属性或者方法，浏览器直接报错。根本找不到能判断这个节点是否存于DOM树中的方法。于是有了如下代码：&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;javascript&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;try&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp;
    &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;ele.&lt;span style=&quot;color: #660066;&quot;&gt;ownerDocument&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;!=&lt;/span&gt; editor.&lt;span style=&quot;color: #660066;&quot;&gt;document&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;catch&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;e&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#123;&lt;/span&gt;
    &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;上面的代码很好懂，首先判断这个节点是不是在编辑器中，如果不是，返回false；如果在过程中出现了错误，也返回false。&lt;/p&gt;
&lt;p&gt;关于try-catch的故事就说到这里，最后要提醒大家，try-cacth会影响javascript的性&lt;del datetime=&quot;2009-12-11T16:11:34+00:00&quot;&gt;功&lt;/del&gt;能，因此不应该在追求性能的环境中使用，尤其是一些基础方法或者会被多次调用的方法中。&lt;br /&gt;
下一篇文章，我将使用一个更好的办法来解决文首提到的Google Analytics报错的问题。欢迎你&lt;a href=&quot;http://feed.pmme.cn/&quot;&gt;订阅我的博客&lt;/a&gt;，在第一时间获得更新。&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/316496401/berg/feedsky/s.gif?r=http://www.pmme.cn/archive/use-try-catch-in-javascript-programing/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/berg/316496401/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/berg/316496401/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content:encoded><wfw:commentRss>http://www.pmme.cn/archive/use-try-catch-in-javascript-programing/feed/</wfw:commentRss><slash:comments>0</slash:comments><description>上周，在分享家的qq交流群里，经常有人向我反馈不能下载东西。于是直接联系了一个用户，发现他的浏览器报出pageTracker对象不存在错误。
问题很显然了，由于我在下载链接的onmousedown事件中...&lt;img src=&quot;http://www1.feedsky.com/t1/316496401/berg/feedsky/s.gif?r=http://www.pmme.cn/archive/use-try-catch-in-javascript-programing/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/berg/316496401/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/berg/316496401/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description><category>Experience</category><category>Front-End Development</category><category>Programing</category><category>javascript</category><pubDate>Sat, 05 Dec 2009 20:40:31 +0800</pubDate><author>berg</author><comments>http://www.pmme.cn/archive/use-try-catch-in-javascript-programing/#comments</comments><guid isPermaLink="false">http://www.pmme.cn/?p=1321</guid><dc:creator>berg</dc:creator><fs:srclink>http://www.pmme.cn/archive/use-try-catch-in-javascript-programing/</fs:srclink><fs:srcfeed>http://www.pmme.cn/?feed=rss2</fs:srcfeed><fs:itemid>feedsky/berg/~1230757/316496401/1233376</fs:itemid></item><item><title>化解内心的冲突</title><link>http://www.pmme.cn/archive/the-anatomy-of-peace/</link><content:encoded>&lt;p&gt;昨天晚上和今天早上，看完了&lt;a href=&quot;http://www.douban.com/subject/2124011/&quot; target=&quot;_blank&quot;&gt;这本书&lt;/a&gt;(《化解内心的冲突》)的前两大章，这是一本讲述如何化解与他人之间冲突的书，在阅读这种书之前，或多或少总会有这样的心理：如果我让步了，岂不是总是吃亏，让别人占便宜？看时才觉得，谁能更早获得内心的平和，谁就是成功者，不管问题是不是按照预想的方式去解决的。&lt;/p&gt;
&lt;p&gt;这本书和“&lt;a href=&quot;http://www.douban.com/subject/3312040/&quot; target=&quot;_blank&quot;&gt;谁会认错&lt;/a&gt;”的核心思想一样：&lt;strong&gt;放弃自我辩解&lt;/strong&gt;。但是他们阐述问题的角度不一样，《谁会认错》是从一些历史事件开始，从内心出发，层层剖析为什么人会自我辩护，然后给出方法，让我们摆脱自我辩护的漩涡。而《化解内心的冲突》是从人与人之间的关系出发，我们之所以陷入自我辩护，是因为我们不把其他人当作一个平等的个体来看待，而是把他们当做物体来看，并且自己在内心中形成了“战争”状态。我更喜欢后者的这种阐述方法。从人与人之间的、平常经常在自己身上发生的小事出发来说明问题，比从一些历史事件更容易让我感同身受。&lt;/p&gt;
&lt;p&gt;我们不能把其他人当做物体来看，即使我们的观点是“正确”的，但是如果冲突双方都相信自己没有错，冲突就无法解决。即使，在立场，行为等等表层上面我们是“正确”的，但是从对待他人的存在方式上来看，内心处于战争状态就是错的。我们要有平和的心态，站在对方的角度来看待冲突，化解了内心的冲突，才能化解与他人之间的冲突。&lt;/p&gt;
&lt;p&gt;我们是怎么进入“战争”状态的呢，“战争”是和“平和”对应的，当我们处于战争状态时，这种情绪就会破坏我们的感觉和对待他人的态度。当和他人产生冲突时，如果心中已经处于战争状态了，不管外表是否平和，内心的冲突会让我们还是会引入其他的问题，始终无法真正的化解矛盾。&lt;/p&gt;
&lt;p&gt;如果两个人都处于“战争”状态，就会逐步主动的将冲突升级：当一方想到对方对自己的不平以后，会变本加厉的对对方不平，反过来，对方也会这样做。&lt;/p&gt;
&lt;p&gt;很多时候，我们一开始是有帮助他人的想法的，但是一旦抛弃了这个想法，内心进入了战争的盒子以后，就会产生一种新的需要，需要证明自己的战争状态是对的，于是对其他人的观点就会更加歪曲。&lt;/p&gt;
&lt;p&gt;有的时候，我们的确受到了不公正的待遇，但是，只有在自己需要为自己的行为进行辩解时，才会纠缠于这些受到过的苦难，在那一刻，这些苦难其实就是借口。&lt;/p&gt;
&lt;p&gt;有时，我们会觉得自己高人一等，觉得自己被赋予了很多“特权”，当自己处于战争状态时，就会认为这些特权消失了，所以更加心怀怨恨，而实际上，这些特权从未存在过。就像在职场中，我们会觉得自己很聪明，应该在职位上获得更快的晋升，但是一旦没有获得更快的晋升时，我们就会怨恨，为什么上级没有给我们这样的待遇，不是我错了，一定是他们错了。实际上，我们并不比其他人更聪明。&lt;/p&gt;
&lt;p&gt;我们经常处在“自我背叛”中，我们违背了自己对他人原本的感受，导致我们以不同的眼光看待别人、自己。比如说，当饭后，丈夫想帮助妻子清理厨房时，但赖在沙发上不动，本来应该感到内疚，但是却背叛了自己的感受，为自己无动于衷的行为产生辩解，“我忙了一天了，为什么还要我做这些事情”，“她经常对我发号施令，我才不听她的”。这样就把自己放在了战争的盒子中，以后每次遇到这样的事情，就会积聚起来，让内心的冲突升级。&lt;/p&gt;
&lt;p&gt;书中一些重要观点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;和我们打交道的都是独立的个体，他们并不总是按照我们喜欢的方式行事&lt;/li&gt;
&lt;li&gt;损人不利己是一个不明智的选择，但我们还是会这样做。而很多时候，我们几乎是觉得是收到某种力量的驱使，不得不这样做&lt;/li&gt;
&lt;li&gt;我们作出回应的依据是对方对我们的态度，而不是行为本身。因此，如果我们心中敌对的面对他人，他人并不因为我们“平等”对待他们的行为而作出善意的回应&lt;/li&gt;
&lt;li&gt;四种自我辩解模式：“高人一等”，“我就应该”，“需要被看做”，“怨天尤人”&lt;/li&gt;
&lt;li&gt;我们不仅仅要为自己所做的负责，也要为自己所想、所感的负责&lt;/li&gt;
&lt;/ol&gt;
&lt;div id=&quot;_mcePaste&quot; style=&quot;overflow: hidden;width: 1px;height: 1px&quot;&gt;http://www.douban.com/subject/3312040/&lt;/div&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/316496403/berg/feedsky/s.gif?r=http://www.pmme.cn/archive/the-anatomy-of-peace/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/berg/316496403/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/berg/316496403/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content:encoded><wfw:commentRss>http://www.pmme.cn/archive/the-anatomy-of-peace/feed/</wfw:commentRss><slash:comments>0</slash:comments><description>昨天晚上和今天早上，看完了这本书(《化解内心的冲突》)的前两大章，这是一本讲述如何化解与他人之间冲突的书，在阅读这种书之前，或多或少总会有这样的心理：如果我让步了，岂不是总...&lt;img src=&quot;http://www1.feedsky.com/t1/316496403/berg/feedsky/s.gif?r=http://www.pmme.cn/archive/the-anatomy-of-peace/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/berg/316496403/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/berg/316496403/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description><category>Experience</category><category>读书笔记</category><category>化解冲突</category><category>人际关系</category><category>reading</category><pubDate>Sat, 07 Nov 2009 14:09:11 +0800</pubDate><author>berg</author><comments>http://www.pmme.cn/archive/the-anatomy-of-peace/#comments</comments><guid isPermaLink="false">http://www.pmme.cn/?p=1315</guid><dc:creator>berg</dc:creator><fs:srclink>http://www.pmme.cn/archive/the-anatomy-of-peace/</fs:srclink><fs:srcfeed>http://www.pmme.cn/?feed=rss2</fs:srcfeed><fs:itemid>feedsky/berg/~1230757/316496403/1233376</fs:itemid></item><item><title>假期结束志</title><link>http://www.pmme.cn/archive/holiday-ended/</link><content:encoded>&lt;p&gt;假期悄然结束了。&lt;/p&gt;
&lt;p&gt;举世瞩目的60岁生日顺利结束，也让我更加切身感受到了这个国家和政党的繁荣昌盛，以及做为屁民的我暂住在伟大首都的悲哀：&lt;a href=&quot;http://map.baidu.com/fwmap/zt/guoqing/page.html&quot; target=&quot;_blank&quot;&gt;道路封锁&lt;/a&gt;，&lt;a href=&quot;http://zhidao.baidu.com/q?word=%B1%B1%BE%A9+%B9%FA%C7%EC+%C9%ED%B7%DD%D6%A4&amp;amp;lm=0&amp;amp;fr=search&amp;amp;ct=17&amp;amp;pn=0&amp;amp;tn=ikaslist&amp;amp;rn=10&amp;amp;qf=0&quot; target=&quot;_blank&quot;&gt;到处盘查身份证&lt;/a&gt;，&lt;a href=&quot;http://chinese.wsj.com/gb/20080806/chw113321.asp?source=article&quot; target=&quot;_blank&quot;&gt;出租车上安装窃听器&lt;/a&gt;，安检超级麻烦，&lt;a href=&quot;http://www.google.com/search?q=site%3Awww.androidin.net%20%E6%97%A0%E6%B3%95%E5%90%8C%E6%AD%A5&quot; target=&quot;_blank&quot;&gt;Google android手机无法同步Google账户&lt;/a&gt;，&lt;a href=&quot;http://twitter.com/cnberg/status/4504112054&quot; target=&quot;_blank&quot;&gt;大量网站包括https网站被封&lt;/a&gt;，blah blah。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;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%2Fwave.google.com%2F&amp;amp;ei=5BrOSuK8JJSQkQWV07GDBA&amp;amp;usg=AFQjCNGg8-efETxJL6lMwqDE2JjsVvoRRA&amp;amp;sig2=ZEey2Pn9TXq9_jiNyGApkA&quot; target=&quot;_blank&quot;&gt;Google wave&lt;/a&gt;开始邀请，我现在开始有点后悔没有去&lt;a href=&quot;http://code.google.com/intl/zh-CN/events/developerday/2009/home.html&quot; target=&quot;_blank&quot;&gt;2009 Google 开发者日&lt;/a&gt;了，因为据&lt;a href=&quot;http://twitter.com/chzealot&quot; target=&quot;_blank&quot;&gt;Zealot&lt;/a&gt;说，参与者都能得到一个Google wave的邀请名额，但是感谢好心的catChen，他在前几天&lt;a href=&quot;http://twitter.com/catchen/status/4603069420&quot; target=&quot;_blank&quot;&gt;给我提名&lt;/a&gt;了，但是我至今没有收到任何邀请。至于Google wave本身，&lt;a href=&quot;http://www.youtube.com/watch?v=v_UyVmITiYQ&amp;amp;feature=channel&quot; target=&quot;_blank&quot;&gt;视频&lt;/a&gt;很炫，但是据几位切身使用过的人来说，目前实用价值并不大。&lt;/p&gt;
&lt;p&gt;假期去看了&lt;a href=&quot;http://www.douban.com/subject/3734112/&quot; target=&quot;_blank&quot;&gt;风声&lt;/a&gt;，一部在北京宣传的相当到位的片儿，三星半推荐吧，本来应该是4星，但是故事情节太多瑕疵，在看电影的时候我已经尽力去忽略它们，但是却让人回味起来的时候兴趣索然。而且事先提醒，这里面e镜头太多，口味轻的MM不推荐。其他的介绍，看宣传片和介绍吧，不过，今天在四号线里面看到的宣传片，段奕宏、朱旭，和外景本身没有几分钟戏，却在宣传片里占了过多的分量，如果是看了这个宣传片而去的影院，一定会有被骗的感觉。&lt;/p&gt;
&lt;p&gt;博客小小做了一些调整，原来每周定时程序发布的那些Google Reader shared items被全部删除，因为在之前（连接），Google Reader的社会化改进上线后，用户可以像Twitter一样Follow其他人的Google Reader；同时我觉得那些自动输出的文章会让人很不快。因此，如果关注我Google Reader的Shared items的话，可以通过&lt;a href=&quot;http://www.google.com/reader/shared/cnberg&quot; target=&quot;_blank&quot;&gt;这个页面&lt;/a&gt;Follow我。&lt;/p&gt;
&lt;p&gt;睡觉去，明天上班。&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/316496404/berg/feedsky/s.gif?r=http://www.pmme.cn/archive/holiday-ended/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/berg/316496404/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/berg/316496404/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content:encoded><wfw:commentRss>http://www.pmme.cn/archive/holiday-ended/feed/</wfw:commentRss><slash:comments>0</slash:comments><description>假期悄然结束了。
举世瞩目的60岁生日顺利结束，也让我更加切身感受到了这个国家和政党的繁荣昌盛，以及做为屁民的我暂住在伟大首都的悲哀：道路封锁，到处盘查身份证，出租车上安装...&lt;img src=&quot;http://www1.feedsky.com/t1/316496404/berg/feedsky/s.gif?r=http://www.pmme.cn/archive/holiday-ended/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/berg/316496404/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/berg/316496404/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description><category>十一</category><category>Life</category><category>电影</category><category>Blog</category><category>假期</category><category>Personal</category><category>google wave</category><pubDate>Fri, 09 Oct 2009 01:08:10 +0800</pubDate><author>berg</author><comments>http://www.pmme.cn/archive/holiday-ended/#comments</comments><guid isPermaLink="false">http://www.pmme.cn/?p=1310</guid><dc:creator>berg</dc:creator><fs:srclink>http://www.pmme.cn/archive/holiday-ended/</fs:srclink><fs:srcfeed>http://www.pmme.cn/?feed=rss2</fs:srcfeed><fs:itemid>feedsky/berg/~1230757/316496404/1233376</fs:itemid></item><item><title>wordcamp 2009</title><link>http://www.pmme.cn/archive/wordpress-2009/</link><content:encoded>&lt;p&gt;明天是8.22，也就是&lt;a href=&quot;http://wordcampchina.org&quot;&gt;wordcamp 2009 china&lt;/a&gt;的活动日了啰。&lt;/p&gt;
&lt;p&gt;最近俗事缠身，开始了一个新的项目，经常加班才能勉强忙完，前段时间服务器所在的&lt;a href=&quot;http://yesren.com&quot;&gt;机房&lt;/a&gt;破产，不但让我产生了经济上的损失，还浪费我一个周末去了一趟江苏，而且是坐大巴回来的，那叫一个痛苦。最后机器迁移到了传说中&lt;a href=&quot;http://www.21vianet.com/&quot;&gt;世纪互联&lt;/a&gt;的酒仙桥机房。&lt;/p&gt;
&lt;p&gt;这个周末算是清闲，准备明天去wordcamp，看看各位传说中的风云人物；后天去骑车，路线基本确定为白羊沟。&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/316496405/berg/feedsky/s.gif?r=http://www.pmme.cn/archive/wordpress-2009/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/berg/316496405/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/berg/316496405/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content:encoded><wfw:commentRss>http://www.pmme.cn/archive/wordpress-2009/feed/</wfw:commentRss><slash:comments>0</slash:comments><description>明天是8.22，也就是wordcamp 2009 china的活动日了啰。
最近俗事缠身，开始了一个新的项目，经常加班才能勉强忙完，前段时间服务器所在的机房破产，不但让我产生了经济上的损失，还浪费我一...&lt;img src=&quot;http://www1.feedsky.com/t1/316496405/berg/feedsky/s.gif?r=http://www.pmme.cn/archive/wordpress-2009/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/berg/316496405/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/berg/316496405/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description><category>wordcamp</category><category>Life</category><category>Personal</category><pubDate>Fri, 21 Aug 2009 20:53:44 +0800</pubDate><author>berg</author><comments>http://www.pmme.cn/archive/wordpress-2009/#comments</comments><guid isPermaLink="false">http://www.pmme.cn/?p=1298</guid><dc:creator>berg</dc:creator><fs:srclink>http://www.pmme.cn/archive/wordpress-2009/</fs:srclink><fs:srcfeed>http://www.pmme.cn/?feed=rss2</fs:srcfeed><fs:itemid>feedsky/berg/~1230757/316496405/1233376</fs:itemid></item><item><title>生活的改变</title><link>http://www.pmme.cn/archive/life-is-changing/</link><content:encoded>&lt;p&gt;自从我&lt;a href=&quot;http://www.pmme.cn/archives/back-from-130/&quot;&gt;买了自行车，开始骑行&lt;/a&gt;以后，生活就逐步的改变了。不只是骑行这么简单，而是生活方式和思想，也不是因为骑行，骑行只是一个契机而已。&lt;/p&gt;
&lt;p&gt;首先，我不宅了。从周末至少有一天出门骑行开始，到现在已经持续若干周周末两天不碰电脑。虽然最近两周周末都没有出市内骑，前天我的总骑行里程还是超过了1000km。&lt;/p&gt;
&lt;p&gt;然后，我开始关注一些非电子的东西，我买了一支钢笔（&lt;a href=&quot;http://images.google.com/images?q=lamy%20safari&amp;amp;hl=en&amp;amp;ie=UTF-8&amp;amp;tab=ni&quot;&gt;lamy safari&lt;/a&gt;），加上之前的若干本子，我开始经常用笔写一些东西。&lt;/p&gt;
&lt;p&gt;还有呢，最近开始玩&lt;a href=&quot;http://www.google.com/search?q=%E4%BB%80%E4%B9%88%E6%98%AF%E6%A1%8C%E6%B8%B8&quot;&gt;桌游&lt;/a&gt;，三国杀当然玩过了，第二站是卡坦岛。&lt;/p&gt;
&lt;p&gt;fancy和dzy已经来北京了，一些新的事情又将开始。&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/316496406/berg/feedsky/s.gif?r=http://www.pmme.cn/archive/life-is-changing/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/berg/316496406/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/berg/316496406/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content:encoded><wfw:commentRss>http://www.pmme.cn/archive/life-is-changing/feed/</wfw:commentRss><slash:comments>0</slash:comments><description>自从我买了自行车，开始骑行以后，生活就逐步的改变了。不只是骑行这么简单，而是生活方式和思想，也不是因为骑行，骑行只是一个契机而已。
首先，我不宅了。从周末至少有一天出门骑...&lt;img src=&quot;http://www1.feedsky.com/t1/316496406/berg/feedsky/s.gif?r=http://www.pmme.cn/archive/life-is-changing/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/berg/316496406/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/berg/316496406/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description><category>Life</category><category>Personal</category><pubDate>Mon, 20 Jul 2009 17:54:52 +0800</pubDate><author>berg</author><comments>http://www.pmme.cn/archive/life-is-changing/#comments</comments><guid isPermaLink="false">http://www.pmme.cn/?p=1288</guid><dc:creator>berg</dc:creator><fs:srclink>http://www.pmme.cn/archive/life-is-changing/</fs:srclink><fs:srcfeed>http://www.pmme.cn/?feed=rss2</fs:srcfeed><fs:itemid>feedsky/berg/~1230757/316496406/1233376</fs:itemid></item><item><title>offsetwidth、clientWidth、scrollWidth的区别</title><link>http://www.pmme.cn/archive/difference-between-offsetwidth-clientwidth-scrollwidth/</link><content:encoded>&lt;p&gt;最近在写一个拖拽模块，支持range，也就是说一个element只能在一个固定的范围内拖动。于是我需要知道当前被拖动的element的大小。&lt;/p&gt;
&lt;p&gt;最初我使用scrollWidth，发现在ie6下，如果这个element有border，就会有偏差，后来经过erik的建议使用offsetWidth解决。&lt;/p&gt;
&lt;p&gt;上网查了一下，得到如下答案：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;scrollWidth是对象的实际内容的宽，不包边线宽度，会随对象中内容的多少改变（内容多了可能会改变对象的实际宽度）。&lt;br /&gt;
clientWidth是对象可见的宽度，不包滚动条等边线，会随窗口的显示大小改变。&lt;br /&gt;
offsetWidth是对象的可见宽度，包滚动条等边线，会随窗口的显示大小改变。 &lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;这篇日志是每日一web-dev tip计划的一部分，如果你关注web开发或者linux，请订阅我的rss。&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/316496408/berg/feedsky/s.gif?r=http://www.pmme.cn/archive/difference-between-offsetwidth-clientwidth-scrollwidth/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/berg/316496408/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/berg/316496408/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content:encoded><wfw:commentRss>http://www.pmme.cn/archive/difference-between-offsetwidth-clientwidth-scrollwidth/feed/</wfw:commentRss><slash:comments>0</slash:comments><description>最近在写一个拖拽模块，支持range，也就是说一个element只能在一个固定的范围内拖动。于是我需要知道当前被拖动的element的大小。
最初我使用scrollWidth，发现在ie6下，如果这个element有border，就...&lt;img src=&quot;http://www1.feedsky.com/t1/316496408/berg/feedsky/s.gif?r=http://www.pmme.cn/archive/difference-between-offsetwidth-clientwidth-scrollwidth/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/berg/316496408/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/berg/316496408/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description><category>Experience</category><category>Front-End Development</category><category>javascript</category><pubDate>Fri, 19 Jun 2009 12:47:11 +0800</pubDate><author>berg</author><comments>http://www.pmme.cn/archive/difference-between-offsetwidth-clientwidth-scrollwidth/#comments</comments><guid isPermaLink="false">http://www.pmme.cn/?p=1282</guid><dc:creator>berg</dc:creator><fs:srclink>http://www.pmme.cn/archive/difference-between-offsetwidth-clientwidth-scrollwidth/</fs:srclink><fs:srcfeed>http://www.pmme.cn/?feed=rss2</fs:srcfeed><fs:itemid>feedsky/berg/~1230757/316496408/1233376</fs:itemid></item></channel></rss>