<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:wfw="http://wellformedweb.org/CommentAPI/">
  <channel>
    <title><![CDATA[never-online weblog]]></title> 
    <link>http://www.never-online.net/blog/</link> 
    <description><![CDATA[Eventually, I am never-online...]]></description> 
    <language>en</language> 
    <copyright><![CDATA[Copyright 2008, never-online weblog]]></copyright> 
    <webMaster><![CDATA[blueDestiny[at]126.com (never-online)]]></webMaster> 
    <generator>LBS v2.0.304</generator> 
    <pubDate>Sat, 05 Jul 2008 07:55:55 +0800</pubDate> 
    <ttl>60</ttl>
  
    <item>
      <title><![CDATA[Javasript 构造static变量。]]></title> 
      <link><![CDATA[http://www.never-online.net/blog/article.asp?id=225]]></link> 
      <category><![CDATA[JS & DHTML]]></category> 
      <author><![CDATA[Rank <null@null.com>]]></author> 
      <pubDate>Wed, 02 Jul 2008 15:54:03 +0800</pubDate> 
      <description><![CDATA[利用prototype+闭包可以构造一个静态的变量。请见代码：<br /><div class="code-op"><a href="javascript:NS_code.copy('codeFragment1')" title="拷贝代码(Copy Code)">Copy Code(拷贝代码)</a>-<a href="javascript:NS_code.runHTML('codeFragment1')" title="运行代码(Run HTML Code)">Run HTML(运行代码)</a>-<a href="javascript:NS_code.saveAs('codeFragment1')" title="另存代码(Save Code)">Save Code(另存代码)</a></div><div class="code" id="codeFragment1">&lt;script type=&quot;text/javascript&quot;&gt;<br />//&lt;![CDATA[<br />&nbsp;&nbsp;function jsclass () {};<br /><br />&nbsp;&nbsp;jsclass.prototype = (function() {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;var static_p = &#39;http&#58;//www.never-online.net&#39;;<br />&nbsp;&nbsp;&nbsp;&nbsp;var static_n = 0;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;return {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;show: function() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(static_p);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(static_n);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;update: function(val) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;static_p = val;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;static_n++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;})();<br /><br />&nbsp;&nbsp;var foo = new jsclass();<br />&nbsp;&nbsp;foo.show();//output http&#58;//www.never-online.net and 0<br /><br />&nbsp;&nbsp;var bar = new jsclass();<br />&nbsp;&nbsp;bar.update(&#39;static?&#39;);<br />&nbsp;&nbsp;bar.show();//output static? and 1<br /><br />&nbsp;&nbsp;foo.show();//output static? and 1<br />//]]&gt;<br />&lt;/script&gt;</div><br />使用的一些案例<br />比如我们有一个事件类，该类命名空间path是<br />anyNamespace.util.Event<br />还有一个控件类，该命名空间path是<br />anyNamespace.ui.Menu<br />menu要引用并使用Event，我们大可不必每次用&quot;.&quot;去找Event的path。可以把Event引用放到menu这个类上。<br />如：<div class="code-op"><a href="javascript:NS_code.copy('codeFragment2')" title="拷贝代码(Copy Code)">Copy Code(拷贝代码)</a>-<a href="javascript:NS_code.runHTML('codeFragment2')" title="运行代码(Run HTML Code)">Run HTML(运行代码)</a>-<a href="javascript:NS_code.saveAs('codeFragment2')" title="另存代码(Save Code)">Save Code(另存代码)</a></div><div class="code" id="codeFragment2">function anyNamespace.ui.Menu = (){}<br />function anyNamespace.ui.Menu.prototype = (function () {<br />&nbsp;var Event = anyNamespace.util.Event;<br />&nbsp;return {<br />&nbsp;//code here<br />&nbsp;}<br />})();</div>这也相当于anyNamespace.util.Event拥有一个private且static的对象Event。它既是静态的，也是对调用Menu的使用者不可见的。]]></description>
      <wfw:commentRss><![CDATA[http://www.never-online.net/blog/feed.asp?q=comment&id=225]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[eval解闭包]]></title> 
      <link><![CDATA[http://www.never-online.net/blog/article.asp?id=224]]></link> 
      <category><![CDATA[JS & DHTML]]></category> 
      <author><![CDATA[Rank <null@null.com>]]></author> 
      <pubDate>Wed, 02 Jul 2008 13:18:18 +0800</pubDate> 
      <description><![CDATA[&quot;private&quot;在js里通常是这样写：<div class="code-op"><a href="javascript:NS_code.copy('codeFragment1')" title="拷贝代码(Copy Code)">Copy Code(拷贝代码)</a>-<a href="javascript:NS_code.runHTML('codeFragment1')" title="运行代码(Run HTML Code)">Run HTML(运行代码)</a>-<a href="javascript:NS_code.saveAs('codeFragment1')" title="另存代码(Save Code)">Save Code(另存代码)</a></div><div class="code" id="codeFragment1">&lt;script type=&quot;text/javascript&quot;&gt;<br />//&lt;![CDATA[<br />&nbsp;&nbsp;var obj = (function () {<br />&nbsp;&nbsp;&nbsp;&nbsp;var p = &#39;http&#58;//www.never-online.net&#39;;<br />&nbsp;&nbsp;&nbsp;&nbsp;return {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;show: function() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(p);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;})();<br /><br />&nbsp;&nbsp;obj.show(); //http&#58;//www.never-online.net<br />&nbsp;&nbsp;alert(obj.p); //undefined;<br />//]]&gt;<br />&lt;/script&gt;</div><br />以为上面的private变量会万无一失吗？如果你真的那样想，那么在下面的代码里，会让你大跌眼镜。在 <b>firefox</b> 里可以解开上面的闭包，答案是用eval<div class="code-op"><a href="javascript:NS_code.copy('codeFragment2')" title="拷贝代码(Copy Code)">Copy Code(拷贝代码)</a>-<a href="javascript:NS_code.runHTML('codeFragment2')" title="运行代码(Run HTML Code)">Run HTML(运行代码)</a>-<a href="javascript:NS_code.saveAs('codeFragment2')" title="另存代码(Save Code)">Save Code(另存代码)</a></div><div class="code" id="codeFragment2">&lt;script type=&quot;text/javascript&quot;&gt;<br />//&lt;![CDATA[<br />&nbsp;&nbsp;var obj = (function () {<br />&nbsp;&nbsp;&nbsp;&nbsp;var p = &#39;http&#58;//www.never-online.net&#39;;<br />&nbsp;&nbsp;&nbsp;&nbsp;return {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;show: function() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(p);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;})();<br /><br />&nbsp;&nbsp;obj.show(); //http&#58;//www.never-online.net<br />&nbsp;&nbsp;eval(&#39;p=&quot;eval you&quot;&#39;, obj.show);<br />&nbsp;&nbsp;obj.show(); //eval you<br />//]]&gt;<br />&lt;/script&gt;</div><br />是否觉得不得思议？eval是不是太不安全了，:)，且看mozilla的官方文档是怎么说的。以下是我截取的重点的部分<div class="quote"><div class="quote-title">引用 <u></u></div><div class="quote-content">[edit] Syntax <br />eval(string [, object]) <br /><br />[edit] Parameters <br />string <br />A string representing a JavaScript expression, statement, or sequence of statements. The expression can include variables and properties of existing objects. <br />object <br />Non-standard <br />An optional argument; if specified, the evaluation is restricted to the context of the specified object. </div></div>即eval的第二个参数是指定一个上下文作用域。<br /><br />请再看下面一段<div class="quote"><div class="quote-title">引用 <u></u></div><div class="quote-content">Don&#39;t use eval! <br />eval() is a dangerous function, which executes the code it&#39;s passed with the privileges of the caller. If you run eval() with a string that could be affected by a malicious party, you may end up running malicious code on the user&#39;s machine with the permissions of your webpage / extension. <br /><br />There are safe alternatives to eval() for common use-cases. </div></div>从这一段，我们可以看到mozilla是如何解释eval的危险的。说一下我的看法：<br /><br />对于eval，我们尽量少用，而且不用。如果要用，我会用在json的序列化和反序列化上。其它地方，能不用就不用。因为eval不光可以写，当然也可以读了，所以你整个代码对于eval来说都是可见的，没有了作用域，这就乱了 <img src="http://www.never-online.net/blog/styles/g/images/smilies/icon_rolleyes.gif" border="0" alt="[rolleyes]" />]]></description>
      <wfw:commentRss><![CDATA[http://www.never-online.net/blog/feed.asp?q=comment&id=224]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[JavaScript王者归来]]></title> 
      <link><![CDATA[http://www.never-online.net/blog/article.asp?id=222]]></link> 
      <category><![CDATA[Diary & Misc]]></category> 
      <author><![CDATA[Rank <null@null.com>]]></author> 
      <pubDate>Thu, 26 Jun 2008 23:12:30 +0800</pubDate> 
      <description><![CDATA[<div class="quote"><div class="quote-title">引用 <u></u></div><div class="quote-content">简介<br /><br />你手中的这本《JavaScript王者归来》不仅是一本传播知识的书，更是一本求道的书。<br /><br />本书分为五个部分循序渐进地与读者讨论了JavaScript的方方面面，从简单的语言基础到丰富的实际应用再到深入剖析语言本质的高级话题，字里行间包含着作者多年工作中对JavaScript实践乃至程序设计思想的深入思考和总结。<br /><br />本书揭开了JavaScript的面纱，绕过误解和虚幻的表象，引领你探索程序王国的奥妙。它既是一本为初学者准备的入门级教程，又是一本探寻程序设计思想本源的“魔法典籍”，也是一本Web开发工程师们需要的案头参考书。<br /><br />本书是你进入脚本王国的一把钥匙，引导你领略脚本魔法的神奇魅力。它还是一本着眼于未来改变互联网的启蒙读物，在它的引领下，你将在互联网的世界里获得你所希望得到的知识、智慧、成就和快乐。<br /><br />专题页： <a href="http://labs.aoao.org.cn/akira/" title="http://labs.aoao.org.cn/akira/" target="_blank">http://labs.aoao.org.cn/akira/</a><br /><br />作者简介<br /><br />吴亮（网名月影）早年曾在微软亚洲研究员做过访问学生、在金蝶软件有限公司先后担任过核心开发工程师、设计师和项目经理，现任百度电子商务事业部Web 开发项目经理。多年来致力于JavaScript技术和Web标准的推广，活跃于国内极有影响力的JavaScript专业网站——无忧脚本（ <a href="http://www.51js.com/" title="http://www.51js.com/" target="_blank">http://www.51js.com/</a> ），并担任JavaScript版的版主。平时热爱文学、写作和围棋。</div></div><div style="width: 100%;overflow-x : auto;"><a href="http://www.never-online.net/blog/uploads/200806/the-book.jpg" target="_blank" rel="lightbox"><img src="http://www.never-online.net/blog/uploads/200806/the-book.jpg" alt="http://www.never-online.net/blog/uploads/200806/the-book.jpg" class="imgBorder"/></a></div>]]></description>
      <wfw:commentRss><![CDATA[http://www.never-online.net/blog/feed.asp?q=comment&id=222]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[ActionScript3 UML类图查看器]]></title> 
      <link><![CDATA[http://www.never-online.net/blog/article.asp?id=221]]></link> 
      <category><![CDATA[Flash & Flex & Air]]></category> 
      <author><![CDATA[Rank <null@null.com>]]></author> 
      <pubDate>Wed, 25 Jun 2008 23:48:41 +0800</pubDate> 
      <description><![CDATA[很实用的一个小工具,可以清楚的看到adobe工程师是怎么样设计as的类, <br />对于学习OO以及as都是很有帮助<br />ActionScript 3.0 Diagram Viewer<br /><div style="width: 100%;overflow-x : auto;"><a href="http://www.never-online.net/blog/uploads/200806/as3-diagram.jpg" target="_blank" rel="lightbox"><img src="http://www.never-online.net/blog/uploads/200806/as3-diagram.jpg" alt="http://www.never-online.net/blog/uploads/200806/as3-diagram.jpg" class="imgBorder"/></a></div><br /><a href="http://www.adobe.com/cfusion/exchange/index.cfm?event=extensionDetail&amp;loc=en_us&amp;extid=1540018" title="http://www.adobe.com/cfusion/exchange/index.cfm?event=extensionDetail&amp;loc=en_us&amp;extid=1540018" target="_blank">http://www.adobe.com/cfusion/exchange/index.cfm?event=extensionDetail&amp;loc=en_us&amp;extid=1540018</a>]]></description>
      <wfw:commentRss><![CDATA[http://www.never-online.net/blog/feed.asp?q=comment&id=221]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[设计简单可重用的拖动(DragDrop)库.]]></title> 
      <link><![CDATA[http://www.never-online.net/blog/article.asp?id=220]]></link> 
      <category><![CDATA[JS & DHTML]]></category> 
      <author><![CDATA[Rank <null@null.com>]]></author> 
      <pubDate>Fri, 30 May 2008 02:49:14 +0800</pubDate> 
      <description><![CDATA[设计简单可重用的拖动DragDrop库.<br /><br />注：所有代码均为伪代码。如果只需要代码实现的朋友，就不需要看本文了,我在此只是粗糙的写一个拖放的设计过程,很多细节也都没写,如果要写全部的设计,那还是当面交谈比较方便,所以在此很多细节我就略过了.可能在某些地方我的描述也就没有太准确,在此请谅解<br /><br />一。需求<br /><br />首先，在写任何代码，包括做事也一样，先将自己放在更上的一个层次上去思考问题，会让我们做得更好。现在我们设计DragDrop，也将拖放抽象得高一层，可将DropDrop(以下简称DD)看作是GUI的一个基本功能，如：简单拖放(Base DD)，代理拖放(Proxy DD)，slider(滑动条），resizer(拖动大小)，DD selector(拖放选择器，如像window拖动鼠标选择文件/夹)等等功能。我们可以看他们看作是DD的基本功能或者是DD的一些延伸。一个好的DD库，可以为这些具体实现打下很好的基础，可以最大程度的复用代码，利于维护。<br /><br />二。抽象与设计<br /><br />针对接口编程，不针对实现编程。这来自于设计模式里很经典的句子。那下面来将DD抽象，先看DD的行为。<br />1)无论要实现DD的何种功能，都必须分三步走：<ul class="ubb-list" ><li> onmousedown 鼠标按下时的动作</li><li> onmousemove 鼠标移动时的动作</li><li> onmouseup 鼠标释放时的动作</li></ul>2)拖放的元素对象。如何定义一个拖放对象呢？一个拖放对象不只是包含一个DOM的Element，如：我们现在的窗口，你在用拖动功能的时候实际上是拖动标题栏实现了整个窗口的拖动。再如：拖动的时候防止窗口重绘造成资源占用过多，会采用在拖动过程中用虚框，而不用担心在拖动过程中去重绘整个窗口。因此我们可以将此过程抽象，从而定义一个最基本的拖动对象，它应包括以下几个元素/属性：<ul class="ubb-list" ><li> handle 触发拖放的元素（即标题栏）</li><li> source 需要拖放的元素（即窗口）</li><li> active 拖放中的元素（即虚框）</li></ul>我们可以假定，在拖放中，可以点击窗口的任务地方都是可以拖动；也可以指定在标题栏，在拖动过程中，可以用虚框，也可以是窗口的实体。因此在拖放元素对象的属性中，原始元素source是必要的。而handle,active都是可选的。上面的拖放元素对象类可以定义为：<div class="code-op"><a href="javascript:NS_code.copy('codeFragment1')" title="拷贝代码(Copy Code)">Copy Code(拷贝代码)</a>-<a href="javascript:NS_code.runHTML('codeFragment1')" title="运行代码(Run HTML Code)">Run HTML(运行代码)</a>-<a href="javascript:NS_code.saveAs('codeFragment1')" title="另存代码(Save Code)">Save Code(另存代码)</a></div><div class="code" id="codeFragment1">function DragDropElement(source, handle, active) {<br />&nbsp;&nbsp;if (!source) throw new Error(&#39;Invalid source!&#39;);<br />&nbsp;&nbsp;this.source = source;<br />&nbsp;&nbsp;this.handle = handle||source;<br />&nbsp;&nbsp;this.active = active||source;<br />&nbsp;&nbsp;return this;<br />}</div><br />3)模式。无论何时，我们拖动有且只有一个DragDropElement生效，也就是说你不可能一次性的去操作两个拖放窗口。因为，只有一个鼠标指针。这让我们很自然的想到设计模式中的singleton模式。<b>我们在同一时刻，只有一个拖放的实例。</b>如何把它更好的运用到我们的拖放系统中呢？为了实现管理，可以再借鉴一个模式——MVC，可以将管理器来管理行为（behavior），把所有抽象的行为都放到这个管理器里。把拖放的实例传入，从而控制当前拖放实例的行为管理。<div class="code-op"><a href="javascript:NS_code.copy('codeFragment2')" title="拷贝代码(Copy Code)">Copy Code(拷贝代码)</a>-<a href="javascript:NS_code.runHTML('codeFragment2')" title="运行代码(Run HTML Code)">Run HTML(运行代码)</a>-<a href="javascript:NS_code.saveAs('codeFragment2')" title="另存代码(Save Code)">Save Code(另存代码)</a></div><div class="code" id="codeFragment2">var DragDropManager = {<br />&nbsp;&nbsp;dragCurrent: null,//可以是简单拖放(Base DD)，代理拖放(Proxy DD)，slider(滑动条），resizer(拖动大小)，DD selector(拖放选择器，如像window拖动鼠标选择文件/夹)等等的实例<br />&nbsp;&nbsp;onmousedown: function() {},<br />&nbsp;&nbsp;onmousemove: function() {},<br />&nbsp;&nbsp;onmouseup  : function() {}<br />}</div>4)事件。很明显，我们需要的是事件驱动的系统，一个健壮的事件机制可以让我们更灵活的使用拖放系统的功能。在第3点中提到的，我们只有一个鼠标指针，但并不是说我们不能在拖放一个窗口的时候，另一个窗口不能track它。因此要解决这个问题，只需要在拖动过程中我们利用事件，就可以实现当一个窗口拖放时多个窗口同时跟随移动。在事件机制上windows是我们可以学习的对象。熟悉c/s编程的朋友就知道在编程中MS给我们提供了拖放事件：<ul class="ubb-list" ><li> onDragStart 拖动开始时触发该事件 </li><li> onDrag 拖动时触发该事件</li><li> onDragEnd 拖放结束时触发该事件</li></ul><div class="code-op"><a href="javascript:NS_code.copy('codeFragment3')" title="拷贝代码(Copy Code)">Copy Code(拷贝代码)</a>-<a href="javascript:NS_code.runHTML('codeFragment3')" title="运行代码(Run HTML Code)">Run HTML(运行代码)</a>-<a href="javascript:NS_code.saveAs('codeFragment3')" title="另存代码(Save Code)">Save Code(另存代码)</a></div><div class="code" id="codeFragment3">毫无疑问，我们可以使用observe模式来实现我们的自定义事件机制。关于实现实现observe模式，并非本文范围，感兴趣的朋友可以参阅相关资料。[code]var DragDropManager = {<br />&nbsp;&nbsp;Event: CustomEvent,<br />&nbsp;&nbsp;dragCurrent: null,<br />&nbsp;&nbsp;onmousedown: function() {<br />&nbsp;&nbsp;&nbsp;&nbsp;Event.dispatchEvent(dragCurrent, &#39;onDragStart&#39;);<br />&nbsp;&nbsp;},<br />&nbsp;&nbsp;onmousemove: function() {<br />&nbsp;&nbsp;&nbsp;&nbsp;Event.dispatchEvent(dragCurrent, &#39;onDrag&#39;);<br />&nbsp;&nbsp;},<br />&nbsp;&nbsp;onmouseup  : function() {<br />&nbsp;&nbsp;&nbsp;&nbsp;Event.dispatchEvent(dragCurrent, &#39;onDragEnd&#39;);<br />&nbsp;&nbsp;}<br />}</div><br />我们利用这三个事件就可以解决上面所说的，另一窗口跟随当前拖放窗口移动的问题。<br /><br />三、更多要求，功能细化<br /><br />无疑，我们解决了大部分的问题。但仍然有不够周全的地方。例如：在windows中，我们假设，A文件可以拖放到文件夹A里，而不能拖放到另一个文件夹B里。当然，我们仍然可以利用onDrag事件里去判断是否是文件夹A，但这并非是万全之策。<br />还有一个问题仍需你来解决，如果一个窗口下有几百个文件/夹，一个文件拖动到一个文件夹，你如何判断最后拖动到哪个文件夹呢？你会想，我可以在onDrag这个事件里判断绝对定位，这当然是没错的。但每移动一个像素都会触发一次onDrag，也意味着会判断所有的文件/夹坐标一次，效率是不是慢了？<br />将第二个问题延伸，我们拖放鼠标选择文件/夹的时候，只要矩形区域覆盖住文件/夹，就会高亮，反之，就会取消高亮。因此事件仍然可以抽象，机制仍可以加强。<br /><br />解决这些问题，我觉得至少可以这样来解决：<br /><br />1)创建一个DragDropTarget类，用以表明哪个对象是我们的目标对象。成为目标对象才能成为系统监视的一个目标。在拖放时我们不监视非DragDropTarget实例的坐标。DragDropTarget里再定义一个Group属性来用其分组，以指明哪些文件是可以拖放到哪个组。DragDropTarget的Group属性是与DragDropElement的Group属性是对应的，他们完成同一个功能。代表你现在拖着这个文件可以拖到哪个文件夹里。如果他们的组名不一样，相当于他们是不可见的。这解决了我们的第一个问题。<br />2)利用cache来存储坐标。<b>按需存储</b>。从而解决第二个问题。<br />3)可以再加入三件事件，这几个事件实际上也是MS在它的拖放系统中给我们提供的标准事件。<ul class="ubb-list" ><li>onDragEnter</li><li>onDragOver</li><li>onDragLeave</li></ul><div class="code-op"><a href="javascript:NS_code.copy('codeFragment4')" title="拷贝代码(Copy Code)">Copy Code(拷贝代码)</a>-<a href="javascript:NS_code.runHTML('codeFragment4')" title="运行代码(Run HTML Code)">Run HTML(运行代码)</a>-<a href="javascript:NS_code.saveAs('codeFragment4')" title="另存代码(Save Code)">Save Code(另存代码)</a></div><div class="code" id="codeFragment4">function DragDropElement(source, handle, active, sGroup) {<br />&nbsp;&nbsp;if (!source) throw new Error(&#39;Invalid source!&#39;);<br />&nbsp;&nbsp;this.source = source;<br />&nbsp;&nbsp;this.handle = handle||source;<br />&nbsp;&nbsp;this.active = active||source;<br />&nbsp;&nbsp;this.sGroup = sGroup;<br />&nbsp;&nbsp;return this;<br />}<br />function DragDropTarget(target, sGroup) {<br />&nbsp;&nbsp;this.target = target;<br />&nbsp;&nbsp;this.sGroup = sGroup;<br />&nbsp;&nbsp;return this;<br />}<br />var DragDropManager = {<br />&nbsp;&nbsp;Event: CustomEvent,<br />&nbsp;&nbsp;dragCurrent: null,<br />&nbsp;&nbsp;onmousedown: function() {<br />&nbsp;&nbsp;&nbsp;&nbsp;Event.dispatchEvent(dragCurrent, &#39;onDragStart&#39;);<br />&nbsp;&nbsp;},<br />&nbsp;&nbsp;onmousemove: function() {<br />&nbsp;&nbsp;&nbsp;&nbsp;Event.dispatchEvent(dragCurrent, &#39;onDrag&#39;);<br />&nbsp;&nbsp;&nbsp;&nbsp;Event.dispatchEvent(dragCurrent, &#39;onDragEnter&#39;);<br />&nbsp;&nbsp;&nbsp;&nbsp;Event.dispatchEvent(dragCurrent, &#39;onDragOver&#39;);<br />&nbsp;&nbsp;&nbsp;&nbsp;Event.dispatchEvent(dragCurrent, &#39;onDragLeave&#39;);<br />&nbsp;&nbsp;},<br />&nbsp;&nbsp;onmouseup  : function() {<br />&nbsp;&nbsp;&nbsp;&nbsp;Event.dispatchEvent(dragCurrent, &#39;onDragEnd&#39;);<br />&nbsp;&nbsp;},<br />&nbsp;&nbsp;cacheLocation: function() {<br />&nbsp;&nbsp;}<br />}</div><br />四、组合，继承<br />基础已经基本写好，如何利用它呢？<br />DragDropBase是一个最基本的拖放实现类。它有一个属性对象，该对象是DragDropElement的实例。也就是说，这个DragDropBase实现类的一个实例，也就有一个拖放元素对象的实例。<br />而DragDropProxy可以是继承于DragDropBase。<br />也可设计为DragDropBase是最基本实现，DragDropProxy实际就是在拖动当中以虚框或是其它的元素取代了原本的source元素。因此我们不必生成一个Proxy类，可以直接以参数形式传递一个虚框Element给DragDropBase中拖放元素对象(DragDropBase的实例)属性的active元素。<br />resizer是使用DragDropBase/DragDropProxy。slider也是如此。本人太懒，图就不画了。<br /><br />五、考虑细节，更好的复用。<br />实现是基本没有问题了，但考虑到不同浏览器，需要兼容，且坐标如何控件，slider和resizer是拖放系统的一个分支，他们都需要绝对坐标去定位吗？如何同时存在相对坐标与绝对坐标定位的问题，是你值得思考的。这不同于我们简单的实现一个拖放代码，如果是一个简单的拖动，&lt;a href=&quot;<a href="http://www.never-online.net/blog/article.asp?id=148" title="http://www.never-online.net/blog/article.asp?id=148" target="_blank">http://www.never-online.net/blog/article.asp?id=148</a>&quot;&gt;十几行&lt;/a&gt;就够了。现在是我们要顾大局的时候，如果你设计得不好，将来会是一种灾难。任何楼房打地基的时候都是极其重要的。如果我需要在拖放系统中加入更多的事件是否还可行？取舍是你要考虑的。高于模式的，只有原则和需求。而原则是来自于需求的，因此，需求是你的方向，也是代码的方向。必须立足于实地去想这些问题。[/code]]]></description>
      <wfw:commentRss><![CDATA[http://www.never-online.net/blog/feed.asp?q=comment&id=220]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[safari的一些杂记]]></title> 
      <link><![CDATA[http://www.never-online.net/blog/article.asp?id=219]]></link> 
      <category><![CDATA[JS & DHTML]]></category> 
      <author><![CDATA[Rank <null@null.com>]]></author> 
      <pubDate>Sun, 25 May 2008 00:52:27 +0800</pubDate> 
      <description><![CDATA[<b>1. 高版本js</b><br />今天刚发现的, safari浏览器也是支持读写器(get/set)的, 这个是js高版本功能(具体哪个版本以后支持就不得而知), 也就说明safari支持高版本的js(很惭愧,一直没关心webkit内核的浏览器).当然firefox 2.0后的版本都支持这个功能的,但是&lt;script&gt;&lt;/script&gt;标签得改成这样&lt;script type=&quot;application/javascript;version=1.7&quot;&gt;&lt;/script&gt;也就是要指定版本, 否则无法使用高版本的js. 说回safari, 下面是safari使用get/set的示例:<div class="code-op"><a href="javascript:NS_code.copy('codeFragment1')" title="拷贝代码(Copy Code)">Copy Code(拷贝代码)</a>-<a href="javascript:NS_code.runHTML('codeFragment1')" title="运行代码(Run HTML Code)">Run HTML(运行代码)</a>-<a href="javascript:NS_code.saveAs('codeFragment1')" title="另存代码(Save Code)">Save Code(另存代码)</a></div><div class="code" id="codeFragment1">&lt;textarea id=&quot;code&quot; style=&quot;width:500px;height:300px;&quot;&gt;<br />function Profile (){};<br />Profile.prototype = {<br />&nbsp;&nbsp;_name: &#39;never-online&#39;,<br />&nbsp;&nbsp;_url: &#39;http&#58;//www.never-online.net&#39;,<br />&nbsp;&nbsp;get name() {<br />&nbsp;&nbsp;&nbsp;&nbsp;return this._name;<br />&nbsp;&nbsp;},<br />&nbsp;&nbsp;set name(val) {<br />&nbsp;&nbsp;&nbsp;&nbsp;this._name = val;<br />&nbsp;&nbsp;}<br />}<br />var demo = new Profile();<br />alert(demo.name);<br />demo.name = &#39;BlueDestiny&#39;;<br />alert(demo.name);<br />&lt;/textarea&gt;<br />&lt;script&gt;<br />//&lt;![CDATA[<br />alert(&#39;alert&#39;);<br />var cd = document.getElementById(&#39;code&#39;);<br />if(/webkit/i.test(window.navigator.userAgent))<br />eval(cd.value);<br />else<br />alert(&#39;pls use safari browser or use based webkit browser! 请用safari打开此页面,否则看不到效果&#39;);<br />//]]&gt;<br />&lt;/script&gt;<br />&lt;script type=&quot;application/javascript;version=1.7&quot;&gt;<br />//&lt;![CDATA[<br />eval(document.getElementById(&#39;code&#39;).value);<br />//]]&gt;<br />&lt;/script&gt;</div><br /><b>2. focus</b><br />safari里据观察, 只有控件才能获取focus(比如textbox, textarea之类的), div是无法得到focus的, 加tabindex也是白搭. 看个示例<br /><div class="code-op"><a href="javascript:NS_code.copy('codeFragment2')" title="拷贝代码(Copy Code)">Copy Code(拷贝代码)</a>-<a href="javascript:NS_code.runHTML('codeFragment2')" title="运行代码(Run HTML Code)">Run HTML(运行代码)</a>-<a href="javascript:NS_code.saveAs('codeFragment2')" title="另存代码(Save Code)">Save Code(另存代码)</a></div><div class="code" id="codeFragment2">&lt;div tabindex=&quot;1&quot; id=&quot;div&quot;&gt;click here. try get focus&lt;/div&gt;<br />&lt;script&gt;<br />var div = document.getElementById(&#39;div&#39;);<br />div.onfocus = function(){<br />document.write(&#39;you get focus&#39;);<br />}<br />&lt;/script&gt;</div>具体应用不再举例.<br /><br /><b>3. debug</b><br />safari里调试不方便, 这个开发者的工具可能对你有用.<br /><a href="http://nightly.webkit.org/" title="http://nightly.webkit.org/" target="_blank">http://nightly.webkit.org/</a><br /><br /><b>4. client storage</b><br />safari也是可以在客户端存储持久化数据的. 这个是HTML5草案中的数据库存储. 可以用sql语句的. 相关API参见下面的网址<br />HTML 5 Client-side Database Storage API<br /><a href="http://webkit.org/blog/126/webkit-does-html5-client-side-database-storage/" title="http://webkit.org/blog/126/webkit-does-html5-client-side-database-storage/" target="_blank">http://webkit.org/blog/126/webkit-does-html5-client-side-database-storage/</a><br /><br /><b>5.webkit Transition</b><br />该功能类似于IE的滤镜, 但比IE的效果要好,且平滑得多, 占用资源也不高, 这与safari同出于苹果系统有关.如果常用mac机的话,就应该习以为常了,也应该知道有Transition这个东西,这一点属于扫盲的记录,方便他人也了解这个功能. 如果你有safari浏览器,请运行以下代码:<div class="code-op"><a href="javascript:NS_code.copy('codeFragment3')" title="拷贝代码(Copy Code)">Copy Code(拷贝代码)</a>-<a href="javascript:NS_code.runHTML('codeFragment3')" title="运行代码(Run HTML Code)">Run HTML(运行代码)</a>-<a href="javascript:NS_code.saveAs('codeFragment3')" title="另存代码(Save Code)">Save Code(另存代码)</a></div><div class="code" id="codeFragment3">&lt;div id=&quot;demo&quot; style=&quot;border:5px solid #000;left:500px;top:100px;position:absolute;width:300px;height:100px;padding:30px;background:#FFF046;font-family:Trebuchet MS;&quot;&gt;webkitTransition of safari&lt;/div&gt;<br />&lt;script type=&quot;text/javascript&quot;&gt;<br />//&lt;![CDATA[<br />if(!/webkit/i.test(window.navigator.userAgent)) alert(&#39;请用safari打开本页面,或者用基于webkit的浏览器再重试&#39;);<br />else alert(&#39;点击任意的地方可看到效果&#39;);<br />document.onclick = function(event)<br />{<br />var d = document.getElementById(&#39;demo&#39;);<br />event = window.event || event;<br />var duration = 2;<br />d.style.webkitTransition = &#39;-webkit-transform &#39; + duration + &#39;s ease-in, opacity &#39; + duration + &#39;s ease-in&#39;;<br />d.offsetTop; // Force style recalc<br />d.style.webkitTransformOrigin = &quot;0 0&quot;;<br />d.style.webkitTransform = &#39;skew(30deg, 0deg) scale(0)&#39;;<br />d.style.opacity = &#39;0&#39;;<br />}<br />//]]&gt;<br />&lt;/script&gt;</div>]]></description>
      <wfw:commentRss><![CDATA[http://www.never-online.net/blog/feed.asp?q=comment&id=219]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[windows下mozilla firefox窗口blur的bug]]></title> 
      <link><![CDATA[http://www.never-online.net/blog/article.asp?id=218]]></link> 
      <category><![CDATA[JS & DHTML]]></category> 
      <author><![CDATA[Rank <null@null.com>]]></author> 
      <pubDate>Sat, 24 May 2008 19:39:16 +0800</pubDate> 
      <description><![CDATA[<b>注意</b>, 要用<b>windows平台的firefox</b>, mac机上的firefox貌似没有这个bug<br /><br />描述: 无<br /><br />还原:<br />按页面中的提示操作.<br /><a href="http://www.never-online.net/code/js/firefox-blur-bug/" title="http://www.never-online.net/code/js/firefox-blur-bug/" target="_blank">http://www.never-online.net/code/js/firefox-blur-bug/</a><br /><br />用firefox打开页面<br />选中页面中第一个select<br />保持select焦点状态<br />连续按几下tab键<br />firefox down了<br /><br />相关:<br />IE下的window.blur在iframe里与非frame窗口表现得相去甚远,暂时没有时间去研究它,有兴趣的同学可以自己看看.]]></description>
      <wfw:commentRss><![CDATA[http://www.never-online.net/blog/feed.asp?q=comment&id=218]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[&quot;可爱&quot; 的QQ...]]></title> 
      <link><![CDATA[http://www.never-online.net/blog/article.asp?id=217]]></link> 
      <category><![CDATA[Diary & Misc]]></category> 
      <author><![CDATA[Rank <null@null.com>]]></author> 
      <pubDate>Tue, 20 May 2008 20:25:50 +0800</pubDate> 
      <description><![CDATA[我想他们有必要改一下这个错别字-_-!<br /><div style="width: 100%;overflow-x : auto;"><a href="http://www.never-online.net/blog/uploads/200805/QQ.jpg" target="_blank" rel="lightbox"><img src="http://www.never-online.net/blog/uploads/200805/QQ.jpg" alt="http://www.never-online.net/blog/uploads/200805/QQ.jpg" class="imgBorder"/></a></div><br /><br />关于这两个词“致哀”与“志哀”，请参见：<br /><a href="http://society.people.com.cn/GB/8217/122500/122647/7267215.html" title="http://society.people.com.cn/GB/8217/122500/122647/7267215.html" target="_blank">http://society.people.com.cn/GB/8217/122500/122647/7267215.html</a><div class="quote"><div class="quote-title">引用 <u></u></div><div class="quote-content">　　5月18日19：04，人民网推出头条新闻《国务院公告：5月19日至21日为<b>全国哀悼日 全国下半旗志哀</b>》；19日，人民网主页在最醒目的位置出现通栏横幅<b>“向汶川大地震遇难同胞致哀”</b>。有热心的网友就“致哀”和“志哀”的区别向我们来电询问。<br /><br />　　根据《现代汉语词典》（商务印书馆2005年修订本 第五版）1755页标注：<br /><br />　　志哀：（动词）用某种方式表示哀悼。<br /><br />　　“志”，含义为“记”。在常用词“永志不忘”中，“志”就是这一用法。<br /><br />　　那么“致哀”一词应该怎样使用呢？<br /><br />　　同一版本的《现代汉语词典》的1758页，对“致哀”有这样一条解释：<br /><br />　　致哀：（动词）对死者表示哀悼。如：向死难烈士致哀。<br /><br />　　“致”在这里是给予、向对方表示的意思。<br /><br />　　所以，在前一新闻中，“全国下半旗志哀”，表示全国用“下半旗”的方式表示哀悼。<b>而“向遇难者致哀”，“致哀”的用法是正确的，表示向遇难同胞致以哀悼。</b></div></div><span style="color:Red"> </span>]]></description>
      <wfw:commentRss><![CDATA[http://www.never-online.net/blog/feed.asp?q=comment&id=217]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[mozilla firefox 光标丢失bug (cursor lost)]]></title> 
      <link><![CDATA[http://www.never-online.net/blog/article.asp?id=216]]></link> 
      <category><![CDATA[JS & DHTML]]></category> 
      <author><![CDATA[Rank <null@null.com>]]></author> 
      <pubDate>Tue, 20 May 2008 03:20:43 +0800</pubDate> 
      <description><![CDATA[描述<br />由于position设为绝对定位(absolute)，会导致该层里的textbox和textarea光标丢失。导致的原因已经查到，是gecko内核的bug。该bug可能在3.0以上版本后修复<div class="quote"><div class="quote-title">引用 <u></u></div><div class="quote-content">overflow:auto <br />overflow-x:auto; <br />overflow-y:auto; <br />overflow:scroll <br />overflow-x:scroll; <br />overflow-y:scroll; <br />overflow-x:hidden; <br />overflow-y:hidden; <br />position:absolute;</div></div>重现<div class="code-op"><a href="javascript:NS_code.copy('codeFragment1')" title="拷贝代码(Copy Code)">Copy Code(拷贝代码)</a>-<a href="javascript:NS_code.runHTML('codeFragment1')" title="运行代码(Run HTML Code)">Run HTML(运行代码)</a>-<a href="javascript:NS_code.saveAs('codeFragment1')" title="另存代码(Save Code)">Save Code(另存代码)</a></div><div class="code" id="codeFragment1">&lt;style type=&quot;text/css&quot;&gt;<br />/*&lt;![CDATA[*/<br />html,body {height:100%;width:100%;overflow:auto;}<br />#demo {position:absolute;width:350px;height:300px;padding:10px;border:5px solid #eee;}<br />/*]]&gt;*/<br />&lt;/style&gt;<br />&lt;/head&gt;<br />&lt;body&gt;<br />&lt;div id=&quot;demo&quot;&gt;<br />&lt;textarea cols=&quot;30&quot; rows=&quot;&quot;&gt;&lt;/textarea&gt;&lt;br/&gt;&lt;br/&gt;<br />&lt;input type=&quot;text&quot; size=&quot;30&quot;&gt;&lt;br/&gt;&lt;br/&gt;<br />&lt;input type=&quot;text&quot; size=&quot;30&quot;&gt;&lt;br/&gt;&lt;br/&gt;<br />&lt;/div&gt;</div><br />解决方法<br />1. 在该容器加入css属性overflow:auto,position:relative<br />2. 在显示时使用延迟显示<br /><br />示例<div class="code-op"><a href="javascript:NS_code.copy('codeFragment2')" title="拷贝代码(Copy Code)">Copy Code(拷贝代码)</a>-<a href="javascript:NS_code.runHTML('codeFragment2')" title="运行代码(Run HTML Code)">Run HTML(运行代码)</a>-<a href="javascript:NS_code.saveAs('codeFragment2')" title="另存代码(Save Code)">Save Code(另存代码)</a></div><div class="code" id="codeFragment2">&lt;script&gt;<br />var d = document.createElement(&#39;div&#39;);<br />var s = d.style;<br />s.position = &#39;absolute&#39;;<br />s.border = &#39;1px solid #000&#39;;<br />s.background = &#39;#eee&#39;;<br />d.innerHTML = &#39;&lt;input/&gt;&#39;<br />document.body.appendChild(d);<br />s.display = &#39;none&#39;;<br />setTimeout(function(){<br />&nbsp;&nbsp;s.overflow = &#39;auto&#39;;<br />&nbsp;&nbsp;s.display = &#39;block&#39;;<br />},0)<br />&lt;/script&gt;</div><br />另外再补充一点:<br />setTimeout除了延缓程序的执行时间外,还有另外的一些功能.<br />它可以模拟类似桌面编程中的Application.DoEvents()方法, <br />js是单线程操作,用setTimout可以将所有其他事件在队列中等待,从而实现一个事件队列<br />还有一些特别的功能.比如我们上文提到的,处理某些bug的时候. 再又如出现&quot;HTML已终止操作&quot;的时候也可以用setTimout来处理.]]></description>
      <wfw:commentRss><![CDATA[http://www.never-online.net/blog/feed.asp?q=comment&id=216]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[filter:gray三天]]></title> 
      <link><![CDATA[http://www.never-online.net/blog/article.asp?id=215]]></link> 
      <category><![CDATA[Diary & Misc]]></category> 
      <author><![CDATA[Rank <null@null.com>]]></author> 
      <pubDate>Mon, 19 May 2008 13:55:38 +0800</pubDate> 
      <description><![CDATA[filter:gray三天, 由此带来客户端操作缓慢请谅解. 如果觉得渲染过慢,请用非IE浏览器打开<br /><br />regards]]></description>
      <wfw:commentRss><![CDATA[http://www.never-online.net/blog/feed.asp?q=comment&id=215]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[又一个IE透明度问题]]></title> 
      <link><![CDATA[http://www.never-online.net/blog/article.asp?id=214]]></link> 
      <category><![CDATA[CSS]]></category> 
      <author><![CDATA[Rank <null@null.com>]]></author> 
      <pubDate>Sun, 18 May 2008 21:20:40 +0800</pubDate> 
      <description><![CDATA[在前阵子发现 <a href="http://www.never-online.net/blog/article.asp?id=197" title="http://www.never-online.net/blog/article.asp?id=197" target="_blank">ie8的透明度bug</a> 之后, 这两天又遇到了一个问题...<br /><br />这次是去掉dtd的头也没用...环境<br />os: xp-home<br />ie: ie 8 beta1模拟ie7状态<br />code如下, 比较opacity和opaticy-invalid的className. 如果有高度/宽度就没有问题,如果没有则filter透明度无效,问了下aoao,filter要在haslayout为-1时才有效,用height,width或者zoom都可以触发hasLayout, 消息说ie8会不要hasLayout这个属性...<br /><br />相关资料:<br />On having layout<br /><a href="http://bbs.blueidea.com/viewthread.php?tid=2636904" title="http://bbs.blueidea.com/viewthread.php?tid=2636904" target="_blank">http://bbs.blueidea.com/viewthread.php?tid=2636904</a><br /><div class="code-op"><a href="javascript:NS_code.copy('codeFragment1')" title="拷贝代码(Copy Code)">Copy Code(拷贝代码)</a>-<a href="javascript:NS_code.runHTML('codeFragment1')" title="运行代码(Run HTML Code)">Run HTML(运行代码)</a>-<a href="javascript:NS_code.saveAs('codeFragment1')" title="另存代码(Save Code)">Save Code(另存代码)</a></div><div class="code" id="codeFragment1">&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01//EN&quot; <br />&quot;http&#58;//www.w3.org/TR/html4/strict.dtd&quot;&gt;<br />&lt;html&gt;<br />&nbsp;&lt;head&gt;<br />&nbsp;&lt;title&gt;Rank&#39;s HTML document&lt;/title&gt;<br />&nbsp;&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=gb2312&quot; /&gt;<br />&nbsp;&lt;meta http-equiv=&quot;Pragma&quot; content=&quot;no-cache&quot; /&gt;  <br />&nbsp;&lt;meta http-equiv=&quot;Cache-Control&quot; content=&quot;no-cache&quot; /&gt;     <br />&nbsp;&lt;meta http-equiv=&quot;Expires&quot; content=&quot;0&quot; /&gt;<br />&nbsp;&lt;meta http-equiv=&quot;ImageToolbar&quot; content=&quot;no&quot; /&gt;<br />&nbsp;&lt;style type=&quot;text/css&quot; title=&quot;default&quot; media=&quot;screen&quot;&gt;<br />&nbsp;/*&lt;![CDATA[*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.opacity { filter:alpha(opacity=20);opacity:0.2;background:#333;height:20px; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.opacity-invalid { filter:alpha(opacity=20);opacity:0.2;background:#333; }<br />&nbsp;/*]]&gt;*/<br />&nbsp;&lt;/style&gt;<br />&nbsp;&lt;/head&gt;<br />&nbsp;&lt;body&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;div class=&quot;opacity&quot;&gt;&lt;a href=&quot;http&#58;//www.never-online.net&quot;&gt;never-online&lt;/a&gt;&lt;/div&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;div class=&quot;opacity-invalid&quot;&gt;&lt;a href=&quot;http&#58;//www.never-online.net&quot;&gt;never-online&lt;/a&gt;&lt;/div&gt;<br />&nbsp;&lt;/body&gt;<br />&lt;/html&gt;</div>]]></description>
      <wfw:commentRss><![CDATA[http://www.never-online.net/blog/feed.asp?q=comment&id=214]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[号召捐款....]]></title> 
      <link><![CDATA[http://www.never-online.net/blog/article.asp?id=213]]></link> 
      <category><![CDATA[Diary & Misc]]></category> 
      <author><![CDATA[Rank <null@null.com>]]></author> 
      <pubDate>Tue, 13 May 2008 20:33:12 +0800</pubDate> 
      <description><![CDATA[暂时抛开地震局和其它的外部因素, 当前最重要的问题是如何帮助四川人们渡过这个难关.<br /><br />众人拾柴火焰多,希望大家都能帮帮灾区的人们...捐款捐物... <br /><br />也希望把这个banner放到你的网站,让更多的人看到这个&quot;广告&quot;从而可以让更多的人帮助灾区人民...<br /><br /><br /><br />还要提醒一个, 希望大家在捐款捐物的同时提高警惕, 以免汇错帐号. 一般红十字会的帐号或政府机构的帐号最好在大的网站去获取, 比如<a href="http://ifeng.com" title="http://ifeng.com" target="_blank">凤凰网</a><br /><br /><div style="width: 100%;overflow-x : auto;"><a href="http://www.never-online.net/blog/uploads/200805/banner.jpg" target="_blank" rel="lightbox"><img src="http://www.never-online.net/blog/uploads/200805/banner.jpg" alt="http://www.never-online.net/blog/uploads/200805/banner.jpg" class="imgBorder"/></a></div><br /><br />通过网上捐款登陆中国红十字会总会网站：<a href="http://www.redcross.org.cn" title="http://www.redcross.org.cn" target="_blank">www.redcross.org.cn</a> 点击进入“网上捐赠”栏目，按照提示操作即可]]></description>
      <wfw:commentRss><![CDATA[http://www.never-online.net/blog/feed.asp?q=comment&id=213]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[北京地震]]></title> 
      <link><![CDATA[http://www.never-online.net/blog/article.asp?id=212]]></link> 
      <category><![CDATA[Diary & Misc]]></category> 
      <author><![CDATA[Rank <null@null.com>]]></author> 
      <pubDate>Tue, 13 May 2008 00:35:08 +0800</pubDate> 
      <description><![CDATA[有句话说得好:专家不如蛤蟆!<br /><br />第一次亲身体验到地震.<br /><br />下午例行开会,靠在椅子上,突然感觉头晕...第一感觉是昨晚没睡好,应该没事,再隔了十秒,感觉还是不对劲,回头看了一下椅子,看看会不会是椅子太摇.仔细看了一下,没有动...<br /><br />aoao说,你看地上干什么,是不是头晕...全组都回答yes....讨论结论: 地震...-_-!<br /><br />震了之后,头都晕...听说今晚还有...什么时候是个头啊....难怪北京买保险的人多, 有原因的:)<br /><br />2008年注定不平凡<br /><br />&quot;故天将降大任于社稷也,必先涨其物价，抢其火炬，撞其火车,殁其国民，震其国土，所以动心忍性增益其民之团结....&quot;<br /><br />再有就是中国地震局纯粹的拿我们纳税人的钱不做事, 事后诸葛亮!气愤无法用语言来表达! <br /><br />同时为四川祈祷......]]></description>
      <wfw:commentRss><![CDATA[http://www.never-online.net/blog/feed.asp?q=comment&id=212]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[被一个问题烦了一天]]></title> 
      <link><![CDATA[http://www.never-online.net/blog/article.asp?id=211]]></link> 
      <category><![CDATA[JS & DHTML]]></category> 
      <author><![CDATA[Rank <null@null.com>]]></author> 
      <pubDate>Mon, 12 May 2008 15:46:28 +0800</pubDate> 
      <description><![CDATA[连双休都没休好.在DHTML里一个拖拽层下有一个iframe时,会出现事件丢失的情况,仔细分析,不难理解出现这种情况的原因: 在document.onmousemove和document.onmouseup时触发的事件并没有在原有的document上捕捉到,也就是说在onmousemove和onmouseup时会跑到了iframe里去,所以会出现以上情况. 下面把问题还原.<div class="code-op"><a href="javascript:NS_code.copy('codeFragment1')" title="拷贝代码(Copy Code)">Copy Code(拷贝代码)</a>-<a href="javascript:NS_code.runHTML('codeFragment1')" title="运行代码(Run HTML Code)">Run HTML(运行代码)</a>-<a href="javascript:NS_code.saveAs('codeFragment1')" title="另存代码(Save Code)">Save Code(另存代码)</a></div><div class="code" id="codeFragment1">&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01//EN&quot; <br />&quot;http&#58;//www.w3.org/TR/html4/strict.dtd&quot;&gt;<br />&lt;html&gt;<br />&nbsp;&lt;head&gt;<br />&nbsp;&lt;title&gt;Rank&#39;s HTML document&lt;/title&gt;<br />&nbsp;&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=gb2312&quot; /&gt;<br />&nbsp;&lt;meta http-equiv=&quot;Pragma&quot; content=&quot;no-cache&quot; /&gt; <br />&nbsp;&lt;meta http-equiv=&quot;Cache-Control&quot; content=&quot;no-cache&quot; /&gt; <br />&nbsp;&lt;meta http-equiv=&quot;Expires&quot; content=&quot;0&quot; /&gt;<br />&nbsp;&lt;meta http-equiv=&quot;ImageToolbar&quot; content=&quot;no&quot; /&gt;<br />&nbsp;&lt;style type=&quot;text/css&quot; title=&quot;default&quot; media=&quot;screen&quot;&gt;<br />&nbsp;/*&lt;![CDATA[*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;body { margin:0;font:13px/1;font-family:Arial; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.panel { position:absolute;left:300px;top:100px;background:#eee;width:500px;height:300px;border:10px solid #555;padding:10; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.panel .header { background:#555;color:#fff; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.panel .header h3 { padding:10px;margin:0; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.panel .inner { padding:10px; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.panel .close { position:absolute;right:10px;top:10px;border:1px solid #fff;width:20px;height:20px;text-align:center;color:#fff;cursor:default; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.mask { filter:alpha(opacity:60);opacity:0.6;background:#333; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.proxy { position:absolute;background:#333;filter:alpha(opacity:60);opacity:0.6;display:none;z-index:999; }<br />&nbsp;/*]]&gt;*/<br />&nbsp;&lt;/style&gt;<br />&nbsp;&lt;/head&gt;<br />&nbsp;&lt;body&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;div class=&quot;panel&quot; id=&quot;panel&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;div class=&quot;header&quot;&gt;&lt;h3&gt;header here&lt;/h3&gt;&lt;/div&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;div class=&quot;inner&quot;&gt;inner contents, &lt;a href=&quot;http&#58;//www.never-online.net/blog&quot;&gt;this is a link&lt;/a&gt;&lt;/div&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;span class=&quot;close&quot;&gt;X&lt;/span&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/div&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;iframe style=&quot;width:100%;height:900px&quot;&gt;&lt;/iframe&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;div id=&#39;proxy&#39; class=&quot;proxy&quot;&gt;&lt;/div&gt;<br /><br />&nbsp;&nbsp; &lt;script type=&quot;text/javascript&quot;&gt;<br />&nbsp;&nbsp; //&lt;![CDATA[<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var $ = function(id) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return typeof(id)==&#39;string&#39;?<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.getElementById(id):id;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var panel = $(&#39;panel&#39;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var proxy = $(&#39;proxy&#39;);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;panel.onmousedown = function(e) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e = window.event || e;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;panel.deltaX = e.clientX - panel.offsetLeft;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;panel.deltaY = e.clientY - panel.offsetTop;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;with (proxy.style) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;display = &#39;block&#39;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;left = panel.offsetLeft +&#39;px&#39;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;top&nbsp;&nbsp;= panel.offsetTop +&#39;px&#39;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;width = panel.offsetWidth +&#39;px&#39;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;height = panel.offsetHeight +&#39;px&#39;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.onmousemove = function (e) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e = window.event || e;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;with (proxy.style) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;left = e.clientX - panel.deltaX +&#39;px&#39;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;top = e.clientY - panel.deltaY +&#39;px&#39;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.onmouseup = function(e) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;with (panel.style) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;display = &#39;block&#39;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;left = proxy.offsetLeft +&#39;px&#39;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;top = proxy.offsetTop +&#39;px&#39;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;proxy.style.display = &#39;none&#39;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.onmousemove = null;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp; //]]&gt;<br />&nbsp;&nbsp; &lt;/script&gt;<br />&nbsp;&lt;/body&gt;<br />&lt;/html&gt;</div><br />以上的code已经出精简版的了,实际上要查找这个问题的根源还是费了一翻功夫, 假如你在IE里用setCapture之后,就不会有问题,而firefox没有capture,所以问题依旧.在调试的时候会发现另一个问题<br />由于document被偷梁换柱了,导致如果capture不能release的话,会出现浏览&quot;死掉&quot;的现象,这个需要注意. 具体的code就不给出了,只是提醒在逻辑上要改变一下.在具体编程时会有更复杂的情况 <img src="http://www.never-online.net/blog/styles/g/images/smilies/icon_smile.gif" border="0" alt="[smile]" />]]></description>
      <wfw:commentRss><![CDATA[http://www.never-online.net/blog/feed.asp?q=comment&id=211]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[纪念 2008.5.9]]></title> 
      <link><![CDATA[http://www.never-online.net/blog/article.asp?id=210]]></link> 
      <category><![CDATA[Diary & Misc]]></category> 
      <author><![CDATA[Rank <null@null.com>]]></author> 
      <pubDate>Fri, 09 May 2008 14:47:58 +0800</pubDate> 
      <description><![CDATA[伤心...]]></description>
      <wfw:commentRss><![CDATA[http://www.never-online.net/blog/feed.asp?q=comment&id=210]]></wfw:commentRss>
    </item>
      
  </channel>
</rss>
