<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/">
<?xml-stylesheet type="text/xsl" href="rss.xslt"?>
<channel>
   <title>艾恩ASP学习BLOG文章列表</title>
   <link>http://dev.mo.cn/mydiary.asp</link>
   <description>艾恩ASP学习Blog,免费提供各种ASP学习资源，组件、源代码、学习手册、技术文章...</description>
   <generator>Anlige By dev.mo.cn</generator>
   <language>zh-CN</language>
   <copyright>copyright 2008 dev.mo.cn 鲁ICP备08010580</copyright>
   <pubDate>2012-5-19 8:24:16</pubDate>
   <item>
      <title>在外部引用js里面获取当前js的路径</title>
      <author>zhanghuiguoanlige@126.com</author>
      <link>http://dev.mo.cn/article_297.html</link>
      <pubDate>2010-12-4 16:24:48</pubDate>
      <guid>http://dev.mo.cn/article_297.html</guid>
      <description>
      <![CDATA[&nbsp;&nbsp;&nbsp;下午在写一段多用户程序的时候，需要不同的用户js文件内部的一些参数要不一样，当时想都没想就用window.location获取，输出一看，错误，获取的是当前网页的url，以前没处理过类似的问题，于是到网上看了下，发现一个解决方法，就是给引用这个js的script标签加个id属性，然后用document.getElementById()&nbsp;方法来获取--可以解决问题。但是有个缺点就是还要修改网页的html代码，想了一下，既然可以给script加一个id，那可不可以在js里面给页面输出一个节点，根据节点之间的关系来定位script呢，于是写了下面一段代码：<br /><div class="code"><div class="code_title"><span> &nbsp;<img src="images/code.gif" alt="" style="padding:0px;border:0px;" /></span>&nbsp;&nbsp;&nbsp;<a href="javascript:void(0);" onclick="window.clipboardData.setData('Text',this.parentNode.parentNode.childNodes[1].outerText);alert('븴Ƴɹ,Ctrl+VճҪλ!!');">ȫ</a></div><div class="code_content">document.write("&lt;span&nbsp;id=\"_tmp\"&nbsp;style=\"display:none\"&gt;&lt;/span&gt;");<br />var&nbsp;_this&nbsp;=&nbsp;document.getElementById("_tmp").previousSibling;<br />alert(_this.src);</div></div><br />输出结果正确，获取到了js的路径，经过测试这个方法兼容各浏览器。<br />&nbsp;&nbsp;代码也没什么特别之处，就是在当前位置输出了一个span元素，通过span元素的previousSibling属性来定位script的。]]>
      </description>
      <category>JavaScript/DOM</category>
   </item>
   <item>
      <title>网页刷新后保持菜单的原状态</title>
      <author>zhanghuiguoanlige@126.com</author>
      <link>http://dev.mo.cn/article_216.html</link>
      <pubDate>2009-5-24 0:09:56</pubDate>
      <guid>http://dev.mo.cn/article_216.html</guid>
      <description>
      <![CDATA[一般菜单刷新后，当前的选中状态会失效，本代码用cookie和jquery来解决这个问题，代码如下；<br />其中，jquery仅仅用了他的each方法，以减少代码量，你完全可以把onclick事件要执行的代码分离出来，然后通过其他方式调用，而不是像我这样批量处理<br /><div class="code"><div class="code_title"><span> &nbsp;<img src="images/code.gif" alt="" style="padding:0px;border:0px;" /></span>&nbsp;&nbsp;&nbsp;<a href="javascript:void(0);" onclick="window.clipboardData.setData('Text',this.parentNode.parentNode.childNodes[1].outerText);alert('븴Ƴɹ,Ctrl+VճҪλ!!');">ȫ</a></div><div class="code_content">&lt;!DOCTYPE&nbsp;html&nbsp;PUBLIC&nbsp;"-//W3C//DTD&nbsp;XHTML&nbsp;1.0&nbsp;Transitional//EN"&nbsp;"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;<br />&lt;html&nbsp;xmlns="http://www.w3.org/1999/xhtml"&nbsp;xml:lang="zh-cn"&nbsp;lang="zh-cn"&gt;<br />&nbsp;&lt;head&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;meta&nbsp;http-equiv="Content-Type"&nbsp;content="text/html;&nbsp;charset=gb2312"&nbsp;/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;title&gt;艾恩ASP学习Blog-天下没有免费的午餐,这里有免费的Asp大餐&lt;/title&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;script&nbsp;type="text/javascript"&nbsp;src="jquery.js"&gt;&lt;/script&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;script&nbsp;type="text/javascript"&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$(document).ready(function(){<br />&nbsp;&nbsp;&nbsp;&nbsp;$("#menu&nbsp;&gt;&nbsp;a").each(function(i){<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.onclick=function(){<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cookie.SET("Aien_currentID",this.id,365);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; };<br />&nbsp;&nbsp;&nbsp;&nbsp;});<br />&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;currentID=cookie.GET("Aien_currentID");<br />&nbsp;&nbsp;&nbsp;&nbsp;if(currentID!=null){<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $("#"&nbsp;+&nbsp;currentID).css({"background-color":"#eee","color":"red"});<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />});<br />var&nbsp;cookie={<br />&nbsp;&nbsp;&nbsp;&nbsp;SET&nbsp; &nbsp; &nbsp; &nbsp; :&nbsp;function(name,&nbsp;value,&nbsp;days)&nbsp;{var&nbsp;expires&nbsp;=&nbsp;"";if&nbsp;(days)&nbsp;{var&nbsp;d&nbsp;=&nbsp;new&nbsp;Date();d.setTime(d.getTime()&nbsp;+&nbsp;days&nbsp;*&nbsp;24&nbsp;*&nbsp;60&nbsp;*&nbsp;60&nbsp;*&nbsp;1000);expires&nbsp;=&nbsp;";&nbsp;expires="&nbsp;+&nbsp;d.toGMTString();}document.cookie&nbsp;=&nbsp;name&nbsp;+&nbsp;"="&nbsp;+&nbsp;value&nbsp;+&nbsp;expires&nbsp;+&nbsp;";&nbsp;path=/";},<br />&nbsp; &nbsp; &nbsp; &nbsp; GET&nbsp; &nbsp; &nbsp; &nbsp; :&nbsp;function&nbsp;(name)&nbsp;{var&nbsp;re&nbsp;=&nbsp;new&nbsp;RegExp("(\;|^)[^;]*("&nbsp;+&nbsp;name&nbsp;+&nbsp;")\=([^;]*)(;|$)");var&nbsp;res&nbsp;=&nbsp;re.exec(document.cookie);return&nbsp;res&nbsp;!=&nbsp;null&nbsp;?&nbsp;res[3]&nbsp;:&nbsp;null;}<br />};<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;/script&gt;<br />&nbsp;&lt;/head&gt;<br /><br />&nbsp;&lt;body&gt;<br />&nbsp;&lt;div&nbsp;id="container"&gt;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;div&nbsp;id="menu"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;a&nbsp;href="index.html"&nbsp;id="m1"&gt;首页&lt;/a&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;a&nbsp;href="index.html"&nbsp;id="m2"&gt;心情日志&lt;/a&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;a&nbsp;href="index.html"&nbsp;id="m3"&gt;程序随笔&lt;/a&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;a&nbsp;href="index.html"&nbsp;id="m4"&gt;资源分享&lt;/a&gt;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;a&nbsp;href="index.html"&nbsp;id="m5"&gt;艾恩作品&lt;/a&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;a&nbsp;href="index.html"&nbsp;id="m6"&gt;留言簿&lt;/a&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/div&gt;<br />&lt;/div&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;</div></div><br /><a href="http://dev.mo.cn/upfiles/20090524000456847.rar" target="new">下载源码</a>]]>
      </description>
      <category>JavaScript/DOM</category>
   </item>
   <item>
      <title>如何通过使用XMLHTTP发送二进制流</title>
      <author>zhanghuiguoanlige@126.com</author>
      <link>http://dev.mo.cn/article_205.html</link>
      <pubDate>2009-4-10 11:19:23</pubDate>
      <guid>http://dev.mo.cn/article_205.html</guid>
      <description>
      <![CDATA[&nbsp;&nbsp;&nbsp;<span style="color:#FF0000;">本文章摘自&nbsp;"Microsoft帮助和支持"中心</span>，由于没有测试环境，未对下面代码进行测试<br />&nbsp;&nbsp;&nbsp;有些情况下，您可能需要向服务器发送二进制数据流。要这样做，一种方法是使用IXMLHTTPRequest&nbsp;对象。本文说明如何从服务器中检索&nbsp;ADO&nbsp;记录集，修改它，然后将它作为二进制数据流发送回服务器。&nbsp;<br />&nbsp;&nbsp;本例使用ADODB.Stream&nbsp;对象来保存将发送回服务器的二进制数据。&nbsp;如果已经以并列模式安装了更高版本的&nbsp;MSXML，要使用该特定版本运行示例代码，必须明确使用该版本的&nbsp;GUID&nbsp;或&nbsp;ProgID。例如，MSXML&nbsp;第&nbsp;4&nbsp;版仅在并列模式下安装。请参考以下&nbsp;Microsoft&nbsp;知识库文章，了解使用&nbsp;MSXML&nbsp;4.0&nbsp;分析器运行示例代码需要更改哪些代码：Q305019&nbsp;INFO:MSXML&nbsp;4.0&nbsp;Specific&nbsp;GUIDs&nbsp;and&nbsp;ProgIds（MSXML&nbsp;4.0&nbsp;特定的&nbsp;GUID&nbsp;和&nbsp;ProgId）。<br /><br />例如，在以下代码中，您将用&nbsp;MSXML&nbsp;4.0&nbsp;和下面的语句创建对象：&nbsp;<br />var&nbsp;xmlhttp&nbsp;=&nbsp;new&nbsp;ActiveXObject("Msxml2.XMLHTTP.4.0");<br />xmldoc&nbsp;=&nbsp;new&nbsp;ActiveXObject("Msxml2.DOMDocument.4.0");<br />var&nbsp;xmlhttp&nbsp;=&nbsp;new&nbsp;ActiveXObject("Msxml2.XMLHTTP.4.0");<br />要用&nbsp;XMLHTTP&nbsp;向服务器发送二进制数据流，请遵循以下步骤：&nbsp;<br />1.将下面的代码粘贴到默认&nbsp;Web&nbsp;文件夹中的某个文件中并将该文件命名为&nbsp;Receiver.asp。<br /><div class="code"><div class="code_title"><span> &nbsp;<img src="images/code.gif" alt="" style="padding:0px;border:0px;" /></span>&nbsp;&nbsp;&nbsp;<a href="javascript:void(0);" onclick="window.clipboardData.setData('Text',this.parentNode.parentNode.childNodes[1].outerText);alert('븴Ƴɹ,Ctrl+VճҪλ!!');">ȫ</a></div><div class="code_content">&lt;%<br />dim&nbsp;Connection<br />dim&nbsp;rs<br />Connection&nbsp;=&nbsp;"Provider=SQLOLEDB.1;Data&nbsp;Source=servername;User&nbsp;Id=username;Password=password;Initial&nbsp;Catalog=Northwind;"<br />sql&nbsp;=&nbsp;&nbsp;"Select&nbsp;*&nbsp;from&nbsp;Customers"<br /><br /><br />set&nbsp;rs&nbsp;=&nbsp;server.CreateObject("ADODB.Recordset")<br /><br />if&nbsp;Request.QueryString("getRecordset")&nbsp;=&nbsp;"YES"&nbsp;then<br />&nbsp; &nbsp; &nbsp; &nbsp; rs.ActiveConnection&nbsp;=&nbsp;Connection<br />&nbsp; &nbsp; &nbsp; &nbsp; rs.CursorLocation&nbsp;=&nbsp;3&nbsp;'Client&nbsp;Side<br />&nbsp; &nbsp; &nbsp; &nbsp; rs.CursorType&nbsp;=&nbsp;3&nbsp;'Static&nbsp;Recordset<br />&nbsp; &nbsp; &nbsp; &nbsp; rs.LockType&nbsp;=&nbsp;4&nbsp;'Batch&nbsp;Optimistic<br />&nbsp; &nbsp; &nbsp; &nbsp; rs.Open&nbsp;sql<br />&nbsp; &nbsp; &nbsp; &nbsp; rs.Save&nbsp;response,&nbsp;1&nbsp;'persist&nbsp;adPersistXML<br />&nbsp; &nbsp; &nbsp; &nbsp; Response.End<br />else<br />&nbsp; &nbsp; &nbsp; &nbsp; rs.open&nbsp;Request&nbsp;'.BinaryRead(Request.TotalBytes)<br />&nbsp; &nbsp; &nbsp; &nbsp; rs.activeconnection&nbsp;=&nbsp;Connection&nbsp;'Reconnect<br />&nbsp; &nbsp; &nbsp; &nbsp; rs.updatebatch&nbsp;'Update&nbsp;adAffectAll<br />&nbsp; &nbsp; &nbsp; &nbsp; rs.close<br />&nbsp; &nbsp; &nbsp; &nbsp; Response.Write&nbsp;"Recordset&nbsp;Saved"&nbsp;'Send&nbsp;back&nbsp;response<br />&nbsp; &nbsp; &nbsp; &nbsp; Response.End<br />end&nbsp;if<br /><br />%&gt;</div></div><br /><br />2.将下面的代码粘贴到默认&nbsp;Web&nbsp;文件夹中的某个文件中并将该文件命名为&nbsp;Sender.asp<br /><br /><div class="code"><div class="code_title"><span> &nbsp;<img src="images/code.gif" alt="" style="padding:0px;border:0px;" /></span>&nbsp;&nbsp;&nbsp;<a href="javascript:void(0);" onclick="window.clipboardData.setData('Text',this.parentNode.parentNode.childNodes[1].outerText);alert('븴Ƴɹ,Ctrl+VճҪλ!!');">ȫ</a></div><div class="code_content">&lt;SCRIPT&nbsp;ID=clientEventHandlersJS&nbsp;LANGUAGE=javascript&gt;<br />&lt;!--<br /><br />var&nbsp;rs;<br />var&nbsp;xmldoc;&nbsp;<br />var&nbsp;xmlstream;<br /><br />function&nbsp;SendRS_onclick()&nbsp;{<br />&nbsp; &nbsp; &nbsp; &nbsp; xmlstream&nbsp;=&nbsp;new&nbsp;ActiveXObject("ADODB.Stream");<br />&nbsp; &nbsp; &nbsp; &nbsp; xmlstream.Mode&nbsp;=&nbsp;3;&nbsp;//read&nbsp;write<br />&nbsp; &nbsp; &nbsp; &nbsp; xmlstream.Open();<br />&nbsp; &nbsp; &nbsp; &nbsp; xmlstream.Type&nbsp;=&nbsp;1;&nbsp;//&nbsp;adTypeBinary<br />&nbsp; &nbsp; &nbsp; &nbsp; rs.Save(xmlstream,0);&nbsp;//adpersistadtg<br />&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; var&nbsp;xmlhttp&nbsp;=&nbsp;new&nbsp;ActiveXObject("Msxml2.XMLHTTP");<br />&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; xmlhttp.Open("POST","http://localhost/Receiver.asp?getRecordset=NO",false);<br />&nbsp; &nbsp; &nbsp; &nbsp; xmlhttp.setRequestHeader("Content-Length",xmlstream.Size);&nbsp;//set&nbsp;the&nbsp;length&nbsp;of&nbsp;the&nbsp;content<br />&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; xmlhttp.send(xmlstream.Read(xmlstream.Size));&nbsp;//Send&nbsp;the&nbsp;stream<br />&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; alert(xmlhttp.responseText);<br />}<br /><br />function&nbsp;getRS_onclick()&nbsp;{<br />&nbsp; &nbsp; &nbsp; &nbsp; rs&nbsp;=&nbsp;new&nbsp;ActiveXObject("ADODB.Recordset");<br />&nbsp; &nbsp; &nbsp; &nbsp; xmldoc&nbsp;=&nbsp;new&nbsp;ActiveXObject("Msxml2.DOMDocument");<br />&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; var&nbsp;xmlhttp&nbsp;=&nbsp;new&nbsp;ActiveXObject("Msxml2.XMLHTTP");<br />&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; xmlhttp.Open("Get","http://localhost/Receiver.asp?getRecordset=YES",false);<br />&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; xmlhttp.send();<br />&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; xmldoc.loadXML(xmlhttp.responseText);&nbsp;//load&nbsp;the&nbsp;returned&nbsp;stream&nbsp;into&nbsp;the&nbsp;dom&nbsp;document<br />&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; rs.Open(xmldoc);&nbsp;//load&nbsp;the&nbsp;dom&nbsp;document&nbsp;into&nbsp;the&nbsp;recordset<br />&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; alert("Recordset&nbsp;Loaded");<br />}<br /><br />function&nbsp;Update_onclick()&nbsp;{<br />&nbsp; &nbsp; &nbsp; &nbsp; alert("before:&nbsp;"&nbsp;+&nbsp;rs.Fields(2).Value);<br />&nbsp; &nbsp; &nbsp; &nbsp; rs.Fields(2).Value&nbsp;=&nbsp;rs.Fields(2).Value&nbsp;+&nbsp;"!";<br />&nbsp; &nbsp; &nbsp; &nbsp; rs.Update();<br />&nbsp; &nbsp; &nbsp; &nbsp; alert("after:&nbsp;"&nbsp;+&nbsp;rs.Fields(2).Value);<br />}<br /><br />//--&gt;<br />&lt;/SCRIPT&gt;<br />&lt;INPUT&nbsp;type="button"&nbsp;value="Get&nbsp;Recordset"&nbsp;id=getRS&nbsp;name=getRS&nbsp;LANGUAGE=javascript&nbsp;onclick="return&nbsp;getRS_onclick()"&gt;<br />&lt;INPUT&nbsp;type="button"&nbsp;value="Update"&nbsp;id=Update&nbsp;name=Update&nbsp;LANGUAGE=javascript&nbsp;onclick="return&nbsp;Update_onclick()"&gt;<br />&lt;INPUT&nbsp;type="button"&nbsp;value="Send&nbsp;Recordset"&nbsp;id=SendRS&nbsp;name=SendRS&nbsp;LANGUAGE=javascript&nbsp;onclick="return&nbsp;SendRS_onclick()"&gt;</div></div><br /><br />3.修改&nbsp;Receiver.asp&nbsp;页，使连接变量包含&nbsp;Microsoft&nbsp;SQL&nbsp;Server&nbsp;名称和有效的&nbsp;SQL&nbsp;用户&nbsp;ID&nbsp;和密码。<br />4.启动&nbsp;Microsoft&nbsp;Internet&nbsp;Explorer，然后浏览到&nbsp;http://localhost/sender.asp。<br />5.单击Get&nbsp;Recordset（获得记录集）。出现一个消息框，告诉您记录集已成功加载。<br />6.单击Update（更新）。出现一个消息框，显示更新前的值。出现第二个消息框，显示更新后的值。<br />7.单击Send&nbsp;Recordset（发送记录集）。出现一个消息框，告诉您记录集已更新。<br /><br />虽然这使您可以使用持久的机制向客户端来回传递数据，但在&nbsp;SQL&nbsp;Server&nbsp;2000&nbsp;中，建议您使用&nbsp;UpdateGrams&nbsp;或OpenXML&nbsp;来传递和发送&nbsp;XML&nbsp;格式的记录集数据。<br />成形记录集&nbsp;(Shaped&nbsp;Recordset)&nbsp;中有些限制。编辑过的成形记录集不能以&nbsp;XML&nbsp;格式保持。另外，参数化的成形命令根本不可能保持。有关保持和限制的其他相关信息，请参见下面的&nbsp;Microsoft&nbsp;Developer&nbsp;Network&nbsp;(MSDN)&nbsp;Web&nbsp;站点：<br />XML&nbsp;Persistence&nbsp;Format（XML&nbsp;持久格式）<br /><a href="http://msdn.microsoft.com/library/psdk/dasdk/xmli3vsk.htm" target="new">http://msdn.microsoft.com/library/psdk/dasdk/xmli3vsk.htm</a>]]>
      </description>
      <category>JavaScript/DOM</category>
   </item>
   <item>
      <title>XML技术上传文件</title>
      <author>zhanghuiguoanlige@126.com</author>
      <link>http://dev.mo.cn/article_204.html</link>
      <pubDate>2009-4-10 11:14:16</pubDate>
      <guid>http://dev.mo.cn/article_204.html</guid>
      <description>
      <![CDATA[&nbsp;&nbsp;为了在HTML网页中获得上传功能，在客户端我们可以使用如下格式的FORM：<br /><br />&lt;&nbsp;FORM&nbsp;NAME="myForm"&nbsp;ACTION="TargetURL.asp"&nbsp;ENCTYPE="multipart/form-data"METHOD="post"&nbsp;&gt;<br />&lt;&nbsp;INPUT&nbsp;TYPE="file"&nbsp;NAME="myFile"&nbsp;&gt;<br />&lt;&nbsp;INPUT&nbsp;TYPE="submit"&nbsp;VALUE="Upload&nbsp;File"&nbsp;&gt;<br />&lt;&nbsp;/FORM&nbsp;&gt;<br /><br />　　这种方案在客户端和服务器端的使用都有很多限制。首先，我们必须使用POST方法，因为GET方法无法处理这样的表单数据。并且，没有什么方法可以在不使用表单的情况下引发一个POST动作。把数据发送给表单处理程序后，浏览器将会把处理程序作为新页面加载，然后使用者会看到一个不讨人喜欢的页面转换过程。<br /><br />　　ENCTYPE属性为表单定义了MIME编码方式，上传文件的表单的ENCTYPE属性必须使用“multipart/form-data”。把这个属性设置为“multipart/form-data”就创建了一个与传统结构不同的POST缓冲区（复合结构），ASP的Request对象无法访问这样的表单内容。所以，我们可以使用Request.binaryRead方法来访问这些数据，但是无法使用脚本语言来完成这一切。Request.binaryRead方法返回一个VTarray型数据（只包含无符号一字节字符的Variant型数组）。但是脚本语言只能处理Variant型数据。为了解决这个问题，只能使用专用的ASP上传组件，或者ISAPI扩展程序，比如CPSHOST.DLL。这是设计上的限制。<br /><br />新的上传方案<br /><br />需要按照如下步骤操作。<br />客户端：<br /><br />使用MSXML&nbsp;3.0创建一个XML文档<br />创建一个针对二进制内容的XML节点<br />使用ADO&nbsp;Stream&nbsp;object将上传的文件数据放入该节点<br />使用XMLHTTP对象把这个XML文档发送给Web服务器<br /><br /><br /><br />服务器端：<br /><br />　　从Request对象中读出XML文档读出二进制节点中的数据并且存储到服务器上的文件中。当然，我们也可以将其存储到数据库的BLOB型字段中。<br />　　在解释这段代码之前，我们可以对这个方案进行一些思考。<br /><br />对XML的思考<br /><br />　　XML格式支持很多数据类型，比如numeric,&nbsp;float,&nbsp;character等等。很多作者将XML定义为ASCII格式，但是我们不能忽视，XML技术还可以使用“bin.base64”数据类型来描述二进制信息。这个特性在MS&nbsp;XML3.0解析器重得到完全的支持，但是目前还需要一些特别设置。该对象提供一些可以对二进制数据进行完全控制的属性：<br /><br />　　obj_node.dataType&nbsp;-&nbsp;该可读写的属性定义了特定节点的数据类型。MSXML解析器支持更多的数据类型（参见MSDN：http://msdn.microsoft.com/library/psdk/xmlsdk/xmls3z1v.htm）<br />对于二进制数据，我们可以使用“bin.base64”类型。<br /><br />　　obj_node.nodeTypedValue&nbsp;-&nbsp;该可读写属性包含了按照制定类型表示的指定节点的数据。<br />我们可以创建一个包含多个bin.base64类型节点的XML文档，节点中包含上传的文件。这点特性可以使用一个POST一次上传多个文件。<br /><br />　　我们可以使用XMLHttpRequest对象和POST方法发送一个XML文档给Web服务器。该对象为HTTP服务器提供了客户端协议支持，允许在Web服务器上发送和接受MS&nbsp;XMLDOM对象。XMLHttpRequest是Internet&nbsp;Explorer&nbsp;5内置的COM对象（不需要定制安装），并且发送完毕后无需转换页面。<br /><br /><br />对ADO&nbsp;Stream对象的思考<br /><br />　　我们可以在客户端创建一个包含一个或者多个二进制节点的XML文档。我们还必须把文件内容填入节点中。但是很不幸，脚本语言不能访问本地文件系统，并且Scripting.FileSystem对象（是Win32系统的内置对象）到目前为止还不能访问二进制文件。这是设计上的限制。所以我们需要另外找一个可以提供对本地二进制文件的访问的COM对象。<br /><br />　　ADO&nbsp;Stream对象（MDAC&nbsp;2.5中的组件）提供了读、写和管理二进制流数据的手段。字节流的内容可以是文本，或者二进制数据，并且没有容量上的限制。在ADO&nbsp;2.5中，Microsoft对Stream对象的介绍不属于ADO对象结构的任何一层，所以，我们无需捆绑即可使用该对象。<br /><br />　　本文中使用Stream对象来访问文件内容，再把内容存入XML节点。<br /><br />客户端<br /><br />以下示例代码使用Stream和MSXML对象完成文件上传动作。<br /><br /><div class="code"><div class="code_title"><span> &nbsp;<img src="images/code.gif" alt="" style="padding:0px;border:0px;" /></span>&nbsp;&nbsp;&nbsp;<a href="javascript:void(0);" onclick="window.clipboardData.setData('Text',this.parentNode.parentNode.childNodes[1].outerText);alert('븴Ƴɹ,Ctrl+VճҪλ!!');">ȫ</a></div><div class="code_content">&lt;&nbsp;HTML&nbsp;&gt;<br />&lt;&nbsp;HEAD&nbsp;&gt;&lt;&nbsp;TITLE&nbsp;&gt;File&nbsp;Send&lt;&nbsp;/TITLE&nbsp;&gt;&lt;&nbsp;/HEAD&nbsp;&gt;<br />&lt;&nbsp;BODY&nbsp;&gt;<br />&lt;&nbsp;INPUT&nbsp;id=btn_send&nbsp;name="btn_send"&nbsp;type=button&nbsp;value="FILE&nbsp;SEND"&nbsp;&gt;<br />&lt;&nbsp;DIV&nbsp;id=div_message&nbsp;&gt;Ready<br /><br /><br />&lt;&nbsp;/BODY&nbsp;&gt;<br />&lt;&nbsp;/HTML&nbsp;&gt;<br /><br />&lt;&nbsp;SCRIPT&nbsp;LANGUAGE=JavaScript&nbsp;&gt;<br /><br />//&nbsp;上传函数<br />function&nbsp;btn_send.onclick()<br />{<br />//&nbsp;创建&nbsp;ADO-stream&nbsp;对象<br />var&nbsp;ado_stream&nbsp;=&nbsp;new&nbsp;ActiveXObject("ADODB.Stream");<br /><br />//&nbsp;创建包含默认头信息和根节点的&nbsp;XML文档<br />var&nbsp;xml_dom&nbsp;=&nbsp;new&nbsp;ActiveXObject("MSXML2.DOMDocument");<br />xml_dom.loadXML('&nbsp;');<br />//&nbsp;指定数据类型<br />xml_dom.documentElement.setAttribute("xmlns:dt",&nbsp;"urn:schemas-microsoft-com:datatypes");<br /><br />//&nbsp;创建一个新节点，设置其为二进制数据节点<br />var&nbsp;l_node1&nbsp;=&nbsp;xml_dom.createElement("file1");<br />l_node1.dataType&nbsp;=&nbsp;"bin.base64";<br />//&nbsp;打开Stream对象，读源文件<br />ado_stream.Type&nbsp;=&nbsp;1;&nbsp;//&nbsp;1=adTypeBinary&nbsp;<br />ado_stream.Open();&nbsp;<br />ado_stream.LoadFromFile("c:\\tmp\\myfile.doc");<br />//&nbsp;将文件内容存入XML节点<br />l_node1.nodeTypedValue&nbsp;=&nbsp;ado_stream.Read(-1);&nbsp;//&nbsp;-1=adReadAll<br />ado_stream.Close();<br />xml_dom.documentElement.appendChild(l_node1);<br /><br />//&nbsp;可以创建多个二进制节点，一次上传多个文件<br /><br />//&nbsp;把XML文档发送到Web服务器<br />var&nbsp;xmlhttp&nbsp;=&nbsp;new&nbsp;ActiveXObject("Microsoft.XMLHTTP");<br />xmlhttp.open("POST","./file_recieve.asp",false);<br />xmlhttp.send(xml_dom);<br />//&nbsp;显示服务器返回的信息<br />div_message.innerHTML&nbsp;=&nbsp;xmlhttp.ResponseText;<br />}<br />&lt;&nbsp;/SCRIPT&nbsp;&gt;<br /></div></div><br /><br />服务器端<br /><br />以下代码使用相同的对象提供服务器端的上传处理功能。<br /><br /><div class="code"><div class="code_title"><span> &nbsp;<img src="images/code.gif" alt="" style="padding:0px;border:0px;" /></span>&nbsp;&nbsp;&nbsp;<a href="javascript:void(0);" onclick="window.clipboardData.setData('Text',this.parentNode.parentNode.childNodes[1].outerText);alert('븴Ƴɹ,Ctrl+VճҪλ!!');">ȫ</a></div><div class="code_content"><br />&lt;&nbsp;%@&nbsp;LANGUAGE=VBScript%&nbsp;&gt;<br />&lt;&nbsp;%&nbsp;Option&nbsp;Explicit<br />Response.Expires&nbsp;=&nbsp;0&nbsp;<br /><br />'&nbsp;定义变量和对象。<br />dim&nbsp;ado_stream<br />dim&nbsp;xml_dom<br />dim&nbsp;xml_file1<br /><br />'&nbsp;创建&nbsp;Stream&nbsp;对象<br />set&nbsp;ado_stream&nbsp;=&nbsp;Server.CreateObject("ADODB.Stream")<br />'&nbsp;从Request对象创建&nbsp;XMLDOM对象<br />set&nbsp;xml_dom&nbsp;=&nbsp;Server.CreateObject("MSXML2.DOMDocument")<br />xml_dom.load(request)<br />'&nbsp;读出包含二进制数据的节点<br />set&nbsp;xml_file1&nbsp;=&nbsp;xml_dom.selectSingleNode("root/file1")<br /><br />'&nbsp;打开Stream对象，把数据存入其中&nbsp;<br />ado_stream.Type&nbsp;=&nbsp;1&nbsp;'&nbsp;1=adTypeBinary&nbsp;<br />ado_stream.open&nbsp;<br />ado_stream.Write&nbsp;xml_file1.nodeTypedValue<br />'&nbsp;文件存盘<br />ado_stream.SaveToFile&nbsp;"c:\tmp\upload1.doc",2&nbsp;'&nbsp;2=adSaveCreateOverWrite&nbsp;<br />ado_stream.close<br /><br />'&nbsp;销毁对象&nbsp;<br />set&nbsp;ado_stream&nbsp;=&nbsp;Nothing&nbsp;<br />set&nbsp;xml_dom&nbsp;=&nbsp;Nothing<br />'&nbsp;向浏览器返回信息<br />Response.Write&nbsp;"Upload&nbsp;successful!"<br />%&nbsp;&gt;</div></div><br />也可以使用Stream对象把数据放到数据库的BLOB型字段中。<br /><br />使用该方法的益处<br /><br />不引起页面转换。<br />不需要专用组件。<br />可同时上传多个文件。<br /><br />　　这段程序是纯脚本写成的，可以很容易的插入到其他代码中，而不需要任何HTML对象的配合。还可以把这个逻辑在任何支持COM标准的语言中实现。<br /><br />系统安全考虑<br /><br />　　该方法只能使用于内部网络，因为它需要IE5的安全级别设置为“低”。必须：<br /><br />　　允许脚本和ActiveX对象。该设置允许浏览器执行类似&nbsp;"myobj&nbsp;=&nbsp;new&nbsp;activexobject(...)"的&nbsp;JScript语句；<br /><br />　　必须允许穿越域访问数据源。这个设置允许在客户端使用Stream对象。还必须在服务器和客户端都安装MS&nbsp;XML&nbsp;DOM&nbsp;3.0&nbsp;和MDAC&nbsp;2.5&nbsp;。<br />]]>
      </description>
      <category>JavaScript/DOM</category>
   </item>
   <item>
      <title>鼠标拖动层(可任意绑定DIV标签)（二）</title>
      <author>zhanghuiguoanlige@126.com</author>
      <link>http://dev.mo.cn/article_187.html</link>
      <pubDate>2009-1-28 14:32:52</pubDate>
      <guid>http://dev.mo.cn/article_187.html</guid>
      <description>
      <![CDATA[实现鼠标拖动层的另一种方法<br />调用方法<br /><b><span style="color:#FF0000;">Endrag.bind('MoveDiv').bind('Div1').offSet({x:0,y:0});</span></b><br />通过多次调用bind方法可以绑定任意多个Div标签;<br />offSet设置偏移，默认x偏移和y偏移都为0,供调整使用<br />本方法不能通过子元素绑定操作父元素<br /><br /><div class="code"><div class="code_title"><span> &nbsp;<img src="images/code.gif" alt="" style="padding:0px;border:0px;" /></span>&nbsp;&nbsp;&nbsp;<a href="javascript:void(0);" onclick="window.clipboardData.setData('Text',this.parentNode.parentNode.childNodes[1].outerText);alert('븴Ƴɹ,Ctrl+VճҪλ!!');">ȫ</a></div><div class="code_content">&lt;!DOCTYPE&nbsp;html&nbsp;PUBLIC&nbsp;"-//W3C//DTD&nbsp;XHTML&nbsp;1.0&nbsp;Transitional//EN"&nbsp;"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;&nbsp;<br />&lt;html&nbsp;xmlns="http://www.w3.org/1999/xhtml"&gt;&nbsp;<br />&lt;head&gt;&nbsp;<br />&lt;title&gt;&nbsp;鼠标拖动层(可任意绑定DIV标签)（二）&nbsp;&lt;/title&gt;&nbsp;<br />&lt;script&nbsp;language="javascript"&nbsp;type="text/javascript"&gt;<br />/*<br />鼠标拖动层(可任意绑定DIV标签)（二）<br />作者:Anlige<br />联系方式:1034555083/zhanghuiguoanlige@126.com<br /><br />调用方法:Endrag.bind('MoveDiv').bind('Div1').offSet({x:0,y:0});<br />参数说明:bind的参数为Div标签的ID属性或者Div对象本身；offSet的参数为偏移量，默认(不调用本方法)x,y偏移都为0<br />说明:通过多次调用bind方法绑定多个对象的拖动<br />*/&nbsp;<br />&nbsp;&nbsp;Endrag={<br />&nbsp;&nbsp;&nbsp;&nbsp;x0:0,y0:0,x1:0,y1:0,moveable:false,index:100,NS:(navigator.appName=='Netscape'),offSets:{x:0,y:0},<br />&nbsp;&nbsp;&nbsp;&nbsp;//开始拖动;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;startDrag:function&nbsp;(e){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e&nbsp;=&nbsp;e&nbsp;?&nbsp;e&nbsp;:&nbsp;(window.event&nbsp;?&nbsp;window.event&nbsp;:&nbsp;null);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Endrag.getFocus(this);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(e.button==(Endrag.NS)?0&nbsp;:1)&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!Endrag.NS){this.setCapture()}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Endrag.x0&nbsp;=&nbsp;e.clientX&nbsp;;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Endrag.y0&nbsp;=&nbsp;e.clientY&nbsp;;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Endrag.x1&nbsp;=&nbsp;parseInt(Endrag.abs(this).x);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Endrag.y1&nbsp;=&nbsp;parseInt(Endrag.abs(this).y);&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Endrag.moveable&nbsp;=&nbsp;true;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;},&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//拖动;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;drag:function&nbsp;(e){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e&nbsp;=&nbsp;e&nbsp;?&nbsp;e&nbsp;:&nbsp;(window.event&nbsp;?&nbsp;window.event&nbsp;:&nbsp;null);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(Endrag.moveable){&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.style.left&nbsp;=&nbsp;(Endrag.x1&nbsp;+&nbsp;e.clientX&nbsp;-&nbsp;Endrag.x0&nbsp;-&nbsp;Endrag.offSets.x)&nbsp;+&nbsp;"px";&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.style.top&nbsp;&nbsp;=&nbsp;(Endrag.y1&nbsp;+&nbsp;e.clientY&nbsp;-&nbsp;Endrag.y0&nbsp;-&nbsp;Endrag.offSets.y)&nbsp;+&nbsp;"px";&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;},&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//停止拖动;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;stopDrag:function&nbsp;(e){&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(Endrag.moveable)&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!Endrag.NS){this.releaseCapture();}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Endrag.moveable&nbsp;=&nbsp;false;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;},<br />&nbsp;&nbsp;&nbsp;&nbsp;//获得焦点;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;getFocus:function&nbsp;(obj){&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(obj.style.zIndex!=this.index){&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.index&nbsp;+=&nbsp;2;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;idx&nbsp;=&nbsp;this.index;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;obj.style.zIndex=idx;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;},<br />&nbsp;&nbsp;&nbsp;&nbsp;abs:function&nbsp;(element)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;result&nbsp;=&nbsp;{&nbsp;x:&nbsp;element.offsetLeft,&nbsp;y:&nbsp;element.offsetTop};<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;element&nbsp;=&nbsp;element.offsetParent;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(element)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.x&nbsp;+=&nbsp;element.offsetLeft;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.y&nbsp;+=&nbsp;element.offsetTop;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;element&nbsp;=&nbsp;element.offsetParent;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;result;<br />&nbsp;&nbsp;&nbsp;&nbsp;},&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;offSet:function(setting){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.offSets=setting;<br />&nbsp;&nbsp;&nbsp;&nbsp;},<br />&nbsp;&nbsp;&nbsp;&nbsp;bind:function(obj){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;obj=typeof(obj)=="object"&nbsp;?&nbsp;obj:document.getElementById(obj);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;obj.onmousedown=Endrag.startDrag;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;obj.onmouseup=Endrag.stopDrag;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;obj.onmousemove=Endrag.drag;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;this;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />};<br />&lt;/script&gt;&nbsp;<br />&lt;/head&gt;&nbsp;<br />&lt;body&nbsp;onload="Endrag.bind('MoveDiv').bind('Div1').offSet({x:0,y:0});"&gt;&nbsp;<br />&lt;div&nbsp;id="MoveDiv"&nbsp;style="background:#ffffff;position:absolute;left:200px;top:50px;width:500px;height:200px;border:1px&nbsp;#dddddd&nbsp;solid;"&gt;&nbsp;<br />&lt;div&nbsp;id="hand"&nbsp;style="line-height:25px;text-align:center;background:#f00"&gt;&nbsp;<br />拖动层<br />&lt;/div&gt;&nbsp;<br />调用方法&lt;br&nbsp;/&gt;<br />Endrag.bind('MoveDiv').bind('Div1').offSet({x:0,y:0});&lt;br&nbsp;/&gt;<br />可以绑定任意多个Div标签;&lt;br&nbsp;/&gt;offSet设置偏移，默认x偏移和y偏移都为0,供调整使用&lt;br&nbsp;/&gt;<br />本方法不能通过子元素绑定操作父元素<br />&lt;/div&gt;&nbsp;<br />&lt;div&nbsp;id="Div1"&nbsp;style="background:#ffffff;position:absolute;left:400px;top:300px;width:300px;height:200px;border:1px&nbsp;#dddddd&nbsp;solid;"&gt;&nbsp;<br />&lt;div&nbsp;id="Div2"&nbsp;style="line-height:25px;text-align:center;background:#f00"&gt;&nbsp;<br />拖动层&nbsp;<br />&lt;/div&gt;&nbsp;<br /><br />&lt;/div&gt;&nbsp;<br />&lt;/body&gt;&nbsp;<br />&lt;/html&gt;&nbsp;</div></div>]]>
      </description>
      <category>JavaScript/DOM</category>
   </item>
   <item>
      <title>鼠标拖动层(可任意绑定DIV标签)（一）</title>
      <author>zhanghuiguoanlige@126.com</author>
      <link>http://dev.mo.cn/article_186.html</link>
      <pubDate>2009-1-28 14:23:26</pubDate>
      <guid>http://dev.mo.cn/article_186.html</guid>
      <description>
      <![CDATA[可实现Div层的任意拖动的第一种方法，调用方便<br /><div class="code"><div class="code_title"><span> &nbsp;<img src="images/code.gif" alt="" style="padding:0px;border:0px;" /></span>&nbsp;&nbsp;&nbsp;<a href="javascript:void(0);" onclick="window.clipboardData.setData('Text',this.parentNode.parentNode.childNodes[1].outerText);alert('븴Ƴɹ,Ctrl+VճҪλ!!');">ȫ</a></div><div class="code_content">&lt;!DOCTYPE&nbsp;html&nbsp;PUBLIC&nbsp;"-//W3C//DTD&nbsp;XHTML&nbsp;1.0&nbsp;Transitional//EN"&nbsp;"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;&nbsp;<br />&lt;html&nbsp;xmlns="http://www.w3.org/1999/xhtml"&gt;&nbsp;<br />&lt;head&gt;&nbsp;<br />&lt;title&gt;&nbsp;鼠标拖动层(可任意绑定DIV标签)（一）&nbsp;&lt;/title&gt;&nbsp;<br />&lt;script&nbsp;language="javascript"&nbsp;type="text/javascript"&gt;&nbsp;<br />/*<br />鼠标拖动层(可任意绑定DIV标签)（一）<br />作者:Anlige<br />联系方式:1034555083/zhanghuiguoanlige@126.com<br /><br />调用方法:var&nbsp;myDrag=new&nbsp;Endrag(source,target,offSetX,&nbsp;offSetY);<br />参数说明:source--鼠标动作绑定对象;target--操作目标对象(要移动的对象);offSetX--横坐标偏移;offSetY--纵坐标偏移<br />说明:通过多次调用本方法绑定多个对象的拖动<br />*/<br />&nbsp;funs={<br />&nbsp;&nbsp;&nbsp;&nbsp;index:100,&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;getFocus:function&nbsp;(target){&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(target.style.zIndex!=this.index){&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.index&nbsp;+=&nbsp;2;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;idx&nbsp;=&nbsp;this.index;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;target.style.zIndex=idx;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;},<br />&nbsp;&nbsp;&nbsp;&nbsp;abs:function&nbsp;(element)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;result&nbsp;=&nbsp;{&nbsp;x:&nbsp;element.offsetLeft,&nbsp;y:&nbsp;element.offsetTop};<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;element&nbsp;=&nbsp;element.offsetParent;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(element)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.x&nbsp;+=&nbsp;element.offsetLeft;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.y&nbsp;+=&nbsp;element.offsetTop;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;element&nbsp;=&nbsp;element.offsetParent;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;result;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;};<br />&nbsp;<br />&nbsp;function&nbsp;Endrag(source,target,offSetX,&nbsp;offSetY){<br />&nbsp;&nbsp;&nbsp;&nbsp;source=typeof(source)=="object"&nbsp;?&nbsp;source:document.getElementById(source);<br />&nbsp;&nbsp;&nbsp;&nbsp;target=typeof(target)=="object"&nbsp;?&nbsp;target:document.getElementById(target);<br />&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;x0=0,y0=0,x1=0,y1=0,moveable=false,index=100,NS=(navigator.appName=='Netscape');<br />&nbsp;&nbsp;&nbsp;&nbsp;offSetX=typeof&nbsp;offSetX==&nbsp;"undefined"&nbsp;?&nbsp;0:offSetX;<br />&nbsp;&nbsp;&nbsp;&nbsp;offSetY=typeof&nbsp;offSetY==&nbsp;"undefined"&nbsp;?&nbsp;0:offSetY;<br />&nbsp;&nbsp;&nbsp;&nbsp;source.onmousedown=function(e){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e&nbsp;=&nbsp;e&nbsp;?&nbsp;e&nbsp;:&nbsp;(window.event&nbsp;?&nbsp;window.event&nbsp;:&nbsp;null);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;funs.getFocus(target);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(e.button==(NS)?0&nbsp;:1)&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!NS){this.setCapture()}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x0&nbsp;=&nbsp;e.clientX&nbsp;;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y0&nbsp;=&nbsp;e.clientY&nbsp;;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x1&nbsp;=&nbsp;parseInt(funs.abs(target).x);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y1&nbsp;=&nbsp;parseInt(funs.abs(target).y);&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;moveable&nbsp;=&nbsp;true;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;};&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//拖动;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;source.onmousemove=function(e){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e&nbsp;=&nbsp;e&nbsp;?&nbsp;e&nbsp;:&nbsp;(window.event&nbsp;?&nbsp;window.event&nbsp;:&nbsp;null);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(moveable){&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;target.style.left&nbsp;=&nbsp;(x1&nbsp;+&nbsp;e.clientX&nbsp;-&nbsp;x0&nbsp;-&nbsp;offSetX)&nbsp;+&nbsp;"px";&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;target.style.top&nbsp;&nbsp;=&nbsp;(y1&nbsp;+&nbsp;e.clientY&nbsp;-&nbsp;y0&nbsp;-&nbsp;offSetY)&nbsp;+&nbsp;"px";&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;};&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//停止拖动;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;source.onmouseup=function&nbsp;(e){&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(moveable)&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!NS){this.releaseCapture();}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;moveable&nbsp;=&nbsp;false;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;};<br />}<br />&lt;/script&gt;&nbsp;<br />&lt;/head&gt;&nbsp;<br />&lt;body&nbsp;onload="var&nbsp;i=new&nbsp;Endrag('hand','MoveDiv',0,0);var&nbsp;j=new&nbsp;Endrag('Div1','Div1',0,0);"&gt;&nbsp;<br />&lt;div&nbsp;id="MoveDiv"&nbsp;style="position:absolute;left:200px;top:50px;width:400px;height:200px;border:1px&nbsp;#dddddd&nbsp;solid;"&gt;&nbsp;<br />&lt;div&nbsp;id="hand"&nbsp;style="line-height:25px;text-align:center;background:#f00"&gt;&nbsp;<br />这个用子标签操作父标签&nbsp;<br />&lt;/div&gt;&nbsp;<br />调用方法&lt;br&nbsp;/&gt;var&nbsp;i=new&nbsp;Endrag('hand','MoveDiv',0,0);&lt;br&nbsp;/&gt;<br />第一个参数为源标签对象或对象id属性；第二个参数为要移动的目标对象或对象id属性；第3、4个参数为偏移值，供最后调整用;&lt;br&nbsp;/&gt;<br />鼠标指针在红色区域才有效<br />&lt;/div&gt;&nbsp;<br />&lt;div&nbsp;id="Div1"&nbsp;style="background:#ffffff;position:absolute;left:400px;top:300px;width:300px;height:200px;border:1px&nbsp;#dddddd&nbsp;solid;"&gt;&nbsp;<br />&lt;div&nbsp;id="Div2"&nbsp;style="line-height:25px;text-align:center;background:#f00"&gt;&nbsp;<br />这个用自标签操作自己&nbsp;<br />&lt;/div&gt;&nbsp;<br />调用方法&lt;br&nbsp;/&gt;var&nbsp;j=new&nbsp;Endrag('Div1','Div1',0,0);&lt;br&nbsp;/&gt;<br />第一个参数为源标签对象或对象id属性；第二个参数为要移动的目标对象或对象id属性；第3、4个参数为偏移值，供最后调整用；&lt;br&nbsp;/&gt;<br />鼠标指针在Div1标签内就有效<br />&lt;/div&gt;&nbsp;<br />&lt;/body&gt;&nbsp;<br />&lt;/html&gt;&nbsp;</div></div>]]>
      </description>
      <category>JavaScript/DOM</category>
   </item>
   <item>
      <title>jQuery入门指南</title>
      <author>zhanghuiguoanlige@126.com</author>
      <link>http://dev.mo.cn/article_177.html</link>
      <pubDate>2009-1-4 9:34:36</pubDate>
      <guid>http://dev.mo.cn/article_177.html</guid>
      <description>
      <![CDATA[这个指南是一个对jQuery库的说明，要求读者了解DOM的一些常识。它包括了一个简单的Hello&nbsp;World的例子，选择器和事件基础，AJAX、FX的用法，以及如何制作jQuery的插件。<br /><br />这个指南包括了很多代码，你可以copy它们，并试着修改它们，看看产生的效果。<br /><br />一.安装<br />一开始,我们需求一个jQuery的库,最新的下载可以到<a href="http://jquery.com/" target="new">这里</a>找到。<br />这个指南提供一个基本包含实例的包供下载.<br /><br /><a href="http://jquery.bassistance.de/jquery-starterkit.zip" target="new">下载:&nbsp;jquery-starterkit</a><br /><br />(译者Keel注:一定要下载这个包，光看文章不实践肯定是不行的。)<br /><br />下载后解压缩，然后用你最喜欢的文本编辑器打开starterkit.html和custom.js这两个文件。<br />(译者Keel注:这两个就是例子文件,所有的例子都用这两个例子作出,custom.js写jQuery代码,starterkit.html观察效果.建议用editPlus打开)<br /><br /><br />现在,我们就已经做好了一切准备来进行这个著名的"Hello&nbsp;world"例子.<br /><br />二.Hello&nbsp;jQuery在做所有事情之前,我们要让jQuery读取和处理文档的DOM,必须尽可能快地在DOM载入后开始执行事件,所以,我们用一个ready事件作为处理HTML文档的开始.看看我们打开的custom.js这个文件,里面已经准备好了:<br /><div class="quote">$(document).ready(function()&nbsp;{<br />//&nbsp;do&nbsp;stuff&nbsp;when&nbsp;DOM&nbsp;is&nbsp;ready//当文档载入后从此处开始执行代码<br />});&nbsp;</div>下面我们放一个简单的alert事件在一个function中,因为这个alert不需求等DOM完成载入,所以我们把任务稍稍变复杂一点:在点击任何一个链接时显示一个alert.<br /><div class="quote">$(document).ready(function()&nbsp;{<br />$("a").click(function()&nbsp;{<br />alert("Hello&nbsp;world!");<br />});<br />});</div><br />这样在你点击页面的一个链接时都会触发这个"Hello&nbsp;world"的提示。<br />(译者Keel注:请照此代码修改custom.js并保存,然后用浏览器打开starterkit.html观察效果。)<br /><br />让我们看一下这些修改是什么含义。$("a")&nbsp;是一个jQuery选择器(selector),在这里，它选择所有的a标签（译者Keel注：即&lt;a&gt;&lt;/a&gt;），$号是&nbsp;jQuery&nbsp;“类”(jQuery&nbsp;"class")的一个别称，因此$()构造了一个新的jQuery&nbsp;对象(jQuery&nbsp;object)。函数&nbsp;click()&nbsp;是这个jQuery对象的一个方法，它绑定了一个单击事件到所有选中的标签(这里是所有的a标签),并在事件触发时执行了它所提供的alert方法.<br />这里有一个拟行相似功能的代码:<br /><div class="quote">&lt;a&nbsp;href="#"&nbsp;onclick="alert('Hello&nbsp;world')"&gt;Link&lt;/a&gt;</div><br />不同之处很明显,用jQuery不需要在每个a标签上写onclick事件,所以我们拥有了一个整洁的结构文档(HTML)和一个行为文档(JS),达到了将结构与行为分开的目的,就像我们使用CSS追求的一样.<br /><br />下面我们会更多地了解到选择器与事件.<br /><br /><br />三.Find&nbsp;me:使用选择器和事件<br />jQuery提供两种方式来选择html的elements，第一种是用CSS和Xpath选择器联合起来形成一个字符串来传送到jQuery的构造器（如：$("div&nbsp;&gt;&nbsp;ul&nbsp;a")）；第二种是用jQuery对象的几个methods(方法)。这两种方式还可以联合起来混合使用。<br /><br />为了测试一下这些选择器，我们来试着在我们starterkit.html中选择并修改第一个ordered&nbsp;list.<br /><br />一开始，我们需要选择这个list本身，这个list有一个ID叫“orderedlist”，通常的javascript写法是document.getElementById("orderedlist").在jQuery中，我们这样做：<br /><div class="quote">$(document).ready(function()&nbsp;{<br />$("#orderedlist").addClass("red");<br />});</div><br />这里将starterkit中的一个CSS样式red附加到了orderedlist上(译者Keel注：参考测试包中的css目录下的core.css，其中定义了red样式)。因此，在你刷新了starterkit.html后，你将会看到第一个有序列表(ordered&nbsp;list&nbsp;)背景色变成了红色，而第二个有序列表没有变化.<br /><br />现在，让我们添加一些新的样式到list的子节点.<br /><div class="quote">$(document).ready(function()&nbsp;{<br />$("#orderedlist&nbsp;&gt;<br />li").addClass("blue");<br />});</div><br />这样，所有orderedlist中的li都附加了样式blue。<br /><br />现在我们再做个复杂一点的，当把鼠标放在li对象上面和移开时进行样式切换，但只在list的最后一个element上生效。<br /><div class="quote">$(document).ready(function()&nbsp;{<br />$("#orderedlist<br />li:last").hover(function()&nbsp;{<br />$(this).addClass("green");<br />},&nbsp;function()&nbsp;{<br />$(this).removeClass("green");<br />});<br />});</div><br />还有大量的类似的CSS和XPath例子，更多的例子和列表可以在这里找到。<br />（译者Keel注：入门看此文，修行在个人，要想在入门之后懂更多，所以这段话的几个链接迟早是要必看的！不会又要翻译吧...^_^!）<br /><br />每一个onXXX事件都有效，如onclick,onchange,onsubmit等，都有jQuery等价表示方法（译者Keel注：jQuery不喜欢onXXX，所以都改成了XXX，去掉了on）。其他的一些事件，如ready和hover,也提供了相应的方法。<br /><br />你可以在Visual&nbsp;jQuery找到全部的事件列表，在Events栏目下。<br /><br />用这些选择器和事件你已经可以做很多的事情了，但这里有一个更强的好东东！<br /><div class="quote">$(document).ready(function()&nbsp;{<br />$("#orderedlist").find("li").each(function(i)&nbsp;{<br />$(this).html(<br />$(this).html()&nbsp;+&nbsp;"&nbsp;BAM!&nbsp;"&nbsp;+&nbsp;i&nbsp;);<br />});<br />});&nbsp;</div><br /><br />find()&nbsp;让你在已经选择的element中作条件查找,因此&nbsp;$("#orderedlist).find("li")&nbsp;就像&nbsp;$("#orderedlist&nbsp;li").&nbsp;each()一样迭代了所有的li，并可以在此基础上作更多的处理。&nbsp;大部分的方法,如addClass(),&nbsp;都可以用它们自己的&nbsp;each()&nbsp;。在这个例子中,&nbsp;html()用来获取每个li的html文本,&nbsp;追加一些文字，并将之设置为li的html文本。（译者Keel注：从这个例子可以看到.html()方法是获取对象的html代码，而.html('xxx')是设置'xxx'为对象的html代码）&nbsp;<br /><br />另一个经常碰到的任务是在没有被jQuery覆盖的DOM元素上call一些方法，想像一个在你用AJAX方式成功提交后的reset：<br /><div class="quote">$(document).ready(function()&nbsp;{<br />//&nbsp;use&nbsp;this&nbsp;to&nbsp;reset&nbsp;a<br />single&nbsp;form<br />$("#reset").click(function()&nbsp;{<br />$("#form")[0].reset();<br />});<br />});</div><br />（译者Keel注：这里作者将form的id也写成了form，源文件有&lt;form&nbsp;id="form"&gt;，这是非常不好的写法，你可以将这个ID改成form1或者testForm，然后用$("#form1")或者$("#testForm")来表示它，再进行测试。）<br /><br />这个代码选择了所有ID为"form"的元素，并在其第一个上call了一个reset()。如果你有一个以上的form，你可以这样做：<br /><div class="quote">$(document).ready(function()&nbsp;{<br />//&nbsp;use&nbsp;this&nbsp;to&nbsp;reset<br />several&nbsp;forms&nbsp;at&nbsp;once<br />$("#reset").click(function()&nbsp;{<br />$("form").each(function()&nbsp;{<br />this.reset();<br />});<br />});<br />});</div><br />（译者Keel注：请注意一定要亲自将这些代码写在custom.js中并在starterkit.html上测试效果才能有所体会！必要时要观察starterkit.html的html代码）<br /><br />这样你在点击Reset链接后，就选择了文档中所有的form元素，并对它们都执行了一次reset()。<br /><br />还有一个你可能要面对的问题是不希望某些特定的元素被选择。jQuery&nbsp;提供了filter()&nbsp;和not()&nbsp;方法来解决这个问题。&nbsp;filter()以过滤表达式来减少不符合的被选择项,&nbsp;not()则用来取消所有符合过滤表达式的被选择项.&nbsp;考虑一个无序的list，你想要选择所有的没有ul子元素的li元素。<br /><div class="quote">$(document).ready(function()&nbsp;{<br />$("li").not("[ul]").css("border",&nbsp;"1px&nbsp;solid&nbsp;black");<br />});&nbsp;</div><br />这个代码选择了所有的li元素，然后去除了没有ul子元素的li元素。刷新浏览器后，所有的li元素都有了一个边框，只有ul子元素的那个li元素例外。<br /><br />（译者Keel注：请注意体会方便之极的css()方法，并再次提醒请务必实际测试观察效果，比方说换个CSS样式呢？再加一个CSS样式呢？像这样：$("li").not("[ul]").css("border",&nbsp;"1px&nbsp;solid&nbsp;black").css("color","red");）<br /><br />上面代码中的[expression]&nbsp;语法是从XPath而来，可以在子元素和属性(elements&nbsp;and&nbsp;attributes)上用作过滤器，比如你可能想选择所有的带有name属性的链接：<br />$(document).ready(function()&nbsp;{<br />$("a[@name]").background("#eee");<br />});&nbsp;<div class="quote"></div><br /><br />这个代码给所有带有name属性的链接加了一个背景色。（译者Keel注：这个颜色太不明显了，建议写成$("a[@name]").background("red");）<br /><br />更常见的情况是以name来选择链接，你可能需要选择一个有特点href属性的链接，这在不同的浏览器下对href的理解可能会不一致，所以我们的部分匹配("*=")的方式来代替完全匹配("=")：<br /><div class="quote">$(document).ready(function()&nbsp;{<br />$("a[@href*=/content/gallery]").click(function()&nbsp;{<br />//&nbsp;do&nbsp;something&nbsp;with<br />all&nbsp;links&nbsp;that&nbsp;point&nbsp;somewhere&nbsp;to&nbsp;/content/gallery<br />});<br />});</div><br /><br />到现在为止，选择器都用来选择子元素或者是过滤元素。另外还有一种情况是选择上一个或者下一个元素，比如一个FAQ的页面，答案首先会隐藏，当问题点击时，答案显示出来，jQuery代码如下：<br /><br /><div class="quote">$(document).ready(function()&nbsp;{<br />$('#faq').find('dd').hide().end().find('dt').click(function()&nbsp;{<br />var<br />answer&nbsp;=&nbsp;$(this).next();<br />if&nbsp;(answer.is(':visible'))&nbsp;{<br />answer.slideUp();<br />}&nbsp;else&nbsp;{<br />answer.slideDown();<br />}<br />});<br />});</div><br />这里我们用了一些链式表达法来减少代码量，而且看上去更直观更容易理解。像'#faq'&nbsp;只选择了一次，利用end()方法，第一次find()方法会结束(undone)，所以我们可以接着在后面继续find('dt')，而不需要再写$('#faq').find('dt')。<br /><br />在点击事件中的，我们用&nbsp;$(this).next()&nbsp;来找到dt下面紧接的一个dd元素，这让我们可以快速地选择在被点击问题下面的答案。<br />（译者Keel注：这个例子真是太酷了，FAQ中的答案可以收缩！从利用next()的思路到实现这些效果都有很多地方需要我们消化，注意&nbsp;if&nbsp;(answer.is(':visible'))用法，注意answer.slideUp();不懂的地方赶紧查我在最开始提到的两个必看API文档）<br /><br />除了选择同级别的元素外，你也可以选择父级的元素。可能你想在用户鼠标移到文章某段的某个链接时，它的父级元素--也就是文章的这一段突出显示，试试这个：<br /><br /><div class="quote">$(document).ready(function()&nbsp;{<br />$("a").hover(function()&nbsp;{<br />$(this).parents("p").addClass("highlight");<br />},&nbsp;function()&nbsp;{<br />$(this).parents("p").removeClass("highlight");<br />});<br />});</div><br /><br />测试效果可以看到，移到文章某段的链接时，它所在的段全用上highlight样式，移走之后又恢复原样。<br />（译者Keel注：highlight是core.css中定义的样式，你也可以改变它，注意这里有第二个function()这是hover方法的特点，请在API文档中查阅hover，上面也有例子说明）<br /><br />在我们继续之前我们先来看看这一步：&nbsp;jQuery会让代码变得更短从而更容易理解和维护，下面是$(document).ready(callback)的缩写法：<br /><div class="quote">$(function()&nbsp;{<br />//&nbsp;code&nbsp;to&nbsp;execute&nbsp;when&nbsp;the&nbsp;DOM&nbsp;is&nbsp;ready<br />});&nbsp;</div><br /><br />应用到我们的Hello&nbsp;world例子中，可以这样：<br /><div class="quote">$(function()&nbsp;{<br />$("a").click(function()&nbsp;{<br />alert("Hello&nbsp;world!");<br />});<br />});&nbsp;</div><br />现在，我们手上有了这些基础的知识，我们可以更进一步的探索其它方面的东西，就从AJAX开始！<br />四.Rate&nbsp;me:使用AJAX<br />在这一部分我们写了一个小小的AJAX应用，它能够rate一些东西（译者Keel注：就是对某些东西投票），就像在youtube.com上面看到的一样。<br />首先我们需要一些服务器端代码，这个例子中用到了一个PHP文件，读取rating参数然后返回rating总数和平均数。看一下rate.php代码。<br /><br />虽然这些例子也可以不使用AJAX来实现，但显然我们不会那么做，我们用jQuery生成一个DIV容器，ID是"rating"。<br /><br /><div class="quote">$(document).ready(function()&nbsp;{<br />//&nbsp;generate&nbsp;markup<br />var&nbsp;ratingMarkup&nbsp;=&nbsp;["Please&nbsp;rate:&nbsp;"];<br />for(var&nbsp;i=1;&nbsp;i&nbsp;&lt;=&nbsp;5;&nbsp;i++)&nbsp;{&nbsp;ratingMarkup[ratingMarkup.length]&nbsp;=&nbsp;""&nbsp;+<br />i&nbsp;+&nbsp;"&nbsp;";<br />}<br />//&nbsp;add&nbsp;markup&nbsp;to&nbsp;container&nbsp;and<br />applier&nbsp;click&nbsp;handlers&nbsp;to&nbsp;anchors<br />$("#rating").append(&nbsp;ratingMarkup.join('')<br />).find("a").click(function(e)&nbsp;{<br />e.preventDefault();<br />//&nbsp;send&nbsp;requests<br />$.post("rate.php",&nbsp;{rating:&nbsp;$(this).html()},&nbsp;function(xml)&nbsp;{<br />//&nbsp;format<br />result<br />var&nbsp;result&nbsp;=&nbsp;[<br />"Thanks&nbsp;for&nbsp;rating,&nbsp;current&nbsp;average:&nbsp;",<br />$("average",&nbsp;xml).text(),<br />",&nbsp;number&nbsp;of&nbsp;votes:&nbsp;",<br />$("count",<br />xml).text()<br />];<br />//&nbsp;output&nbsp;result<br />$("#rating").html(result.join(''));<br />}&nbsp;);<br />});<br />});&nbsp;</div><br /><br />这段代码生成了5个链接，并将它们追加到id为"rating"容器中，当其中一个链接被点击时，该链接标明的分数就会以rating参数形式发送到rate.php，然后，结果将以XML形式会从服务器端传回来，添加到容器中，替代这些链接。<br />如果你没有一个安装过PHP的webserver，你可以看看这个在线的例子。<br />这是一个比较粗糙的例子，更完美的例子可以访问&nbsp;softonic.de&nbsp;点击&nbsp;"Kurz&nbsp;bewerten!"。<br />更多的AJAX方法可以从这里找到，或者看看API文档下面的AJAX。<br /><br />（译者Keel注：这个在线实例从国内访问还是比较慢的，点击后要等一会儿才能看到结果，可以考虑对它进行修改，比如加上loading，投票后加上再投票的返回链接等。此外，这个例子中还是有很多需要进一步消化的地方，看不懂的地方请参考API文档。）<br /><br />一个在载入AJAX时经常发生的问题是：当载入一个事件句柄到一个需要载入内容的HTML文档时，你只能在内容载入后再加载这些句柄，为了防止代码重复执行，你可能用到如下一个function:<br /><br /><div class="quote">//&nbsp;lets&nbsp;use&nbsp;the&nbsp;shortcut<br />$(function()&nbsp;{<br />var<br />addClickHandlers&nbsp;=&nbsp;function()&nbsp;{<br />$("a.clickMeToLoadContent").click(function()<br />{<br />$("#target").load(this.href,&nbsp;addClickHandlers);<br />});<br />};<br />addClickHandlers();<br />});&nbsp;</div><br />现在，addClickHandlers只在DOM载入完成后执行一次，并且是在用户点击具有clickMeToLoadContent&nbsp;这个样式的链接后。<br /><br />请注意addClickHandlers函数是作为一个本地变量定义的，而不是全局变量(如：function&nbsp;addClickHandlers()&nbsp;{...})，这样做是为了防止与其他的全局变量或者函数相冲突。<br /><br />另一个常见的问题是关于回传(callback)的参数。你可以通过一个额外的参数指定回叫的方法，简单的办法是将这个回叫方法包含在一个其它的function中：<br /><br /><div class="quote">//&nbsp;get&nbsp;some&nbsp;data<br />var&nbsp;foobar&nbsp;=&nbsp;...;<br />//&nbsp;specify<br />handler,&nbsp;it&nbsp;needs&nbsp;data&nbsp;as&nbsp;a&nbsp;paramter<br />var&nbsp;handler&nbsp;=&nbsp;function(data)&nbsp;{<br />...<br />};<br />//&nbsp;add&nbsp;click&nbsp;handler&nbsp;and&nbsp;pass&nbsp;foobar!<br />$('a').click(<br />function(event)&nbsp;{&nbsp;handler(foobar);&nbsp;}&nbsp;);<br /><br />//&nbsp;if&nbsp;you&nbsp;need&nbsp;the&nbsp;context&nbsp;of<br />the&nbsp;original&nbsp;handler,&nbsp;use&nbsp;apply:<br />$('a').click(&nbsp;function(event)&nbsp;{<br />handler.apply(this,&nbsp;[foobar]);&nbsp;}&nbsp;);&nbsp;</div><br />用到简单的AJAX后，我们可以认为已经非常之“web2.0”了，但是到现在为止，我们还缺少一些酷炫的效果。下一节将如谈到这些效果。<br /><br /><br />五：Animate&nbsp;me(让我生动起来):使用FX&nbsp;<br />一些生动的效果可以使用&nbsp;show()&nbsp;和&nbsp;hide()来表现:<br /><br />$(document).ready(function()&nbsp;{&nbsp;$("a").toggle(function()&nbsp;{&nbsp;&nbsp;$(".stuff").hide('slow');&nbsp;},&nbsp;function()&nbsp;{&nbsp;&nbsp;$(".stuff").show('fast');&nbsp;});});你可以与&nbsp;animate()联合起来创建一些效果,如一个带渐显的滑动效果:<br /><br />$(document).ready(function()&nbsp;{&nbsp;$("a").toggle(function()&nbsp;{&nbsp;&nbsp;$(".stuff").animate({&nbsp;&nbsp;&nbsp;height:&nbsp;'hide',&nbsp;&nbsp;&nbsp;opacity:&nbsp;'hide'&nbsp;&nbsp;},&nbsp;'slow');&nbsp;},&nbsp;function()&nbsp;{&nbsp;&nbsp;$(".stuff").animate({&nbsp;&nbsp;&nbsp;height:&nbsp;'show',&nbsp;&nbsp;&nbsp;opacity:&nbsp;'show'&nbsp;&nbsp;},&nbsp;'slow');&nbsp;});});很多不错的效果可以访问interface&nbsp;plugin&nbsp;collection.&nbsp;这个站点提供了很多demos和文档<br /><br />这些效果插件是位于jQuery插件列表的前面的，当然也有很多其他的插件，比如我们下一章讲到的表格排序插件。<br /><br />六、Sort&nbsp;me(将我有序化):使用tablesorter插件(表格排序)&nbsp;<br />这个表格排序插件能让我们在客户端按某一列进行排序，引入jQuery和这个插件的js文件，然后告诉插件你想要哪个表格拥有排序功能。<br /><br />要测试这个例子，先在starterkit.html中加上像下面这一行的代码：<br /><br /><div class="quote">&lt;script&nbsp;src="lib/jquery.tablesorter.js"&nbsp;type="text/javascript"&gt;&lt;/script&gt;</div>然后可以这样调用不着:<br /><br /><div class="quote">$(document).ready(function()&nbsp;{&nbsp;$("#large").tableSorter();});</div>现在点击表格的第一行head区域，你可以看到排序的效果，再次点击会按倒过来的顺序进行排列。<br /><br />这个表格还可以加一些突出显示的效果，我们可以做这样一个隔行背景色效果:<br /><br /><div class="quote">$(document).ready(function()&nbsp;{&nbsp;$("#large").tableSorter({//&nbsp;Class&nbsp;names&nbsp;for&nbsp;striping&nbsp;supplyed&nbsp;as&nbsp;a&nbsp;array.&nbsp;&nbsp;stripingRowClass:&nbsp;['odd','even'],&nbsp;&nbsp;&nbsp;stripRowsOnStartUp:&nbsp;true&nbsp;&nbsp;//&nbsp;Strip&nbsp;rows&nbsp;on&nbsp;tableSorter&nbsp;init.&nbsp;});});</div>关于这个插件的更多例子和文档可以在&nbsp;tablesorter首页找到.<br /><br />几乎所有的特件都是这样用的:先include插件的js文件,然后在某些元素上使用插件定义的方法,当然也有一些参数选项是可以配置的<br /><br />经常更新的插件列表可以从jQuery官方站&nbsp;on&nbsp;the&nbsp;jQuery&nbsp;site找到.<br /><br />当你更经常地使用jQury时,你会发现将你自己的代码打包成插件是很有用处的,它能方便地让你的公司或者其他人进行重用.下一章我们将谈到如何构建一个自己的插件.<br /><br />七、Plug&nbsp;me:制作自己的插件&nbsp;<br />写一个自己的jQuery插件是非常容易的,如果你按照下面的原则来做,可以让其他人也容易地结合使用你的插件.<br /><br />为你的插件取一个名字,在这个例子里面我们叫它"foobar".&nbsp;<br />创建一个像这样的文件:jquery.[yourpluginname].js,比如我们创建一个jquery.foobar.js&nbsp;<br />创建一个或更多的插件方法,使用继承jQuery对象的方式,如:&nbsp;<br />jQuery.fn.foobar&nbsp;=&nbsp;function()&nbsp;{&nbsp;//&nbsp;do&nbsp;something};可选的:创建一个用于帮助说明的函数,如:&nbsp;<br />jQuery.fooBar&nbsp;=&nbsp;{&nbsp;height:&nbsp;5,&nbsp;calculateBar&nbsp;=&nbsp;function()&nbsp;{&nbsp;...&nbsp;},&nbsp;checkDependencies&nbsp;=&nbsp;function()&nbsp;{&nbsp;...&nbsp;}};你现在可以在你的插件中使用这些帮助函数了:<br /><br />jQuery.fn.foobar&nbsp;=&nbsp;function()&nbsp;{&nbsp;//&nbsp;do&nbsp;something&nbsp;jQuery.foobar.checkDependencies(value);&nbsp;//&nbsp;do&nbsp;something&nbsp;else};可选的l:创建一个默认的初始参数配置,这些配置也可以由用户自行设定,如:&nbsp;<br />jQuery.fn.foobar&nbsp;=&nbsp;function(options)&nbsp;{&nbsp;var&nbsp;settings&nbsp;=&nbsp;{&nbsp;&nbsp;value:&nbsp;5,&nbsp;&nbsp;name:&nbsp;"pete",&nbsp;&nbsp;bar:&nbsp;655&nbsp;};&nbsp;if(options)&nbsp;{&nbsp;&nbsp;jQuery.extend(settings,&nbsp;options);&nbsp;}};现在可以无需做任何配置地使用插件了,默认的参数在此时生效:<br /><br />$("...").foobar();Or&nbsp;with&nbsp;some&nbsp;options:<br /><br />$("...").foobar({&nbsp;value:&nbsp;123,&nbsp;bar:&nbsp;9});如果你release你的插件,&nbsp;你还应该提供一些例子和文档,大部分的插件都具备这些良好的参考文档.<br /><br />现在你应该有了写一个插件的基础,让我们试着用这些知识写一个自己的插件.<br /><br />很多人试着控制所有的radio或者checkbox是否被选中,比如:<br /><br />$("input[@type='checkbox']").each(function()&nbsp;{&nbsp;this.checked&nbsp;=&nbsp;true;&nbsp;//&nbsp;or,&nbsp;to&nbsp;uncheck&nbsp;this.checked&nbsp;=&nbsp;false;&nbsp;//&nbsp;or,&nbsp;to&nbsp;toggle&nbsp;this.checked&nbsp;=&nbsp;!this.checked;});你可能想要把这个重写为一个插件,很直接地:<br /><br />$.fn.check&nbsp;=&nbsp;function()&nbsp;{&nbsp;return&nbsp;this.each(function()&nbsp;{&nbsp;&nbsp;this.checked&nbsp;=&nbsp;true;&nbsp;});};这个插件现在可以这样用:<br /><br />$("input[@type='checkbox']").check();现在你应该还可以写出uncheck()和toggleCheck()了.但是先停一下,让我们的插件接收一些参数.<br /><br /><br /><br /><div class="quote"><br />$.fn.check&nbsp;=&nbsp;function(mode)&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;mode&nbsp;=&nbsp;mode&nbsp;||&nbsp;'on';&nbsp;//&nbsp;if&nbsp;mode&nbsp;is&nbsp;undefined,&nbsp;use&nbsp;'on'&nbsp;as&nbsp;default&nbsp;return&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;this.each(function()&nbsp;{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;switch(mode)&nbsp;{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;'on':&nbsp;&nbsp;&nbsp;this.checked&nbsp;=&nbsp;true;&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;'off':&nbsp;&nbsp;&nbsp;this.checked&nbsp;=&nbsp;false;&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;'toggle':&nbsp;&nbsp;&nbsp;this.checked&nbsp;=&nbsp;!this.checked;&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;});<br />};</div><br />这里我们设置了默认的参数,所以将"on"参数省略也是可以的,当然也可以加上"on","off",&nbsp;或&nbsp;"toggle",如:<br /><br /><div class="quote"><br />$("input[@type='checkbox']").check();<br />$("input[@type='checkbox']").check('on');<br />$("input[@type='checkbox']").check('off');<br />$("input[@type='checkbox']").check('toggle');<br /></div><br />如果有多于一个的参数设置会稍稍有点复杂,在使用时如果只想设置第二个参数,则要在第一个参数位置写入null.<br /><br />从上一章的tablesorter插件用法我们可以看到,既可以省略所有参数来使用或者通过一个&nbsp;key/value&nbsp;对来重新设置每个参数.<br /><br />作为一个练习,你可以试着将&nbsp;第四部分&nbsp;的功能重写为一个插件.这个插件的骨架应该是像这样的:<br /><br /><div class="quote"><br />$.fn.rateMe&nbsp;=&nbsp;function(options)&nbsp;{&nbsp;<br />&nbsp;//&nbsp;instead&nbsp;of&nbsp;selecting&nbsp;a&nbsp;static&nbsp;container&nbsp;with&nbsp;$("#rating"),&nbsp;&nbsp;//we&nbsp;now&nbsp;use&nbsp;the&nbsp;jQuery&nbsp;context&nbsp;<br />var&nbsp;container&nbsp;=&nbsp;this;&nbsp;&nbsp;<br />var&nbsp;settings&nbsp;=&nbsp;{&nbsp;&nbsp;url:&nbsp;"rate.php"&nbsp;&nbsp;//&nbsp;put&nbsp;more&nbsp;defaults&nbsp;here&nbsp;&nbsp;//&nbsp;remember&nbsp;to&nbsp;put&nbsp;a&nbsp;comma&nbsp;(",")&nbsp;after&nbsp;each&nbsp;pair,&nbsp;&nbsp;&nbsp;//&nbsp;but&nbsp;not&nbsp;after&nbsp;the&nbsp;last&nbsp;one!&nbsp;<br />};&nbsp;<br />if(options)&nbsp;{&nbsp;&nbsp;//&nbsp;check&nbsp;if&nbsp;options&nbsp;are&nbsp;present&nbsp;before&nbsp;extending&nbsp;the&nbsp;settings&nbsp;&nbsp;<br />$.extend(settings,&nbsp;options);&nbsp;<br />}&nbsp;<br />&nbsp;//&nbsp;...&nbsp;//&nbsp;rest&nbsp;of&nbsp;the&nbsp;code&nbsp;//&nbsp;...&nbsp;&nbsp;<br />return&nbsp;this;&nbsp;//&nbsp;if&nbsp;possible,&nbsp;return&nbsp;"this"&nbsp;to&nbsp;not&nbsp;break&nbsp;the&nbsp;chain<br />});</div><br /><br />如果你想做更好的javascript开发,建议你使用一个叫&nbsp;FireBug的firefox插件.&nbsp;它提供了断点调试(比alert强多了)、观察DOM变化等很多漂亮的功能<br /><br />如果你还有未解决的问题，或者新的想法与建议，你可以使用jQuery的邮件列表&nbsp;jQuery&nbsp;mailing&nbsp;list.<br /><br />关于这个指南的任何事情，你可以写mail给作者或者发表评论在他的日志：blog.<br />]]>
      </description>
      <category>JavaScript/DOM</category>
   </item>
   <item>
      <title>escape、encodeURI和encodeURIComponent的区别</title>
      <author>zhanghuiguoanlige@126.com</author>
      <link>http://dev.mo.cn/article_175.html</link>
      <pubDate>2009-1-3 9:35:00</pubDate>
      <guid>http://dev.mo.cn/article_175.html</guid>
      <description>
      <![CDATA[escape(),&nbsp;encodeURI()和encodeURIComponent()是在Javascript中用于编码字符串的三个常用的方法，而他们之间的异同却困扰了很多的Javascript初学者，今天我就在这里对这三个方法详细地分析与比较一下。<br /><br />escape()&nbsp;方法<br /><br />MSDN&nbsp;JScript&nbsp;Reference中如是说：<br /><br />The&nbsp;escape&nbsp;method&nbsp;returns&nbsp;a&nbsp;string&nbsp;value&nbsp;(in&nbsp;Unicode&nbsp;format)&nbsp;that&nbsp;contains&nbsp;the&nbsp;contents&nbsp;of&nbsp;[the&nbsp;argument].&nbsp;All&nbsp;spaces,&nbsp;punctuation,&nbsp;accented&nbsp;characters,&nbsp;and&nbsp;any&nbsp;other&nbsp;non-ASCII&nbsp;characters&nbsp;are&nbsp;replaced&nbsp;with&nbsp;%xx&nbsp;encoding,&nbsp;where&nbsp;xx&nbsp;is&nbsp;equivalent&nbsp;to&nbsp;the&nbsp;hexadecimal&nbsp;number&nbsp;representing&nbsp;the&nbsp;character.&nbsp;For&nbsp;example,&nbsp;a&nbsp;space&nbsp;is&nbsp;returned&nbsp;as&nbsp;"%20."<br /><br />鄙人译：escape方法以Unicode格式返回一个包含传入参数内容的string类型的值。&nbsp;Escape方法会将传入参数中所有的空格、标点符号、重音字符以及其它任何非ASCII字符替换为%xx的编码形式，其中xx与其所表示的字符的16进制数表示形式相同。如空格字符的16进制表示形式为0x20，则此时xx应为20，即escape(‘&nbsp;’)&nbsp;返回“%20”。<br /><br />Mozilla&nbsp;Developer&nbsp;Core&nbsp;Javascript&nbsp;Guide中如是说：<br /><br />The&nbsp;escape&nbsp;and&nbsp;unescape&nbsp;functions&nbsp;let&nbsp;you&nbsp;encode&nbsp;and&nbsp;decode&nbsp;strings.&nbsp;The&nbsp;escape&nbsp;function&nbsp;returns&nbsp;the&nbsp;hexadecimal&nbsp;encoding&nbsp;of&nbsp;an&nbsp;argument&nbsp;in&nbsp;the&nbsp;ISO&nbsp;Latin&nbsp;character&nbsp;set.&nbsp;The&nbsp;unescape&nbsp;function&nbsp;returns&nbsp;the&nbsp;ASCII&nbsp;string&nbsp;for&nbsp;the&nbsp;specified&nbsp;hexadecimal&nbsp;encoding&nbsp;value.<br /><br />鄙人译：escape和unescape方法能够帮助你编码和解码字符串。escape方法对于ISO&nbsp;Latin字符集中的字符组成的参数，返回其16进制编码。相对应的，unescape方法则能将16进制编码形式的参数转化成为其ASCII码形式。<br /><br /><br /><br />encodeURI()方法<br /><br />MSDN&nbsp;JScript&nbsp;Reference中如是说：<br /><br />The&nbsp;encodeURI&nbsp;method&nbsp;returns&nbsp;an&nbsp;encoded&nbsp;URI.&nbsp;If&nbsp;you&nbsp;pass&nbsp;the&nbsp;result&nbsp;to&nbsp;decodeURI,&nbsp;the&nbsp;original&nbsp;string&nbsp;is&nbsp;returned.&nbsp;The&nbsp;encodeURI&nbsp;method&nbsp;does&nbsp;not&nbsp;encode&nbsp;the&nbsp;following&nbsp;characters:&nbsp;":",&nbsp;"/",&nbsp;";",&nbsp;and&nbsp;"?".&nbsp;Use&nbsp;encodeURIComponent&nbsp;to&nbsp;encode&nbsp;these&nbsp;characters.<br /><br />鄙人译：encodeURI方法返回一个经过编码的URI。如果将encodeURI方法的编码结果传递给decodeURI方法作参数，则能得到原始的未编码的字符串。需要注意到是encodeURI方法不编码如下字符":",&nbsp;"/",&nbsp;";",&nbsp;and&nbsp;"?"。如果想要编码这些字符，请使用encodeURIComponent方法。<br /><br />Mozilla&nbsp;Developer&nbsp;Core&nbsp;Javascript&nbsp;Guide中如是说：<br /><br />Encodes&nbsp;a&nbsp;Uniform&nbsp;Resource&nbsp;Identifier&nbsp;(URI)&nbsp;by&nbsp;replacing&nbsp;each&nbsp;instance&nbsp;of&nbsp;certain&nbsp;characters&nbsp;by&nbsp;one,&nbsp;two,&nbsp;or&nbsp;three&nbsp;escape&nbsp;sequences&nbsp;representing&nbsp;the&nbsp;UTF-8&nbsp;encoding&nbsp;of&nbsp;the&nbsp;character.<br /><br />鄙人译：通过将每个属于特定的字符集合的字符替换为一个、两个或者三个（为什么是“一个、两个或者三个”本人也没有搞懂，望高人赐教）使用UTF-8编码来表示这个字符的escape序列来编码一个URI。如&nbsp;~!@#$%^&*(){}[]=:/,;?+\'"\\&nbsp;将被替换为&nbsp;~!@#$%25%5E&*()%7B%7D%5B%5D=:/,;?+'%22%5C<br /><br /><br /><br />encodeURIComponent()方法<br /><br />MSDN&nbsp;JScript&nbsp;Reference中如是说：<br /><br />The&nbsp;encodeURIComponent&nbsp;method&nbsp;returns&nbsp;an&nbsp;encoded&nbsp;URI.&nbsp;If&nbsp;you&nbsp;pass&nbsp;the&nbsp;result&nbsp;to&nbsp;decodeURIComponent,&nbsp;the&nbsp;original&nbsp;string&nbsp;is&nbsp;returned.&nbsp;Because&nbsp;the&nbsp;encodeURIComponent&nbsp;method&nbsp;encodes&nbsp;all&nbsp;characters,&nbsp;be&nbsp;careful&nbsp;if&nbsp;the&nbsp;string&nbsp;represents&nbsp;a&nbsp;path&nbsp;such&nbsp;as&nbsp;/folder1/folder2/default.html.&nbsp;The&nbsp;slash&nbsp;characters&nbsp;will&nbsp;be&nbsp;encoded&nbsp;and&nbsp;will&nbsp;not&nbsp;be&nbsp;valid&nbsp;if&nbsp;sent&nbsp;as&nbsp;a&nbsp;request&nbsp;to&nbsp;a&nbsp;web&nbsp;server.&nbsp;Use&nbsp;the&nbsp;encodeURI&nbsp;method&nbsp;if&nbsp;the&nbsp;string&nbsp;contains&nbsp;more&nbsp;than&nbsp;a&nbsp;single&nbsp;URI&nbsp;component.<br /><br />鄙人译：encodeURIComponent方法返回一个编码过的URI。如果将encodeURIComponent方法的编码结果传递给encodeURIComponent方法作参数，则能得到原始的未编码的字符串。因为encodeURIComponent方法会编码所有的字符，所以如果待编码的字符串是用来表示一个路径（如/dir1/dir2/index.htm）时，就一定要小心使用了。‘/’符号会被其编码之后，将不再是一个有效的路径标识符，所以不能被web服务器正确地识别。当字符串包含一个单独的URI&nbsp;component(指?后面的请求参数)的时候，请使用此方法。<br /><br />Mozilla&nbsp;Developer&nbsp;Core&nbsp;Javascript&nbsp;Guide中如是说：<br /><br />Encodes&nbsp;a&nbsp;Uniform&nbsp;Resource&nbsp;Identifier&nbsp;(URI)&nbsp;component&nbsp;by&nbsp;replacing&nbsp;each&nbsp;instance&nbsp;of&nbsp;certain&nbsp;characters&nbsp;by&nbsp;one,&nbsp;two,&nbsp;or&nbsp;three&nbsp;escape&nbsp;sequences&nbsp;representing&nbsp;the&nbsp;UTF-8&nbsp;encoding&nbsp;of&nbsp;the&nbsp;character.<br /><br />鄙人译：通过将每个属于特定的字符集合的字符替换为一个、两个或者三个（为什么是“一个、两个或者三个”本人也没有搞懂，望高人赐教）使用UTF-8编码来表示这个字符的escape序列来编码一个URIComponent。<br /><br /><br /><br />有什么区别？何时使用？<br /><br />通过上面的介绍可以看出，MS的文档明显要比Mozilla详细、易懂一些，但是它们表达的都是一个意思。但是escape(),&nbsp;encodeURI()和&nbsp;encodeURIComponent()有什么异同，它们分别适用于那种特定的情况呢？<br /><br />escape方法并不编码字符+。而我们知道，在用户提交的表单字段中，如果有空格，则会被转化为+字符，而服务器解析的时候则会认为+号代表空格。由于这个缺陷，escape方法并不能正确地处理所有的非ASCII字符，你应当尽量避免使用escape方法，取而代之，你最好选择encodeURIComponent()方法。<br /><br />escape()不编码的字符：@*/+<br /><br />相对于使用escape方法，使用encodeURI方法会显得更专业一些。当你需要编码一整个URI的时候，你可以使用此方法，因为URI中的合法字符都不会被编码转换。需要注意到是字符’也是URI中的合法字符，所以也不会被编码转换。<br /><br />encodeURI()&nbsp;不编码的字符：&nbsp;~!@#@{content}*()=:/,;?+'<br /><br />encodeURIComponent方法在编码单个URIComponent（指请求参数）应当是最常用的。需要注意到是字符’也是URI中的合法字符，所以也不会被编码转换。<br /><br />encodeURIComponent()不编码的字符：&nbsp;~!*()'<br />&nbsp;<br />]]>
      </description>
      <category>JavaScript/DOM</category>
   </item>
   <item>
      <title>一个简单的JavaScript对象编程示例</title>
      <author>zhanghuiguoanlige@126.com</author>
      <link>http://dev.mo.cn/article_166.html</link>
      <pubDate>2008-12-30 21:15:56</pubDate>
      <guid>http://dev.mo.cn/article_166.html</guid>
      <description>
      <![CDATA[<div class="code"><div class="code_title"><span> &nbsp;<img src="images/code.gif" alt="" style="padding:0px;border:0px;" /></span>&nbsp;&nbsp;&nbsp;<a href="javascript:void(0);" onclick="window.clipboardData.setData('Text',this.parentNode.parentNode.childNodes[1].outerText);alert('븴Ƴɹ,Ctrl+VճҪλ!!');">ȫ</a></div><div class="code_content">&lt;!DOCTYPE&nbsp;html&nbsp;PUBLIC&nbsp;"-//W3C//DTD&nbsp;XHTML&nbsp;1.0&nbsp;Transitional//EN"&nbsp;"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;<br />&lt;html&nbsp;xmlns="http://www.w3.org/1999/xhtml"&nbsp;&gt;<br />&lt;head&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;title&gt;一个简单的JavaScript对象编程示例&lt;/title&gt;<br />&lt;/head&gt;<br />&lt;body&gt;<br />&lt;script&nbsp;type&nbsp;="text/javascript"&nbsp;&gt;<br /><br />function&nbsp;pig(Speed){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.runSpeed=Speed;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.Run=function(runTime){&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;&nbsp;runTime&nbsp;*&nbsp;this.runSpeed;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />}<br /><br />var&nbsp;aPig=new&nbsp;pig("10");<br />document.write("我是一头小猪,我的速度是"&nbsp;+&nbsp;aPig.runSpeed&nbsp;+&nbsp;"公里/小时;我要开始跑步了....");<br />var&nbsp;runOver=aPig.Run(5);<br />document.write("跑了<span style="color:Red;">5</span>小时,终于跑完了;我跑了"&nbsp;+&nbsp;runOver&nbsp;&nbsp;+&nbsp;"公里!");<br />&lt;/script&gt;<br /><br />&lt;/body&gt;<br />&lt;/html&gt;</div></div><br /><br /><div class="code"><div class="code_title"><span> &nbsp;<img src="images/code.gif" alt="" style="padding:0px;border:0px;" /></span>&nbsp;&nbsp;&nbsp;<a href="javascript:void(0);" onclick="window.clipboardData.setData('Text',this.parentNode.parentNode.childNodes[1].outerText);alert('븴Ƴɹ,Ctrl+VճҪλ!!');">ȫ</a></div><div class="code_content">&lt;script&nbsp;type="text/javascript"&gt;<br />var&nbsp;student={<br />&nbsp;&nbsp;&nbsp;&nbsp;name:"anlige",<br />&nbsp;&nbsp;&nbsp;&nbsp;course:{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count:2,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list:{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;english:80,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chinese:90<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;},<br />&nbsp;&nbsp;&nbsp;&nbsp;grade:function(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(student.course.list.english&nbsp;+&nbsp;student.course.list.chinese);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />};<br />student.grade();<br />&lt;/script&gt;</div></div>]]>
      </description>
      <category>JavaScript/DOM</category>
   </item>
   <item>
      <title>利用JQuery实现简单AJAX</title>
      <author>zhanghuiguoanlige@126.com</author>
      <link>http://dev.mo.cn/article_151.html</link>
      <pubDate>2008-10-29 17:00:46</pubDate>
      <guid>http://dev.mo.cn/article_151.html</guid>
      <description>
      <![CDATA[简单的ajax示例,其中jquery-1.2.6.pack.js包可以到这里来下载<br /><a href="http://dev.mo.cn/detial.asp?id=160" target="new"><span style="color:Red;">jquery-1.2.6.pack.js</span></a><br />解压后,里面的jquery1.26.rar就有本文件，是压缩版<br /><br />下面是具体代码<br /><br />example.html文件内容<br /><div class="code"><div class="code_title"><span> &nbsp;<img src="images/code.gif" alt="" style="padding:0px;border:0px;" /></span>&nbsp;&nbsp;&nbsp;<a href="javascript:void(0);" onclick="window.clipboardData.setData('Text',this.parentNode.parentNode.childNodes[1].outerText);alert('븴Ƴɹ,Ctrl+VճҪλ!!');">ȫ</a></div><div class="code_content">&lt;html&gt;<br />&lt;head&gt;<br />&lt;title&gt;实例&lt;/title&gt;<br />&lt;/head&gt;<br />&lt;script&nbsp;language="javascript"&nbsp;src="jquery-1.2.6.pack.js"&gt;&lt;/script&gt;<br />&lt;script&nbsp;language="javascript"&nbsp;src="code.js"&gt;&lt;/script&gt;<br />&lt;body&gt;<br />&lt;div&nbsp;id="msg"&gt;<br />msg<br />&lt;/div&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;</div></div><br /><br /><br />code.js的内容<br /><br /><div class="code"><div class="code_title"><span> &nbsp;<img src="images/code.gif" alt="" style="padding:0px;border:0px;" /></span>&nbsp;&nbsp;&nbsp;<a href="javascript:void(0);" onclick="window.clipboardData.setData('Text',this.parentNode.parentNode.childNodes[1].outerText);alert('븴Ƴɹ,Ctrl+VճҪλ!!');">ȫ</a></div><div class="code_content">$(document).ready(function(){<br />&nbsp; &nbsp; &nbsp; &nbsp; $("#msg").css({<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; "width":"800px",<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "border":"1px&nbsp;#dddddd&nbsp;solid"<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; });<br />&nbsp; &nbsp; &nbsp; &nbsp; $("#msg").ajaxStart(function(){$(this).html("请求中...")});<br />&nbsp; &nbsp; &nbsp; &nbsp; $("#msg").hide().fadeIn("slow");<br />&nbsp; &nbsp; &nbsp; &nbsp; $.ajax({<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; type:&nbsp;"get",<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; url:&nbsp;"http://dev.mo.cn",<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; data:&nbsp;&nbsp;&nbsp;"name=John&location=Boston",<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; success:&nbsp;function(msg){$("#msg").html(msg).hide().fadeIn("slow");}&nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; });&nbsp;<br />});</div></div>]]>
      </description>
      <category>JavaScript/DOM</category>
   </item>
   <item>
      <title>滑动门效果(利用Table边框)</title>
      <author>zhanghuiguoanlige@126.com</author>
      <link>http://dev.mo.cn/article_148.html</link>
      <pubDate>2008-10-15 17:12:17</pubDate>
      <guid>http://dev.mo.cn/article_148.html</guid>
      <description>
      <![CDATA[下午帮人做了个滑动门,有点复杂~仅仅作为参考吧<br /><br /><div class="code"><div class="code_title"><span> &nbsp;<img src="images/code.gif" alt="" style="padding:0px;border:0px;" /></span>&nbsp;&nbsp;&nbsp;<a href="javascript:void(0);" onclick="window.clipboardData.setData('Text',this.parentNode.parentNode.childNodes[1].outerText);alert('븴Ƴɹ,Ctrl+VճҪλ!!');">ȫ</a></div><div class="code_content">&lt;html&gt;<br />&lt;head&gt;<br />&lt;title&gt;滑动门效果(利用Table边框)&lt;/title&gt;<br />&lt;style&nbsp;type="text/css"&gt;<br />.eTable&nbsp;{font-size:12px;color:#222222;width:300px;border:1px&nbsp;solid&nbsp;#333333;border-collapse:&nbsp;collapse;margin-bottom:5px;}<br />TD&nbsp;{padding:3px;border:1px&nbsp;#333333&nbsp;solid;}<br />.eHead&nbsp;{font-weight:bold;}<br />.eCount&nbsp;{width:100px;}<br />.hiddenw&nbsp;{display:none;}<br />&lt;/style&gt;<br />&lt;script&nbsp;type="text/javascript"&gt;<br />function&nbsp;change(x,tid){<br />var&nbsp;obj;<br />var&nbsp;tTd;<br />&nbsp; &nbsp; &nbsp; &nbsp; var&nbsp;i=0;<br />&nbsp; &nbsp; &nbsp; &nbsp; for(i=1+(x-1)*3;i&lt;=x*3;i++){<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; obj=document.getElementById("div"+i);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tTd=document.getElementById("t"+i);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(parseInt(tid)+(x-1)*3==i){<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tTd.style.border="0";<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; obj.style.display="block";<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }else{&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tTd.style.border="1px&nbsp;#333333&nbsp;solid";<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; obj.style.display="none";&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br />}<br />&lt;/script&gt;<br />&lt;/head&gt;<br />&lt;body&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &lt;table&nbsp;class="eTable"&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;tr&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;td&nbsp;id="t1"&nbsp;class="eCount"&nbsp;onmouseover="change(1,1);"&gt;1&lt;/td&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;td&nbsp;id="t2"&nbsp;class="eCount"&nbsp;onmouseover="change(1,2);"&gt;2&lt;/td&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;td&nbsp;id="t3"&nbsp;class="eCount"&nbsp;onmouseover="change(1,3);"&gt;3&lt;/td&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/tr&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;tr&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;td&nbsp;colspan="3"&nbsp;style="border:0;"&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;div&nbsp;id="div1"&nbsp;class="hiddenw"&gt;项目一&lt;/div&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;div&nbsp;id="div2"&nbsp;class="hiddenw"&gt;项目二&lt;/div&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;div&nbsp;id="div3"&nbsp;class="hiddenw"&gt;项目三&lt;/div&gt;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/td&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/tr&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/table&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &lt;table&nbsp;class="eTable"&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;tr&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;td&nbsp;id="t4"&nbsp;class="eCount"&nbsp;onmouseover="change(2,1);"&gt;1&lt;/td&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;td&nbsp;id="t5"&nbsp;class="eCount"&nbsp;onmouseover="change(2,2);"&gt;2&lt;/td&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;td&nbsp;id="t6"&nbsp;class="eCount"&nbsp;onmouseover="change(2,3);"&gt;3&lt;/td&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/tr&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;tr&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;td&nbsp;colspan="3"&nbsp;style="border:0;"&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;div&nbsp;id="div4"&nbsp;class="hiddenw"&gt;项目4&lt;/div&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;div&nbsp;id="div5"&nbsp;class="hiddenw"&gt;项目5&lt;/div&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;div&nbsp;id="div6"&nbsp;class="hiddenw"&gt;项目6&lt;/div&gt;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/td&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/tr&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/table&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;</div></div>]]>
      </description>
      <category>JavaScript/DOM</category>
   </item>
   <item>
      <title>类似MSN提示的页面效果</title>
      <author>zhanghuiguoanlige@126.com</author>
      <link>http://dev.mo.cn/article_147.html</link>
      <pubDate>2008-10-14 20:37:57</pubDate>
      <guid>http://dev.mo.cn/article_147.html</guid>
      <description>
      <![CDATA[<div class="code"><div class="code_title"><span> &nbsp;<img src="images/code.gif" alt="" style="padding:0px;border:0px;" /></span>&nbsp;&nbsp;&nbsp;<a href="javascript:void(0);" onclick="window.clipboardData.setData('Text',this.parentNode.parentNode.childNodes[1].outerText);alert('븴Ƴɹ,Ctrl+VճҪλ!!');">ȫ</a></div><div class="code_content">&lt;html&gt;<br />&lt;head&gt;<br />&lt;meta&nbsp;http-equiv="Content-Type"&nbsp;content="text/html;&nbsp;charset=gb2312"&gt;<br />&lt;meta&nbsp;name="Keywords"&nbsp;content="51windows.Net"&gt;<br />&lt;META&nbsp;NAME="Author"&nbsp;CONTENT="haiwa"&gt;<br />&lt;title&gt;类似MSN提示的页面效果&lt;/title&gt;<br />&lt;/head&gt;<br /><br />&lt;body&nbsp;scroll=no&gt;<br />看到右下角的提示了吗？如果没有看到，&lt;button&nbsp;onclick=location.reload();&gt;刷新&lt;/button&gt;一下<br />&lt;script&nbsp;language="JavaScript"&gt;<br />window.onload&nbsp;=&nbsp;getMsg;<br />window.onresize&nbsp;=&nbsp;resizeDiv;<br />window.onerror&nbsp;=&nbsp;function(){}<br />//短信提示使用(asilas添加)<br />var&nbsp;divTop,divLeft,divWidth,divHeight,docHeight,docWidth,objTimer,i&nbsp;=&nbsp;0;<br />function&nbsp;getMsg()<br />{<br />&nbsp;&nbsp;try{<br />&nbsp;&nbsp;divTop&nbsp;=&nbsp;parseInt(document.getElementById("eMeng").style.top,10)<br />&nbsp;&nbsp;divLeft&nbsp;=&nbsp;parseInt(document.getElementById("eMeng").style.left,10)<br />&nbsp;&nbsp;divHeight&nbsp;=&nbsp;parseInt(document.getElementById("eMeng").offsetHeight,10)<br />&nbsp;&nbsp;divWidth&nbsp;=&nbsp;parseInt(document.getElementById("eMeng").offsetWidth,10)<br />&nbsp;&nbsp;docWidth&nbsp;=&nbsp;document.body.clientWidth;<br />&nbsp;&nbsp;docHeight&nbsp;=&nbsp;document.body.clientHeight;<br />&nbsp;&nbsp;document.getElementById("eMeng").style.top&nbsp;=&nbsp;parseInt(document.body.scrollTop,10)&nbsp;+&nbsp;docHeight&nbsp;+&nbsp;10;//&nbsp;divHeight<br />&nbsp;&nbsp;document.getElementById("eMeng").style.left&nbsp;=&nbsp;parseInt(document.body.scrollLeft,10)&nbsp;+&nbsp;docWidth&nbsp;-&nbsp;divWidth<br />&nbsp;&nbsp;document.getElementById("eMeng").style.visibility="visible"<br />&nbsp;&nbsp;objTimer&nbsp;=&nbsp;window.setInterval("moveDiv()",10)<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;catch(e){}<br />}<br /><br />function&nbsp;resizeDiv()<br />{<br />&nbsp;&nbsp;i+=1<br />&nbsp;&nbsp;if(i&gt;500)&nbsp;closeDiv()<br />&nbsp;&nbsp;try{<br />&nbsp;&nbsp;divHeight&nbsp;=&nbsp;parseInt(document.getElementById("eMeng").offsetHeight,10)<br />&nbsp;&nbsp;divWidth&nbsp;=&nbsp;parseInt(document.getElementById("eMeng").offsetWidth,10)<br />&nbsp;&nbsp;docWidth&nbsp;=&nbsp;document.body.clientWidth;<br />&nbsp;&nbsp;docHeight&nbsp;=&nbsp;document.body.clientHeight;<br />&nbsp;&nbsp;document.getElementById("eMeng").style.top&nbsp;=&nbsp;docHeight&nbsp;-&nbsp;divHeight&nbsp;+&nbsp;parseInt(document.body.scrollTop,10)<br />&nbsp;&nbsp;document.getElementById("eMeng").style.left&nbsp;=&nbsp;docWidth&nbsp;-&nbsp;divWidth&nbsp;+&nbsp;parseInt(document.body.scrollLeft,10)<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;catch(e){}<br />}<br /><br />function&nbsp;moveDiv()<br />{<br />&nbsp;&nbsp;try<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;if(parseInt(document.getElementById("eMeng").style.top,10)&nbsp;&lt;=&nbsp;(docHeight&nbsp;-&nbsp;divHeight&nbsp;+&nbsp;parseInt(document.body.scrollTop,10)))<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;window.clearInterval(objTimer)<br />&nbsp;&nbsp;objTimer&nbsp;=&nbsp;window.setInterval("resizeDiv()",1)<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;divTop&nbsp;=&nbsp;parseInt(document.getElementById("eMeng").style.top,10)<br />&nbsp;&nbsp;document.getElementById("eMeng").style.top&nbsp;=&nbsp;divTop&nbsp;-&nbsp;1<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;catch(e){}<br />}<br />function&nbsp;closeDiv()<br />{<br />&nbsp;&nbsp;document.getElementById('eMeng').style.visibility='hidden';<br />&nbsp;&nbsp;if(objTimer)&nbsp;window.clearInterval(objTimer)<br />}<br />&lt;/script&gt;<br />&lt;DIV&nbsp;id=eMeng&nbsp;style="BORDER-RIGHT:&nbsp;#455690&nbsp;1px&nbsp;solid;&nbsp;BORDER-TOP:&nbsp;#a6b4cf&nbsp;1px&nbsp;solid;&nbsp;Z-INDEX:99999;&nbsp;LEFT:&nbsp;0px;&nbsp;VISIBILITY:&nbsp;hidden;&nbsp;BORDER-LEFT:&nbsp;#a6b4cf&nbsp;1px&nbsp;solid;&nbsp;WIDTH:&nbsp;180px;&nbsp;BORDER-BOTTOM:&nbsp;#455690&nbsp;1px&nbsp;solid;&nbsp;POSITION:&nbsp;absolute;&nbsp;TOP:&nbsp;0px;&nbsp;HEIGHT:&nbsp;116px;&nbsp;BACKGROUND-COLOR:&nbsp;#c9d3f3"&gt;<br />&nbsp;&nbsp;&lt;TABLE&nbsp;style="BORDER-TOP:&nbsp;#ffffff&nbsp;1px&nbsp;solid;&nbsp;BORDER-LEFT:&nbsp;#ffffff&nbsp;1px&nbsp;solid"&nbsp;cellSpacing=0&nbsp;cellPadding=0&nbsp;width="100%"&nbsp;bgColor=#cfdef4&nbsp;border=0&gt;<br />&nbsp;&nbsp;&lt;TBODY&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;TR&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;TD&nbsp;style="FONT-SIZE:&nbsp;12px;&nbsp;BACKGROUND-IMAGE:&nbsp;url(msgTopBg.gif);&nbsp;COLOR:&nbsp;#0f2c8c"&nbsp;width=30&nbsp;height=24&gt;&lt;/TD&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;TD&nbsp;style="FONT-WEIGHT:&nbsp;normal;&nbsp;FONT-SIZE:&nbsp;12px;&nbsp;BACKGROUND-IMAGE:&nbsp;url(msgTopBg.gif);&nbsp;COLOR:&nbsp;#1f336b;&nbsp;PADDING-TOP:&nbsp;4px;PADDING-left:&nbsp;4px"&nbsp;vAlign=center&nbsp;width="100%"&gt;&nbsp;短消息提示：&lt;/TD&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;TD&nbsp;style="BACKGROUND-IMAGE:&nbsp;url(msgTopBg.gif);&nbsp;PADDING-TOP:&nbsp;2px;PADDING-right:2px"&nbsp;vAlign=center&nbsp;align=right&nbsp;width=19&gt;&lt;span&nbsp;title=关闭&nbsp;style="CURSOR:&nbsp;hand;color:red;font-size:12px;font-weight:bold;margin-right:4px;"&nbsp;onclick=closeDiv()&nbsp;&gt;×&lt;/span&gt;&lt;!--&nbsp;&lt;IMG&nbsp;title=关闭&nbsp;style="CURSOR:&nbsp;hand"&nbsp;onclick=closeDiv()&nbsp;hspace=3&nbsp;src="msgClose.jpg"&gt;&nbsp;--&gt;&lt;/TD&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/TR&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;TR&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;TD&nbsp;style="PADDING-RIGHT:&nbsp;1px;&nbsp;BACKGROUND-IMAGE:&nbsp;url(1msgBottomBg.jpg);&nbsp;PADDING-BOTTOM:&nbsp;1px"&nbsp;colSpan=3&nbsp;height=90&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;DIV&nbsp;style="BORDER-RIGHT:&nbsp;#b9c9ef&nbsp;1px&nbsp;solid;&nbsp;PADDING-RIGHT:&nbsp;13px;&nbsp;BORDER-TOP:&nbsp;#728eb8&nbsp;1px&nbsp;solid;&nbsp;PADDING-LEFT:&nbsp;13px;&nbsp;FONT-SIZE:&nbsp;12px;&nbsp;PADDING-BOTTOM:&nbsp;13px;&nbsp;BORDER-LEFT:&nbsp;#728eb8&nbsp;1px&nbsp;solid;&nbsp;WIDTH:&nbsp;100%;&nbsp;COLOR:&nbsp;#1f336b;&nbsp;PADDING-TOP:&nbsp;18px;&nbsp;BORDER-BOTTOM:&nbsp;#b9c9ef&nbsp;1px&nbsp;solid;&nbsp;HEIGHT:&nbsp;100%"&gt;您有&lt;font&nbsp;color=#FF0000&gt;1&lt;/font&gt;封新短消息&lt;BR&gt;&lt;BR&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;DIV&nbsp;align=center&nbsp;style="word-break:break-all"&gt;&lt;a&nbsp;href="javascript:alert('你好')"&gt;&lt;font&nbsp;color=#FF0000&gt;点击查看短信&lt;/font&gt;&lt;/a&gt;&lt;/DIV<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/DIV&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/TD&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/TR&gt;<br />&nbsp;&nbsp;&lt;/TBODY&gt;<br />&nbsp;&nbsp;&lt;/TABLE&gt;<br />&lt;/DIV&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;</div></div>]]>
      </description>
      <category>JavaScript/DOM</category>
   </item>
   <item>
      <title>Javascript拖动层</title>
      <author>zhanghuiguoanlige@126.com</author>
      <link>http://dev.mo.cn/article_127.html</link>
      <pubDate>2008-9-10 9:13:45</pubDate>
      <guid>http://dev.mo.cn/article_127.html</guid>
      <description>
      <![CDATA[<div class="code"><div class="code_title"><span> &nbsp;<img src="images/code.gif" alt="" style="padding:0px;border:0px;" /></span>&nbsp;&nbsp;&nbsp;<a href="javascript:void(0);" onclick="window.clipboardData.setData('Text',this.parentNode.parentNode.childNodes[1].outerText);alert('븴Ƴɹ,Ctrl+VճҪλ!!');">ȫ</a></div><div class="code_content">&lt;html&gt;&nbsp;<br />&lt;head&gt;&nbsp;<br />&lt;style&nbsp;type='text/css'&gt;&nbsp;<br />&lt;!--&nbsp;<br />body{font-size:12px;}&nbsp;<br />a:visited{text-decoration:none;color:slategray;}&nbsp;<br />a:hover{text-decoration:underline;color:slategray;}&nbsp;<br />a:link{text-decoration:none;color:slategray;}&nbsp;<br />--&gt;&nbsp;<br />&lt;/style&gt;&nbsp;<br />&lt;script&nbsp;language=JScript&gt;&nbsp;<br />&lt;!--&nbsp;<br />//可以打包为js文件;&nbsp;<br />var&nbsp;x0=0,y0=0,x1=0,y1=0;&nbsp;<br />var&nbsp;offx=6,offy=6;&nbsp;<br />var&nbsp;moveable=false;&nbsp;<br />var&nbsp;hover='orange',normal='#336699';//color;&nbsp;<br />var&nbsp;index=10000;//z-index;&nbsp;<br />//开始拖动;&nbsp;<br />function&nbsp;startDrag(obj)&nbsp;<br />{&nbsp;<br />if(event.button==1)&nbsp;<br />{&nbsp;<br />//锁定标题栏;&nbsp;<br />obj.setCapture();&nbsp;<br />//定义对象;&nbsp;<br />var&nbsp;win&nbsp;=&nbsp;obj.parentNode;&nbsp;<br />var&nbsp;sha&nbsp;=&nbsp;win.nextSibling;&nbsp;<br />//记录鼠标和层位置;&nbsp;<br />x0&nbsp;=&nbsp;event.clientX;&nbsp;<br />y0&nbsp;=&nbsp;event.clientY;&nbsp;<br />x1&nbsp;=&nbsp;parseInt(win.style.left);&nbsp;<br />y1&nbsp;=&nbsp;parseInt(win.style.top);&nbsp;<br />//记录颜色;&nbsp;<br />normal&nbsp;=&nbsp;obj.style.backgroundColor;&nbsp;<br />//改变风格;&nbsp;<br />obj.style.backgroundColor&nbsp;=&nbsp;hover;&nbsp;<br />win.style.borderColor&nbsp;=&nbsp;hover;&nbsp;<br />obj.nextSibling.style.color&nbsp;=&nbsp;hover;&nbsp;<br />sha.style.left&nbsp;=&nbsp;x1&nbsp;+&nbsp;offx;&nbsp;<br />sha.style.top&nbsp;&nbsp;=&nbsp;y1&nbsp;+&nbsp;offy;&nbsp;<br />moveable&nbsp;=&nbsp;true;&nbsp;<br />}&nbsp;<br />}&nbsp;<br />//拖动;&nbsp;<br />function&nbsp;drag(obj)&nbsp;<br />{&nbsp;<br />if(moveable)&nbsp;<br />{&nbsp;<br />var&nbsp;win&nbsp;=&nbsp;obj.parentNode;&nbsp;<br />var&nbsp;sha&nbsp;=&nbsp;win.nextSibling;&nbsp;<br />win.style.left&nbsp;=&nbsp;x1&nbsp;+&nbsp;event.clientX&nbsp;-&nbsp;x0;&nbsp;<br />win.style.top&nbsp;&nbsp;=&nbsp;y1&nbsp;+&nbsp;event.clientY&nbsp;-&nbsp;y0;&nbsp;<br />sha.style.left&nbsp;=&nbsp;parseInt(win.style.left)&nbsp;+&nbsp;offx;&nbsp;<br />sha.style.top&nbsp;&nbsp;=&nbsp;parseInt(win.style.top)&nbsp;+&nbsp;offy;&nbsp;<br />}&nbsp;<br />}&nbsp;<br />//停止拖动;&nbsp;<br />function&nbsp;stopDrag(obj)&nbsp;<br />{&nbsp;<br />if(moveable)&nbsp;<br />{&nbsp;<br />var&nbsp;win&nbsp;=&nbsp;obj.parentNode;&nbsp;<br />var&nbsp;sha&nbsp;=&nbsp;win.nextSibling;&nbsp;<br />var&nbsp;msg&nbsp;=&nbsp;obj.nextSibling;&nbsp;<br />win.style.borderColor&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;normal;&nbsp;<br />obj.style.backgroundColor&nbsp;=&nbsp;normal;&nbsp;<br />msg.style.color&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;normal;&nbsp;<br />sha.style.left&nbsp;=&nbsp;obj.parentNode.style.left;&nbsp;<br />sha.style.top&nbsp;&nbsp;=&nbsp;obj.parentNode.style.top;&nbsp;<br />obj.releaseCapture();&nbsp;<br />moveable&nbsp;=&nbsp;false;&nbsp;<br />alert('我的顶部位置：'+obj.parentNode.style.top+'&nbsp;我的左边位置：'+obj.parentNode.style.left);&nbsp;<br />}&nbsp;<br />}&nbsp;<br />//获得焦点;&nbsp;<br />function&nbsp;getFocus(obj)&nbsp;<br />{&nbsp;<br />if(obj.style.zIndex!=index)&nbsp;<br />{&nbsp;<br />index&nbsp;=&nbsp;index&nbsp;+&nbsp;2;&nbsp;<br />var&nbsp;idx&nbsp;=&nbsp;index;&nbsp;<br />obj.style.zIndex=idx;&nbsp;<br />obj.nextSibling.style.zIndex=idx-1;&nbsp;<br />}&nbsp;<br />}&nbsp;<br />//最小化;&nbsp;<br />function&nbsp;min(obj)&nbsp;<br />{&nbsp;<br />var&nbsp;win&nbsp;=&nbsp;obj.parentNode.parentNode;&nbsp;<br />var&nbsp;sha&nbsp;=&nbsp;win.nextSibling;&nbsp;<br />var&nbsp;tit&nbsp;=&nbsp;obj.parentNode;&nbsp;<br />var&nbsp;msg&nbsp;=&nbsp;tit.nextSibling;&nbsp;<br />var&nbsp;flg&nbsp;=&nbsp;msg.style.display=="none";&nbsp;<br />if(flg)&nbsp;<br />{&nbsp;<br />win.style.height&nbsp;&nbsp;=&nbsp;parseInt(msg.style.height)&nbsp;+&nbsp;parseInt(tit.style.height)&nbsp;+&nbsp;2*2;&nbsp;<br />sha.style.height&nbsp;&nbsp;=&nbsp;win.style.height;&nbsp;<br />msg.style.display&nbsp;=&nbsp;"block";&nbsp;<br />obj.innerHTML&nbsp;=&nbsp;"0";&nbsp;<br />}&nbsp;<br />else&nbsp;<br />{&nbsp;<br />win.style.height&nbsp;&nbsp;=&nbsp;parseInt(tit.style.height)&nbsp;+&nbsp;2*2;&nbsp;<br />sha.style.height&nbsp;&nbsp;=&nbsp;win.style.height;&nbsp;<br />obj.innerHTML&nbsp;=&nbsp;"2";&nbsp;<br />msg.style.display&nbsp;=&nbsp;"none";&nbsp;<br />}&nbsp;<br />}&nbsp;<br />//创建一个对象;&nbsp;<br />function&nbsp;xWin(id,w,h,l,t,tit,msg)&nbsp;<br />{&nbsp;<br />index&nbsp;=&nbsp;index+2;&nbsp;<br />this.id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;id;&nbsp;<br />this.width&nbsp;&nbsp;=&nbsp;w;&nbsp;<br />this.height&nbsp;&nbsp;=&nbsp;h;&nbsp;<br />this.left&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;l;&nbsp;<br />this.top&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;t;&nbsp;<br />this.zIndex&nbsp;&nbsp;=&nbsp;index;&nbsp;<br />this.title&nbsp;&nbsp;=&nbsp;tit;&nbsp;<br />this.message&nbsp;=&nbsp;msg;&nbsp;<br />this.obj&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;null;&nbsp;<br />this.bulid&nbsp;&nbsp;=&nbsp;bulid;&nbsp;<br />this.bulid();&nbsp;<br />}&nbsp;<br />//初始化;&nbsp;<br />function&nbsp;bulid()&nbsp;<br />{&nbsp;<br />var&nbsp;str&nbsp;=&nbsp;""&nbsp;<br />+&nbsp;"&nbsp;&lt;div&nbsp;id=xMsg"&nbsp;+&nbsp;this.id&nbsp;+&nbsp;"&nbsp;"&nbsp;<br />+&nbsp;"style='"&nbsp;<br />+&nbsp;"z-index:"&nbsp;+&nbsp;this.zIndex&nbsp;+&nbsp;";"&nbsp;<br />+&nbsp;"width:"&nbsp;+&nbsp;this.width&nbsp;+&nbsp;";"&nbsp;<br />+&nbsp;"height:"&nbsp;+&nbsp;this.height&nbsp;+&nbsp;";"&nbsp;<br />+&nbsp;"left:"&nbsp;+&nbsp;this.left&nbsp;+&nbsp;";"&nbsp;<br />+&nbsp;"top:"&nbsp;+&nbsp;this.top&nbsp;+&nbsp;";"&nbsp;<br />+&nbsp;"background-color:"&nbsp;+&nbsp;normal&nbsp;+&nbsp;";"&nbsp;<br />+&nbsp;"color:"&nbsp;+&nbsp;normal&nbsp;+&nbsp;";"&nbsp;<br />+&nbsp;"font-size:8pt;"&nbsp;<br />+&nbsp;"font-family:Tahoma;"&nbsp;<br />+&nbsp;"position:absolute;"&nbsp;<br />+&nbsp;"cursor:default;"&nbsp;<br />+&nbsp;"border:2px&nbsp;solid&nbsp;"&nbsp;+&nbsp;normal&nbsp;+&nbsp;";"&nbsp;<br />+&nbsp;"'&nbsp;"&nbsp;<br />+&nbsp;"onmousedown='getFocus(this)'&gt;"&nbsp;<br />+&nbsp;"&nbsp;&lt;div&nbsp;"&nbsp;<br />+&nbsp;"style='"&nbsp;<br />+&nbsp;"background-color:"&nbsp;+&nbsp;normal&nbsp;+&nbsp;";"&nbsp;<br />+&nbsp;"width:"&nbsp;+&nbsp;(this.width-2*2)&nbsp;+&nbsp;";"&nbsp;<br />+&nbsp;"height:20;"&nbsp;<br />+&nbsp;"color:white;"&nbsp;<br />+&nbsp;"'&nbsp;"&nbsp;<br />+&nbsp;"onmousedown='startDrag(this)'&nbsp;"&nbsp;<br />+&nbsp;"onmouseup='stopDrag(this)'&nbsp;"&nbsp;<br />+&nbsp;"onmousemove='drag(this)'&nbsp;"&nbsp;<br />+&nbsp;"ondblclick='min(this.childNodes[1])'"&nbsp;<br />+&nbsp;"&gt;"&nbsp;<br />+&nbsp;"&nbsp;&lt;span&nbsp;style='width:"&nbsp;+&nbsp;(this.width-2*12-4)&nbsp;+&nbsp;";padding-left:3px;'&gt;"&nbsp;+&nbsp;this.title&nbsp;+&nbsp;"&nbsp;&lt;/span&gt;"&nbsp;<br />+&nbsp;"&nbsp;&lt;span&nbsp;style='width:12;border-width:0px;color:white;font-family:webdings;'&nbsp;onclick='min(this)'&gt;0&nbsp;&lt;/span&gt;"&nbsp;<br />+&nbsp;"&nbsp;&lt;span&nbsp;style='width:12;border-width:0px;color:white;font-family:webdings;'&nbsp;onclick='ShowHide(\""+this.id+"\",null)'&gt;r&nbsp;&lt;/span&gt;"&nbsp;<br />+&nbsp;"&nbsp;&lt;/div&gt;"&nbsp;<br />+&nbsp;"&nbsp;&lt;div&nbsp;style='"&nbsp;<br />+&nbsp;"width:100%;"&nbsp;<br />+&nbsp;"height:"&nbsp;+&nbsp;(this.height-20-4)&nbsp;+&nbsp;";"&nbsp;<br />+&nbsp;"background-color:white;"&nbsp;<br />+&nbsp;"line-height:14px;"&nbsp;<br />+&nbsp;"word-break:break-all;"&nbsp;<br />+&nbsp;"padding:3px;"&nbsp;<br />+&nbsp;"'&gt;"&nbsp;+&nbsp;this.message&nbsp;+&nbsp;"&nbsp;&lt;/div&gt;"&nbsp;<br />+&nbsp;"&nbsp;&lt;/div&gt;"&nbsp;<br />+&nbsp;"&nbsp;&lt;div&nbsp;id=xMsg"&nbsp;+&nbsp;this.id&nbsp;+&nbsp;"bg&nbsp;style='"&nbsp;<br />+&nbsp;"width:"&nbsp;+&nbsp;this.width&nbsp;+&nbsp;";"&nbsp;<br />+&nbsp;"height:"&nbsp;+&nbsp;this.height&nbsp;+&nbsp;";"&nbsp;<br />+&nbsp;"top:"&nbsp;+&nbsp;this.top&nbsp;+&nbsp;";"&nbsp;<br />+&nbsp;"left:"&nbsp;+&nbsp;this.left&nbsp;+&nbsp;";"&nbsp;<br />+&nbsp;"z-index:"&nbsp;+&nbsp;(this.zIndex-1)&nbsp;+&nbsp;";"&nbsp;<br />+&nbsp;"position:absolute;"&nbsp;<br />+&nbsp;"background-color:black;"&nbsp;<br />+&nbsp;"filter:alpha(opacity=40);"&nbsp;<br />+&nbsp;"'&gt;&nbsp;&lt;/div&gt;";&nbsp;<br />document.body.insertAdjacentHTML("beforeEnd",str);&nbsp;<br />}&nbsp;<br />//显示隐藏窗口&nbsp;<br />function&nbsp;ShowHide(id,dis){&nbsp;<br />var&nbsp;bdisplay&nbsp;=&nbsp;(dis==null)?((document.getElementById("xMsg"+id).style.display=="")?"none":""):dis&nbsp;<br />document.getElementById("xMsg"+id).style.display&nbsp;=&nbsp;bdisplay;&nbsp;<br />document.getElementById("xMsg"+id+"bg").style.display&nbsp;=&nbsp;bdisplay;&nbsp;<br />}&nbsp;<br />//--&gt;&nbsp;<br />&lt;/script&gt;&nbsp;<br /><br />&lt;script&nbsp;language='JScript'&gt;&nbsp;<br />&lt;!--&nbsp;<br />function&nbsp;initialize()&nbsp;<br />{&nbsp;<br />var&nbsp;a&nbsp;=&nbsp;new&nbsp;xWin("1",160,200,200,200,"窗口1","xWin&nbsp;&lt;br&gt;&nbsp;A&nbsp;Cool&nbsp;Pop&nbsp;Div&nbsp;Window&nbsp;&lt;br&gt;Version:1.0&nbsp;&lt;br&gt;2002-8-13");&nbsp;<br />var&nbsp;b&nbsp;=&nbsp;new&nbsp;xWin("2",240,200,100,100,"窗口2","Welcome&nbsp;to&nbsp;visited&nbsp;my&nbsp;personal&nbsp;website:&nbsp;&lt;br&gt;&nbsp;&lt;a&nbsp;href=http://www14.brinkster.com/wildcity&nbsp;target=_blank&gt;http://wildcity.126.com&nbsp;&lt;/a&gt;&nbsp;&lt;br&gt;and&nbsp;u&nbsp;can&nbsp;also&nbsp;sign&nbsp;my&nbsp;guestbook&nbsp;at:&nbsp;&lt;br&gt;&nbsp;&lt;a&nbsp;href=http://www14.brinkster.com/wildcity/gbook&nbsp;target=_blank&gt;http://wildcity.126.com/gbook&nbsp;&lt;/a&gt;&nbsp;&lt;br&gt;&nbsp;&lt;br&gt;thx!!!&nbsp;=)...");&nbsp;<br />var&nbsp;c&nbsp;=&nbsp;new&nbsp;xWin("3",200,160,250,50,"窗口3","Copyright&nbsp;by&nbsp;&lt;a&nbsp;href='mailto:wildwind_zz@21cn.com'&gt;Wildwind&nbsp;&lt;/a&gt;!");&nbsp;<br />ShowHide("1","none");//隐藏窗口1&nbsp;<br />}&nbsp;<br />window.onload&nbsp;=&nbsp;initialize;&nbsp;<br />//--&gt;&nbsp;<br />&lt;/script&gt;&nbsp;<br />&lt;/head&gt;&nbsp;<br />&lt;base&nbsp;target="_blank"&gt;&nbsp;<br />&lt;body&nbsp;onselectstart='return&nbsp;false'&nbsp;oncontextmenu='return&nbsp;false'&nbsp;&gt;&nbsp;<br />&lt;a&nbsp;onclick="ShowHide('1',null);return&nbsp;false;"&nbsp;href=""&gt;窗口1&nbsp;&lt;/a&gt;&nbsp;<br />&lt;a&nbsp;onclick="ShowHide('2',null);return&nbsp;false;"&nbsp;href=""&gt;窗口2&nbsp;&lt;/a&gt;&nbsp;<br />&lt;a&nbsp;onclick="ShowHide('3',null);return&nbsp;false;"&nbsp;href=""&gt;窗口3&nbsp;&lt;/a&gt;&nbsp;<br />&lt;/body&gt;&nbsp;<br />&lt;/html&gt;&nbsp;</div></div>]]>
      </description>
      <category>JavaScript/DOM</category>
   </item>
   <item>
      <title>XMLDOM对象方法详解</title>
      <author>zhanghuiguoanlige@126.com</author>
      <link>http://dev.mo.cn/article_107.html</link>
      <pubDate>2008-8-11 4:59:32</pubDate>
      <guid>http://dev.mo.cn/article_107.html</guid>
      <description>
      <![CDATA[abort&nbsp;方法&nbsp;<br />&nbsp;作&nbsp;&nbsp;&nbsp;用<br />&nbsp;&nbsp;abort&nbsp;方法取消一个进行中的异步下载&nbsp;<br />&nbsp;基本语法<br />&nbsp;&nbsp;xmlDocument.abort();<br />&nbsp;<br />说&nbsp;&nbsp;&nbsp;明<br />&nbsp;&nbsp;如果这个方法在异步下载时被呼叫，所有的解析动作会停止，而且在内存中的文件会被释放。<br />&nbsp;<br />范&nbsp;&nbsp;&nbsp;例<br />&nbsp;xmlDocument<br />&nbsp;-------------------------------------------------------------------------------------<br />AppendChild&nbsp;方法&nbsp;<br />&nbsp;作&nbsp;&nbsp;&nbsp;用<br />&nbsp;&nbsp;加上一个节点当作指定节点最后的子节点。&nbsp;<br />&nbsp;基本语法<br />&nbsp;&nbsp;xmlDocumentNode.appendChild(newChild);<br />&nbsp;<br />说&nbsp;&nbsp;&nbsp;明<br />&nbsp;&nbsp;newChild&nbsp;是附加子节点的地址。<br />&nbsp;<br />范&nbsp;&nbsp;&nbsp;例<br />&nbsp;docObj&nbsp;＝&nbsp;xmlDoc.documentElement;<br />alert(docObj.xml);<br />objNewNode&nbsp;＝&nbsp;docObj.appendChild(xmlDoc.documentElement.&nbsp;firstChild);<br />alert(docObj.xml);<br />&nbsp;&nbsp;-------------------------------------------------------------------------------------<br />cloneNode&nbsp;方法&nbsp;<br />&nbsp;作&nbsp;&nbsp;&nbsp;用<br />&nbsp;<br />&nbsp;基本语法<br />&nbsp;&nbsp;xmlDocumentNode.cloneNode(deep);<br />&nbsp;<br />说&nbsp;&nbsp;&nbsp;明<br />&nbsp;&nbsp;deep&nbsp;是一个布尔值。如果为true，此节点会复制以指定节点发展出去的所有节点。如果是false，只有指定的节点和它的属性被复制。<br />&nbsp;<br />范&nbsp;&nbsp;&nbsp;例<br />&nbsp;currNode&nbsp;＝&nbsp;xmlDoc.documentElement.childNodes.item(1);<br />objClonedNode&nbsp;＝&nbsp;currNode.cloneNode(1);<br />alert(objClonedNode.xml);<br />&nbsp;&nbsp;-------------------------------------------------------------------------------------<br />createAttribute&nbsp;方法&nbsp;<br />&nbsp;作&nbsp;&nbsp;&nbsp;用<br />&nbsp;&nbsp;建立一个指定名称的属性。&nbsp;<br />&nbsp;基本语法<br />&nbsp;&nbsp;xmlDocument.createAttribute(name);<br />&nbsp;<br />说&nbsp;&nbsp;&nbsp;明<br />&nbsp;&nbsp;name&nbsp;是被建立属性的名称。<br />&nbsp;<br />范&nbsp;&nbsp;&nbsp;例<br />&nbsp;objNewAtt&nbsp;＝&nbsp;xmlDoc.createAttribute("encryption");<br />alert(objNewAtt.xml);<br />&nbsp;&nbsp;-------------------------------------------------------------------------------------<br />createCDATASection&nbsp;方法&nbsp;<br />&nbsp;作&nbsp;&nbsp;&nbsp;用<br />&nbsp;<br />&nbsp;基本语法<br />&nbsp;&nbsp;xmlDocument.createCDATASection(data);<br />&nbsp;<br />说&nbsp;&nbsp;&nbsp;明<br />&nbsp;&nbsp;date&nbsp;是一个字符串，且包含了被置放在CDATA&nbsp;的资料。<br />&nbsp;<br />范&nbsp;&nbsp;&nbsp;例<br />&nbsp;objNewCDATA&nbsp;＝&nbsp;xmlDoc.createCDATASection("This&nbsp;is&nbsp;a&nbsp;CDATA&nbsp;Section");<br />alert(objNewCDATA.xml);<br />&nbsp;&nbsp;-------------------------------------------------------------------------------------<br />createComment&nbsp;方法&nbsp;<br />&nbsp;作&nbsp;&nbsp;&nbsp;用<br />&nbsp;<br />&nbsp;基本语法<br />&nbsp;&nbsp;xmlDocument.createComment(data);<br />&nbsp;<br />说&nbsp;&nbsp;&nbsp;明<br />&nbsp;&nbsp;data&nbsp;是一个字符串，且包含了被置放在批注的资料。<br />&nbsp;<br />范&nbsp;&nbsp;&nbsp;例<br />&nbsp;objNewComment&nbsp;＝&nbsp;xmlDoc.createComment("This&nbsp;is&nbsp;a&nbsp;comment");<br />alert(objNewComment.xml);<br />&nbsp;&nbsp;-------------------------------------------------------------------------------------<br />createDocumentFragment&nbsp;方法&nbsp;<br />&nbsp;作&nbsp;&nbsp;&nbsp;用<br />&nbsp;&nbsp;建立一个空的文件片断对象。&nbsp;<br />&nbsp;基本语法<br />&nbsp;&nbsp;xmlDocument.createDocumentFragment();<br />&nbsp;<br />说&nbsp;&nbsp;&nbsp;明<br />&nbsp;&nbsp;一个新的文件片断被建立，但没有加到文件树中。要加入片断到文件树中，必须使用插入方法，例如insertBefore、replaceChild&nbsp;或appendChild。<br />&nbsp;<br />范&nbsp;&nbsp;&nbsp;例<br />&nbsp;objNewFragment&nbsp;＝&nbsp;xmlDoc.createDocumentFragment();<br />alert(objNewFragment.xml);<br />&nbsp;&nbsp;-------------------------------------------------------------------------------------<br />createElement&nbsp;方法&nbsp;<br />&nbsp;作&nbsp;&nbsp;&nbsp;用<br />&nbsp;&nbsp;建立一个指定名称的元素。&nbsp;<br />&nbsp;基本语法<br />&nbsp;&nbsp;xmlDocument.createElement(tagName);<br />&nbsp;<br />说&nbsp;&nbsp;&nbsp;明<br />&nbsp;&nbsp;tagName&nbsp;是一个区分大小写的字符串来指定新元素名称。<br />&nbsp;<br />范&nbsp;&nbsp;&nbsp;例<br />&nbsp;objNewElement&nbsp;＝&nbsp;xmlDoc.createElement("TO");<br />alert(objNewElement.xml);<br />&nbsp;&nbsp;-------------------------------------------------------------------------------------<br />createEntityReference&nbsp;方法&nbsp;<br />&nbsp;作&nbsp;&nbsp;&nbsp;用<br />&nbsp;&nbsp;建立一个参照到指定名称的实体。&nbsp;<br />&nbsp;基本语法<br />&nbsp;&nbsp;xmlDocument.createEntityReference(name);<br />&nbsp;<br />说&nbsp;&nbsp;&nbsp;明<br />&nbsp;&nbsp;name&nbsp;是一个区分大小写的字符串，来指定新实体参照的名称。一个新的实体参照被建立，但是并没有被加到文件树中。若要将实体参照加到文件树中，必须使用一种插入方法，例如：insertBefore，replaceChild，或appendChild。<br />&nbsp;范&nbsp;&nbsp;&nbsp;例<br />&nbsp;objNewER&nbsp;＝&nbsp;xmlDoc.createEntityReference("eRef");<br />alert(objNewER.xml);<br />&nbsp;&nbsp;-------------------------------------------------------------------------------------<br /><br />load&nbsp;方法&nbsp;<br />&nbsp;作&nbsp;&nbsp;&nbsp;用<br />&nbsp;&nbsp;表示从指定位置加载的文件。&nbsp;<br />&nbsp;基本语法<br />&nbsp;&nbsp;boolValue&nbsp;＝&nbsp;xmlDocument.load(url);<br />&nbsp;<br />说&nbsp;&nbsp;&nbsp;明<br />&nbsp;&nbsp;url&nbsp;包含要被加载档案的URL&nbsp;的字符串。假如文件加载成功，传回值即为true。若加载失败，传回值为false。<br />&nbsp;<br />范&nbsp;&nbsp;&nbsp;例<br />&nbsp;boolValue&nbsp;＝&nbsp;xmlDoc.load("LstA_1.xml");<br />alert(boolValue);<br />&nbsp;&nbsp;-------------------------------------------------------------------------------------<br />loadXML&nbsp;方法&nbsp;<br />&nbsp;作&nbsp;&nbsp;&nbsp;用<br />&nbsp;&nbsp;加载一个XML&nbsp;文件或字符串的片断。&nbsp;<br />&nbsp;基本语法<br />&nbsp;&nbsp;boolValue&nbsp;＝&nbsp;xmlDocument.loadXML(xmlString);<br />&nbsp;<br />说&nbsp;&nbsp;&nbsp;明<br />&nbsp;&nbsp;xmlString&nbsp;是包含XML&nbsp;文字码的字符串。<br />&nbsp;<br />范&nbsp;&nbsp;&nbsp;例<br />&nbsp;xmlString&nbsp;＝&nbsp;"&lt;GREETING&gt;&lt;MESSAGE&gt;Hello!&lt;/MESSAGE&gt;&lt;/GREETING&gt;";<br />boolValue&nbsp;＝&nbsp;xmlDoc.loadXML(xmlString);<br />alert(boolValue);<br />&nbsp;&nbsp;-------------------------------------------------------------------------------------<br />nodeFromID&nbsp;方法&nbsp;<br />&nbsp;作&nbsp;&nbsp;&nbsp;用<br />&nbsp;&nbsp;传回节点ID&nbsp;符合指定值的节点。&nbsp;<br />&nbsp;基本语法<br />&nbsp;&nbsp;xmlDocumentNode&nbsp;＝&nbsp;xmlDocument.nodeFromID(idString);<br />&nbsp;<br />说&nbsp;&nbsp;&nbsp;明<br />&nbsp;&nbsp;idString&nbsp;是一个包含ID&nbsp;值的字符串。符合的节点必定是ID&nbsp;型态。若符合，将传回一个对象；若操作失败，则传回null。<br />&nbsp;<br />范&nbsp;&nbsp;&nbsp;例<br />&nbsp;objDocumentNode&nbsp;＝&nbsp;xmlDoc.nodeFromID("TO");<br />alert(objDocumentNode);<br />&nbsp;&nbsp;-------------------------------------------------------------------------------------<br />parsed&nbsp;方法&nbsp;<br />&nbsp;作&nbsp;&nbsp;&nbsp;用<br />&nbsp;&nbsp;会验证该指定的节点(node)及其衍生的子节点(descendants)是否已被解析过。&nbsp;<br />&nbsp;基本语法<br />&nbsp;&nbsp;boolValue&nbsp;＝&nbsp;xmlDocumentNode.parsed()；<br />&nbsp;<br />说&nbsp;&nbsp;&nbsp;明<br />&nbsp;&nbsp;如果全部的节点都已经被解析过了，则传回值为ture；如果有任何一个节点尚未被解析，传回值则为false。<br />&nbsp;<br />范&nbsp;&nbsp;&nbsp;例<br />&nbsp;currNode&nbsp;＝&nbsp;xmlDoc.documentElement.childNodes.item(0)；<br />boolValue&nbsp;＝&nbsp;currNode.parsed()；<br />alert(boolValue)；<br />&nbsp;&nbsp;-------------------------------------------------------------------------------------<br />removeChild&nbsp;方法&nbsp;<br />&nbsp;作&nbsp;&nbsp;&nbsp;用<br />&nbsp;&nbsp;会将指定的节点从节点清单中移除。&nbsp;<br />&nbsp;基本语法<br />&nbsp;&nbsp;objDocumentNode&nbsp;＝&nbsp;xmlDocumentNode.removeChild(oldChild);<br />&nbsp;<br />说&nbsp;&nbsp;&nbsp;明<br />&nbsp;&nbsp;oldChild&nbsp;为一个包含要被移除的节点对象。<br />&nbsp;<br />范&nbsp;&nbsp;&nbsp;例<br />&nbsp;objRemoveNode&nbsp;＝&nbsp;xmlDoc.documentElement.childNodes.item(3)；<br />alert(xmlDoc.xml);<br />xmlDoc.documentElement.removeChild(objRemoveNode)；<br />alert(xmlDoc.xml)；<br />&nbsp;&nbsp;-------------------------------------------------------------------------------------<br />replaceChild&nbsp;方法&nbsp;<br />&nbsp;作&nbsp;&nbsp;&nbsp;用<br />&nbsp;&nbsp;置换指定的旧子节点为提供的新子节点。&nbsp;<br />&nbsp;基本语法<br />&nbsp;&nbsp;objDocumentNode&nbsp;＝&nbsp;xmlDocumentNode.replaceChild(newChild,oldChild)；<br />&nbsp;<br />说&nbsp;&nbsp;&nbsp;明<br />&nbsp;&nbsp;newChild&nbsp;为包含新子节点的对象。如果此参数为null，则此旧子节点会被移除而不会被取代。oldChild&nbsp;为包含旧子节点的对象。<br />&nbsp;<br />范&nbsp;&nbsp;&nbsp;例<br />&nbsp;objOldNode&nbsp;＝&nbsp;xmlDoc.documentElement.childNodes.item(3)；<br />objNewNode&nbsp;＝&nbsp;xmlDoc.createComment("I've&nbsp;replaced&nbsp;the&nbsp;BCC&nbsp;element.")；<br />alert(xmlDoc.xml)；<br />xmlDoc.documentElement.replaceChild(objNewNode,objOldNode)；<br />alert(xmlDoc.xml)；<br />&nbsp;&nbsp;-------------------------------------------------------------------------------------<br />selectNodes&nbsp;方法&nbsp;<br />&nbsp;作&nbsp;&nbsp;&nbsp;用<br />&nbsp;&nbsp;传回所有符合提供样式(pattern)的节点。&nbsp;<br />&nbsp;基本语法<br />&nbsp;&nbsp;objDocumentNodeList&nbsp;＝&nbsp;xmlDocumentNode.selectNodes(patternString)；<br />&nbsp;<br />说&nbsp;&nbsp;&nbsp;明<br />&nbsp;&nbsp;patternString&nbsp;为一包含XSL&nbsp;样式的字符串。此方法会传回节点清单对象，包含符合样式的节点。如果没有符合的节点，则传回空的清单列表。<br />&nbsp;<br />范&nbsp;&nbsp;&nbsp;例<br />&nbsp;objNodeList＝xmlDoc.selectNodes（"/"）；<br />alert（objNodeList.item(0).xml）；<br />&nbsp;&nbsp;-------------------------------------------------------------------------------------<br />createNode&nbsp;方法&nbsp;<br />&nbsp;作&nbsp;&nbsp;&nbsp;用<br />&nbsp;&nbsp;建立一个指定型态、名称，及命名空间的新节点。&nbsp;<br />&nbsp;基本语法<br />&nbsp;&nbsp;xmlDocument.createNode(type,&nbsp;name,&nbsp;nameSpaceURI);<br />&nbsp;<br />说&nbsp;&nbsp;&nbsp;明<br />&nbsp;&nbsp;type&nbsp;用来确认要被建立的节点型态，name&nbsp;是一个字符串来确认新节点的名称，命名空间的前缀则是选择性的。nameSpaceURI&nbsp;是一个定义命名空间URI&nbsp;的字符串。如果前缀被包含在名称参数中，此节点会在nameSpaceURI&nbsp;的内文中以指定的前缀建立。如果不包含前缀，指定的命名空间会被视为预设的命名空间。<br />&nbsp;<br />范&nbsp;&nbsp;&nbsp;例<br />&nbsp;objNewNode&nbsp;＝&nbsp;xmlDoc.createNode(1,&nbsp;"TO",&nbsp;"");<br />alert(objNewNode.xml);<br />&nbsp;&nbsp;-------------------------------------------------------------------------------------<br />createProcessingInstruction&nbsp;方法&nbsp;<br />&nbsp;作&nbsp;&nbsp;&nbsp;用<br />&nbsp;&nbsp;建立一个新的处理指令，包含了指定的目标和数据。&nbsp;<br />&nbsp;基本语法<br />&nbsp;&nbsp;xmlDocument.createProcessingInstruction(target,&nbsp;data);<br />&nbsp;<br />说&nbsp;&nbsp;&nbsp;明<br />&nbsp;&nbsp;target&nbsp;是表示目标、名称或处理指令的字符串。Data&nbsp;是表示处理指令的值。一个新的处理指令被建立，但是并没有加到文件树中。要把处理指令加到文件树中，必须使用插入方法，例如：insertBefore、replaceChild，或是appendChild。<br />&nbsp;<br />范&nbsp;&nbsp;&nbsp;例<br />&nbsp;objNewPI&nbsp;＝xmlDoc.createProcessingInstruction(‘XML’,&nbsp;‘version＝"1.0"’);<br />alert(objNewPI.xml);<br />&nbsp;&nbsp;-------------------------------------------------------------------------------------<br />createTextNode&nbsp;方法&nbsp;<br />&nbsp;作&nbsp;&nbsp;&nbsp;用<br />&nbsp;&nbsp;建立一个新的text&nbsp;节点，并包含指定的数据。&nbsp;<br />&nbsp;基本语法<br />&nbsp;&nbsp;xmlDocument.createTextNode(data);<br />&nbsp;<br />说&nbsp;&nbsp;&nbsp;明<br />&nbsp;&nbsp;data&nbsp;是一个代表新text&nbsp;节点的字符串。一个新的text&nbsp;节点被建立，但是没有加到文件树中。若要将节点加到文件树中，必须使用插入方法，例如：insertBefore，replaceChild或appendChild。<br />&nbsp;<br />范&nbsp;&nbsp;&nbsp;例<br />&nbsp;objNewTextNode&nbsp;＝&nbsp;xmlDoc.createTextNode("This&nbsp;is&nbsp;a&nbsp;text&nbsp;node.");<br />alert(objNewTextNode.xml);<br />&nbsp;&nbsp;-------------------------------------------------------------------------------------<br /><br />getElementsByTagName&nbsp;方法&nbsp;<br />&nbsp;作&nbsp;&nbsp;&nbsp;用<br />&nbsp;&nbsp;传回指定名称的元素集合。&nbsp;<br />&nbsp;基本语法<br />&nbsp;&nbsp;objNodeList&nbsp;＝&nbsp;xmlDocument.getElementsByTagName(tagname);<br />&nbsp;<br />说&nbsp;&nbsp;&nbsp;明<br />&nbsp;&nbsp;tagname&nbsp;是一个字符串，代表找到的元素卷标名称。使用tagname&nbsp;"*"传回文件中所有找到的元素。<br />&nbsp;<br />范&nbsp;&nbsp;&nbsp;例<br />&nbsp;objNodeList&nbsp;＝&nbsp;xmlDoc.getElementsByTagName("*");<br />alert(objNodeList.item(1).xml);<br />&nbsp;&nbsp;-------------------------------------------------------------------------------------<br />haschildnodes&nbsp;方法&nbsp;<br />&nbsp;作&nbsp;&nbsp;&nbsp;用<br />&nbsp;&nbsp;如果指定的节点有一个或更多子节点，传回值为true。&nbsp;<br />&nbsp;基本语法<br />&nbsp;&nbsp;boolValue&nbsp;＝&nbsp;xmlDocumentNode.hasChildNodes()&nbsp;;<br />&nbsp;<br />说&nbsp;&nbsp;&nbsp;明<br />&nbsp;&nbsp;如果此节点有子节点传回值为true，否则传回false&nbsp;值。<br />&nbsp;<br />范&nbsp;&nbsp;&nbsp;例<br />&nbsp;boolValue&nbsp;＝&nbsp;xmlDoc.documentElement.hasChildNodes();<br />alert(boolValue);<br />&nbsp;&nbsp;-------------------------------------------------------------------------------------<br /><br />insertBefore&nbsp;方法&nbsp;<br />&nbsp;作&nbsp;&nbsp;&nbsp;用<br />&nbsp;&nbsp;在指定的节点前插入一个子节点。&nbsp;<br />&nbsp;基本语法<br />&nbsp;&nbsp;objDocumentNode&nbsp;＝&nbsp;xmlDocumentNode.insertBefore(newChild,refChild);<br />&nbsp;<br />说&nbsp;&nbsp;&nbsp;明<br />&nbsp;&nbsp;newChild&nbsp;是一个包含新子节点地址的对象，refChild&nbsp;是参照节点的地址。新子节点被插到参照节点之前。如果refChild&nbsp;参数没有包含在内，新的子节点会被插到子节点列表的末端。<br />&nbsp;<br />范&nbsp;&nbsp;&nbsp;例<br />&nbsp;objRefNode&nbsp;＝&nbsp;xmlDoc.documentElement;<br />alert(xmlDoc.xml);<br />objNewNode&nbsp;＝&nbsp;xmlDoc.createComment("This&nbsp;is&nbsp;a&nbsp;comment");<br />xmlDoc.insertBefore(objNewNode,&nbsp;objRefNode);<br />alert(xmlDoc.xml);<br />&nbsp;<br />&nbsp;-------------------------------------------------------------------------------------<br />selectSingleNode&nbsp;传回第一个符合样式的节点。&nbsp;<br />&nbsp;作&nbsp;&nbsp;&nbsp;用<br />&nbsp;&nbsp;传回第一个符合样式的节点。&nbsp;<br />&nbsp;基本语法<br />&nbsp;&nbsp;objDocumentNode&nbsp;＝&nbsp;xmlDocumentNode.selectSingleNode(patternString)；<br />&nbsp;<br />说&nbsp;&nbsp;&nbsp;明<br />&nbsp;&nbsp;patternString&nbsp;为一包含XSL&nbsp;样式的字符串。此方法会传回第一个符合的节点对象，如果没有符合的节点，则传回null。<br />&nbsp;<br />范&nbsp;&nbsp;&nbsp;例<br />&nbsp;objNode&nbsp;＝&nbsp;xmlDoc.selectSingleNode("EMAIL/BCC")；<br />alert(objNode.xml)；<br />&nbsp;&nbsp;-------------------------------------------------------------------------------------<br /><br />transformNode&nbsp;方法&nbsp;<br />&nbsp;作&nbsp;&nbsp;&nbsp;用<br />&nbsp;&nbsp;使用提供的样式表来处理该节点及其子节点。&nbsp;<br />&nbsp;基本语法<br />&nbsp;&nbsp;strTransformedDocument&nbsp;＝&nbsp;xmlDocumentNode.transformNode(stylesheet)；<br />&nbsp;<br />说&nbsp;&nbsp;&nbsp;明<br />&nbsp;&nbsp;stylesheet&nbsp;为一XML&nbsp;文件或是片断包含负责节点转换工作的XSL&nbsp;元素。此方法会传回一包含转换结果的字符串。<br />&nbsp;<br />范&nbsp;&nbsp;&nbsp;例<br />&nbsp;var&nbsp;style&nbsp;＝&nbsp;new&nbsp;ActiveXObject("Microsoft.XMLDOM")；<br />style.load("LstA_49.xsl")；<br />strTransform&nbsp;＝&nbsp;xmlDoc.transformNode(style.documentElement)；<br />alert(strTransform)；<br />&nbsp;<br /><br /><br /><br /><br />]]>
      </description>
      <category>JavaScript/DOM</category>
   </item>
   <item>
      <title>XMLDOM对象属性详解</title>
      <author>zhanghuiguoanlige@126.com</author>
      <link>http://dev.mo.cn/article_106.html</link>
      <pubDate>2008-8-11 2:53:41</pubDate>
      <guid>http://dev.mo.cn/article_106.html</guid>
      <description>
      <![CDATA[async&nbsp;属性&nbsp;<br /><br />作&nbsp;用&nbsp;async&nbsp;属性表示是否允许异步的下载。&nbsp;<br />基本语法&nbsp;boolValue&nbsp;＝&nbsp;XMLDocument.async;XMLDocument.async&nbsp;＝&nbsp;boolValue;<br />说&nbsp;明&nbsp;布尔值是可擦写的（read/write），如果准许异步下载，值为True；反之则为False。<br />范&nbsp;例<br /><br />xmlDoc.async&nbsp;＝&nbsp;"false";&nbsp;<br />alert(xmlDoc.async);&nbsp;<br /><br />=================================================<br /><br />attribute&nbsp;属性&nbsp;<br /><br />作&nbsp;用&nbsp;传回目前节点的属性列表。&nbsp;<br />基本语法&nbsp;objAttributeList&nbsp;=&nbsp;xmlNode.attributes;<br />说&nbsp;明&nbsp;传回一个物件。如果此节点不能包含属性，则传回空值。<br />范&nbsp;例&nbsp;<br /><br />objAttList&nbsp;＝&nbsp;xmlDoc.documentElement.attributes;&nbsp;<br />alert(objAttList);&nbsp;<br /><br />=================================================<br /><br />childNodes&nbsp;属性&nbsp;<br /><br />作&nbsp;用&nbsp;传回一个节点清单，包含该节点所有可用的子节点。&nbsp;<br />基本语法&nbsp;objNodeList=node.childNodes;<br />说&nbsp;明&nbsp;传回一个物件。假如这节点没有子节点，传回null。<br />范&nbsp;例&nbsp;<br /><br />objNodeList&nbsp;＝&nbsp;xmlDoc.childNodes;&nbsp;<br />alert(objNodeList);&nbsp;<br /><br />=================================================<br /><br />doctype&nbsp;属性&nbsp;<br /><br />作&nbsp;用&nbsp;传回文件型态节点，包含目前文件的DTD。这节点是一般的文件型态宣告，例如，节点，名为EMAIL&nbsp;的节点物件会被传回。&nbsp;<br />基本语法&nbsp;objDocType=xmlDocument.doctype;<br />说&nbsp;明&nbsp;传回一个对象，这个属性是只读的。假如这文件不包含DTD，会传回null。<br />范&nbsp;例&nbsp;<br /><br />objDocType&nbsp;＝&nbsp;xmlDoc.doctype;&nbsp;<br />alert(objDocType.nodeName);&nbsp;<br /><br />=================================================<br /><br />documentElement&nbsp;属性&nbsp;<br /><br />作&nbsp;用&nbsp;确认XML&nbsp;文件的根（Root）节点。&nbsp;<br />基本语法&nbsp;objDoc=xmlDocument.documentElement;<br />说&nbsp;明&nbsp;回一个在单一根文件元素中包含数据的对象。此属性可读/写，如果文件中不包含根节点，将传回null。<br />范&nbsp;例&nbsp;<br /><br />objDocRoot&nbsp;＝&nbsp;xmlDoc.documentElement;&nbsp;<br />alert(objDocRoot);&nbsp;<br /><br />=================================================<br /><br />firstChild&nbsp;属性&nbsp;<br /><br />作&nbsp;用&nbsp;确认在目前节点中的第一个子元素。&nbsp;<br />基本语法&nbsp;objFirstChild&nbsp;＝&nbsp;xmlDocNode.firstChild&nbsp;;<br />说&nbsp;明&nbsp;此属性只读且会传回一对象，如果节点中没有包含第一个子元素，将传回null。<br />范&nbsp;例&nbsp;<br /><br />objFirstChild&nbsp;＝&nbsp;xmlDoc.documentElement.firstChild;&nbsp;<br />alert(objFirstChild);&nbsp;<br /><br />=================================================<br /><br />implementation&nbsp;属性&nbsp;<br /><br />作&nbsp;用&nbsp;DOM&nbsp;应用程序能使用其它实作中的对象。implementation&nbsp;属性确认目前XML&nbsp;文件的DOMimplementation&nbsp;对象。&nbsp;<br />基本语法&nbsp;objImplementation&nbsp;＝&nbsp;xmlDocument.implementation;<br />说&nbsp;明&nbsp;此属性只读且传回一个对象。<br />范&nbsp;例&nbsp;<br /><br />objImp&nbsp;＝&nbsp;xmlDoc.implementation;&nbsp;<br />alert(objImp);&nbsp;<br /><br />=================================================<br /><br />lastChild&nbsp;属性&nbsp;<br /><br />作&nbsp;用&nbsp;确认目前节点中最后的子元素。&nbsp;<br />基本语法&nbsp;objLastChild&nbsp;＝&nbsp;xmlDocNode.lastChild;<br />说&nbsp;明&nbsp;此属性只读且传回一个对象。如果节点中没有包含最后子元素，将传回null。<br />范&nbsp;例&nbsp;<br /><br />objLastChild&nbsp;＝&nbsp;xmlDoc.documentElement.lastChild;&nbsp;<br />alert(objLastChild);&nbsp;<br /><br />=================================================<br /><br />nextSibling&nbsp;属性&nbsp;<br /><br />作&nbsp;用&nbsp;在目前文件节点的子节点列表中传回下一个兄弟节点。&nbsp;<br />基本语法&nbsp;objNextSibling&nbsp;＝&nbsp;xmlDocNode.nextSibling;<br />说&nbsp;明&nbsp;此属性是只读且传回一个对象。如果节点中没有包含其它的相关节点，会传回null。<br />范&nbsp;例&nbsp;<br /><br />objSibling&nbsp;＝&nbsp;xmlDoc.documentElement.childNodes.item(1)&nbsp;.nextSibling;&nbsp;<br />alert(objSibling);&nbsp;<br /><br />=================================================<br /><br />nodeName&nbsp;属性&nbsp;<br /><br />作&nbsp;用&nbsp;传回代表目前节点名称的字符串。&nbsp;<br />基本语法&nbsp;strNodeName&nbsp;＝&nbsp;xmlDocNode.nodeName&nbsp;;<br />说&nbsp;明&nbsp;传回一个字符串。这个属性是只读的，传回元素名称、属性或实体参照。<br />范&nbsp;例&nbsp;<br /><br />strNodeName&nbsp;＝&nbsp;xmlDoc.documentElement.nodeName;&nbsp;<br />alert(strNodeName);&nbsp;<br /><br />=================================================<br /><br />nodeType&nbsp;属性&nbsp;<br /><br />作&nbsp;用&nbsp;辨识节点的DOM&nbsp;型态。&nbsp;<br />基本语法&nbsp;numNodeType&nbsp;＝&nbsp;xmlDocNode.nodeType&nbsp;;<br />说&nbsp;明&nbsp;此属性只读且传回一个数值。&nbsp;<br /><br />有效的数值符合以下的型别：&nbsp;<br />1-ELEMENT&nbsp;<br />2-ATTRIBUTE&nbsp;<br />3-TEXT&nbsp;<br />4-CDATA&nbsp;<br />5-ENTITY&nbsp;REFERENCE&nbsp;<br />6-ENTITY&nbsp;<br />7-PI&nbsp;(processing&nbsp;instruction)&nbsp;<br />8-COMMENT&nbsp;<br />9-DOCUMENT&nbsp;<br />10-DOCUMENT&nbsp;TYPE&nbsp;<br />11-DOCUMENT&nbsp;FRAGMENT&nbsp;<br />12-NOTATION&nbsp;<br />　&nbsp;<br />范&nbsp;例&nbsp;<br /><br />numNodeType&nbsp;＝&nbsp;xmlDoc.documentElement.nodeType;&nbsp;<br />alert(numNodeType);&nbsp;<br /><br />=================================================<br /><br />nodeValue&nbsp;属性&nbsp;<br /><br />作&nbsp;用&nbsp;传回指定节点相关的文字。这并非一个元素中数据的值，而是与一个节点相关且未解析的文字，就像一个属性或者一个处理指令。&nbsp;<br />基本语法&nbsp;varNodeValue&nbsp;＝&nbsp;xmlDocNode.nodeValue;<br />说&nbsp;明&nbsp;传回的文字代表以节点的nodeType&nbsp;属性为主的型态值。（请参考附录中的nodeType&nbsp;属性。）因为节点型态可能是几种数据型态中的一种，传回值也因此有差异。传回null&nbsp;的节点型态有：DOCUMENT、ELEMENT、DOCUMENT&nbsp;TYPE、DOCUMENT&nbsp;FRAGMENT、ENTITY、ENTITY&nbsp;REFERENCE，和NOTATION。此属性可擦写。<br />范&nbsp;例&nbsp;<br /><br />varNodeValue&nbsp;＝&nbsp;xmlDoc.documentElement.nodeValue;&nbsp;<br />alert(varNodeValue);&nbsp;<br /><br />=================================================<br /><br />ondataavailable&nbsp;属性&nbsp;<br /><br />作&nbsp;用&nbsp;指定一个事件来处理ondataavailable&nbsp;事件。&nbsp;<br />基本语法&nbsp;xmlDocNode.ondataavailable&nbsp;＝&nbsp;value;<br />说&nbsp;明&nbsp;此属性是唯写，允许文件作者一旦数据为可用，即可尽快的使用数据来运作。<br />范&nbsp;例&nbsp;<br /><br />xmlDoc.ondataavailable&nbsp;＝&nbsp;alert("Data&nbsp;is&nbsp;now&nbsp;available.");&nbsp;<br /><br />=================================================<br /><br />onreadystatechange&nbsp;属性&nbsp;<br /><br />作&nbsp;用&nbsp;指定一个事件来处理onreadystatechange&nbsp;事件。这个事件能辨识readyState&nbsp;属性的改变。&nbsp;<br />基本语法&nbsp;xmlDocNode.onreadystatechange&nbsp;＝&nbsp;value;<br />说&nbsp;明&nbsp;此属性是唯写的，允许文件作者指定当readyState&nbsp;属性改变时呼叫事件。<br />范&nbsp;例&nbsp;<br /><br />xmlDoc.onreadystatechange&nbsp;＝&nbsp;alert("The&nbsp;readyState&nbsp;property&nbsp;has&nbsp;changed.");&nbsp;<br /><br />=================================================<br /><br />ownerDocument&nbsp;属性&nbsp;<br /><br />作&nbsp;用&nbsp;传回文件的根节点，包含目前节点。&nbsp;<br />基本语法&nbsp;objOwnerDoc&nbsp;＝&nbsp;xmlDocument.ownerDocument;<br />说&nbsp;明&nbsp;此属性是只读的，传回一个包含文件根节点的对象，包含特定的节点。<br />范&nbsp;例&nbsp;<br /><br />objOwnerDoc&nbsp;＝&nbsp;xmlDoc.childNodes.item(2).ownerDocument;&nbsp;<br />alert(objOwnerDoc);&nbsp;<br /><br />=================================================<br /><br />parentNode&nbsp;属性&nbsp;<br /><br />作&nbsp;用&nbsp;传回目前节点的父节点。只能应用在有父节点的节点中。&nbsp;<br />基本语法&nbsp;objParentNode&nbsp;＝&nbsp;xmlDocumentNode.parentNode;<br />说&nbsp;明&nbsp;此属性是只读的，传回包含指定节点的父节点对象。如果此节点不存在于文件树中，将传回null。<br />范&nbsp;例&nbsp;<br /><br />objParentNode&nbsp;＝&nbsp;xmlDoc.childNodes.item(1).parentNode;&nbsp;<br />alert(objParentNode);&nbsp;<br /><br />=================================================<br /><br />parseError&nbsp;属性&nbsp;<br /><br />作&nbsp;用&nbsp;传回一个DOM&nbsp;解析错误对象，此对象描述最后解析错误的讯息。&nbsp;<br />基本语法&nbsp;objParseErr&nbsp;＝&nbsp;xmlDocument.parseError;<br />说&nbsp;明&nbsp;此属性是只读的。如果没有错误发生，将传回0。<br />范&nbsp;例&nbsp;<br /><br />objParseErr&nbsp;＝&nbsp;xmlDoc.parseError;&nbsp;<br />alert(objParseErr);&nbsp;<br /><br />=================================================<br /><br />previousSibling&nbsp;属性&nbsp;<br /><br />作&nbsp;用&nbsp;传回目前节点之前的兄弟节点。&nbsp;<br />基本语法&nbsp;objPrevSibling&nbsp;＝&nbsp;xmlDocument.previousSibling;<br />说&nbsp;明&nbsp;传回一个对象，这个属性是只读的。若该节点没有包含前面的兄弟节点，会传回null。<br />范&nbsp;例&nbsp;<br /><br />objPrevSibling&nbsp;＝&nbsp;xmlDoc.documentElement.childNodes.item(3).previousSibling;&nbsp;<br />alert(objPrevSibling);&nbsp;<br /><br />=================================================<br /><br />readyState&nbsp;属性&nbsp;<br /><br />作&nbsp;用&nbsp;传回XML&nbsp;文件资料的目前状况。&nbsp;<br />基本语法&nbsp;intState&nbsp;＝&nbsp;xmlDocument.readyState;<br />说&nbsp;明&nbsp;这个属性是只读的，传回值有以下的可能：&nbsp;<br />0-UNINITIALIZED：XML&nbsp;对象被产生，但没有任何文件被加载。&nbsp;<br />1-LOADING：加载程序进行中，但文件尚未开始解析。&nbsp;<br />2-LOADED：部分的文件已经加载且进行解析，但对象模型尚未生效。&nbsp;<br />3-INTERACTIVE：仅对已加载的部分文件有效，在此情况下，对象模型是有效但只读的。&nbsp;<br />4-COMPLETED：文件已完全加载，代表加载成功。&nbsp;<br />范&nbsp;例&nbsp;<br /><br />alert("The&nbsp;readyState&nbsp;property&nbsp;is&nbsp;"&nbsp;+&nbsp;xmlDoc.readyState);&nbsp;<br /><br />=================================================<br /><br />url&nbsp;属性&nbsp;<br /><br />作&nbsp;用&nbsp;传回最近一次加载XML&nbsp;文件的URL。&nbsp;<br />基本语法&nbsp;strDocUrl&nbsp;＝&nbsp;xmlDocument.url;<br />说&nbsp;明&nbsp;这个属性是只读的，传回最近一次加载成功文件的URL，若文件仅存在主存储器中（表示该文件并非由外部档案加载)，则传回null。<br />范&nbsp;例&nbsp;<br /><br />alert(xmlDoc.url);&nbsp;<br /><br />=================================================<br /><br />validateOnParse&nbsp;属性&nbsp;<br /><br />作&nbsp;用&nbsp;告诉解析器文件是否有效。&nbsp;<br />基本语法&nbsp;boolValidate&nbsp;＝&nbsp;xmlDocument.validateOnParse;&nbsp;xmlDocument.validateOnParse&nbsp;=&nbsp;boolValidate;&nbsp;<br />说&nbsp;明&nbsp;此属性是可擦写的。如果传回值为true，表示文件被解析时被确认是有效的。如果传回false，表示文件是无效的，并被认为只是标准格式的（well-formed）文件。<br />范&nbsp;例&nbsp;<br /><br />xmlDoc.validateOnParse&nbsp;＝&nbsp;true;&nbsp;<br />alert(xmlDoc.validateOnParse);&nbsp;<br /><br />=================================================<br /><br />xml&nbsp;属性&nbsp;<br /><br />作&nbsp;用&nbsp;传回指定节点的XML&nbsp;描述和所有的子节点。&nbsp;<br />基本语法&nbsp;xmlValue&nbsp;＝&nbsp;xmlDocumentNode.xml;<br />说&nbsp;明&nbsp;此属性是只读的。<br />范&nbsp;例&nbsp;<br /><br />xmlValue&nbsp;＝&nbsp;xmlDoc.documentElement.xml;&nbsp;<br />alert(xmlValue);&nbsp;<br /><br /><br />]]>
      </description>
      <category>JavaScript/DOM</category>
   </item>
   <item>
      <title>操作Xml数据的Cls_Person类说明</title>
      <author>zhanghuiguoanlige@126.com</author>
      <link>http://dev.mo.cn/article_104.html</link>
      <pubDate>2008-8-10 3:06:50</pubDate>
      <guid>http://dev.mo.cn/article_104.html</guid>
      <description>
      <![CDATA[<br />Cls_Person类用来完成与联系人信息相关的各种操作,包括添加,修改和删除等等,它使用VBScript编写.Cls_Person包括Id,Name,Nick,Mobile,Tel,Email,QQ和Company属性,对应于XML文件中的Person节点.Cls_Person包括GetInfoFromXml,AddToXml,EditToXml和DeleteFormXml四个主要方法,分别完成获取信息,添加信息,修改信息和删除信息四个功能.&nbsp;<br /><br />Cls_Person的具体实现如下,<br /><div class="code"><div class="code_title"><span> &nbsp;<img src="images/code.gif" alt="" style="padding:0px;border:0px;" /></span>&nbsp;&nbsp;&nbsp;<a href="javascript:void(0);" onclick="window.clipboardData.setData('Text',this.parentNode.parentNode.childNodes[1].outerText);alert('븴Ƴɹ,Ctrl+VճҪλ!!');">ȫ</a></div><div class="code_content">&nbsp;<br />'***************************************************&nbsp;<br />'&nbsp;说明：Person类&nbsp;<br />'&nbsp;作者：gwd&nbsp;2002-11-06&nbsp;<br />'&nbsp;引用：pub/constpub.asp&nbsp;<br />'***************************************************&nbsp;<br />Class&nbsp;Cls_Person&nbsp;<br />Private&nbsp;m_intId&nbsp;'&nbsp;Id,对应Person节点在Persons集合中的位置&nbsp;<br />Private&nbsp;m_strName&nbsp;'&nbsp;姓名&nbsp;<br />Private&nbsp;m_strNick&nbsp;'&nbsp;英文名&nbsp;<br />Private&nbsp;m_strMobile&nbsp;'&nbsp;手机&nbsp;<br />Private&nbsp;m_strTel&nbsp;'&nbsp;电话&nbsp;<br />Private&nbsp;m_strEmail&nbsp;'&nbsp;电子邮件&nbsp;<br />Private&nbsp;m_strQQ&nbsp;'&nbsp;QQ号&nbsp;<br />Private&nbsp;m_strCompany&nbsp;'&nbsp;所在公司&nbsp;<br />Private&nbsp;m_strError&nbsp;'&nbsp;出错信息&nbsp;<br />'&nbsp;类初始化&nbsp;<br />Private&nbsp;Sub&nbsp;Class_Initialize()&nbsp;<br />　m_strError&nbsp;=&nbsp;""&nbsp;<br />　m_intId&nbsp;=&nbsp;-1&nbsp;<br />End&nbsp;Sub&nbsp;<br />'&nbsp;类释放&nbsp;<br />Private&nbsp;Sub&nbsp;Class_Terminate()&nbsp;<br />　m_strError&nbsp;=&nbsp;""&nbsp;<br />End&nbsp;Sub&nbsp;<br />'-----读写各个属性---------------------------&nbsp;<br />Public&nbsp;Property&nbsp;Get&nbsp;Id&nbsp;<br />　Id&nbsp;=&nbsp;m_intId&nbsp;<br />End&nbsp;Property&nbsp;<br />Public&nbsp;Property&nbsp;Let&nbsp;Id(intId)&nbsp;<br />　m_intId&nbsp;=&nbsp;intId&nbsp;<br />End&nbsp;Property&nbsp;<br />Public&nbsp;Property&nbsp;Get&nbsp;Name&nbsp;<br />Name&nbsp;=&nbsp;m_strName&nbsp;<br />End&nbsp;Property&nbsp;<br />Public&nbsp;Property&nbsp;Let&nbsp;Name(strName)&nbsp;<br />　m_strName&nbsp;=&nbsp;strName&nbsp;<br />End&nbsp;Property&nbsp;<br />Public&nbsp;Property&nbsp;Get&nbsp;Nick&nbsp;<br />　Nick&nbsp;=&nbsp;m_strNick&nbsp;<br />End&nbsp;Property&nbsp;<br />Public&nbsp;Property&nbsp;Let&nbsp;Nick(strNick)&nbsp;<br />　m_strNick&nbsp;=&nbsp;strNick&nbsp;<br />End&nbsp;Property&nbsp;<br />Public&nbsp;Property&nbsp;Get&nbsp;Mobile&nbsp;<br />　Mobile&nbsp;=&nbsp;m_strMobile&nbsp;<br />End&nbsp;Property&nbsp;<br />Public&nbsp;Property&nbsp;Let&nbsp;Mobile(strMobile)&nbsp;<br />　m_strMobile&nbsp;=&nbsp;strMobile&nbsp;<br />End&nbsp;Property&nbsp;<br />Public&nbsp;Property&nbsp;Get&nbsp;Tel&nbsp;<br />　Tel&nbsp;=&nbsp;m_strTel&nbsp;<br />End&nbsp;Property&nbsp;<br />Public&nbsp;Property&nbsp;Let&nbsp;Tel(strTel)&nbsp;<br />　m_strTel&nbsp;=&nbsp;strTel&nbsp;<br />End&nbsp;Property&nbsp;<br />Public&nbsp;Property&nbsp;Get&nbsp;Email&nbsp;<br />　Email&nbsp;=&nbsp;m_strEmail&nbsp;<br />End&nbsp;Property&nbsp;<br />Public&nbsp;Property&nbsp;Let&nbsp;Email(strEmail)&nbsp;<br />　m_strEmail&nbsp;=&nbsp;strEmail&nbsp;<br />End&nbsp;Property&nbsp;<br />Public&nbsp;Property&nbsp;Get&nbsp;QQ&nbsp;<br />　QQ&nbsp;=&nbsp;m_strQQ&nbsp;<br />End&nbsp;Property&nbsp;<br />Public&nbsp;Property&nbsp;Let&nbsp;QQ(strQQ)&nbsp;<br />　m_strQQ&nbsp;=&nbsp;strQQ&nbsp;<br />End&nbsp;Property&nbsp;<br />Public&nbsp;Property&nbsp;Get&nbsp;Company&nbsp;<br />　Company&nbsp;=&nbsp;m_strCompany&nbsp;<br />End&nbsp;Property&nbsp;<br />Public&nbsp;Property&nbsp;Let&nbsp;Company(strCompany)&nbsp;<br />　m_strCompany&nbsp;=&nbsp;strCompany&nbsp;<br />End&nbsp;Property&nbsp;<br />'-----------------------------------------------&nbsp;<br />'&nbsp;获取错误信息&nbsp;<br />Public&nbsp;Function&nbsp;GetLastError()&nbsp;<br />　GetLastError&nbsp;=&nbsp;m_strError&nbsp;<br />End&nbsp;Function&nbsp;<br />'&nbsp;私有方法,添加错误信息&nbsp;<br />Private&nbsp;Sub&nbsp;AddErr(strEcho)&nbsp;<br />　m_strError&nbsp;=&nbsp;m_strError&nbsp;+&nbsp;"＜Div&nbsp;CLASS=""alert""＞"&nbsp;&&nbsp;strEcho&nbsp;&&nbsp;"＜/Div＞"&nbsp;<br />End&nbsp;Sub&nbsp;<br />'&nbsp;清除错误信息&nbsp;<br />Public&nbsp;Function&nbsp;ClearError()&nbsp;<br />　m_strError&nbsp;=&nbsp;""&nbsp;<br />End&nbsp;Function&nbsp;<br />'&nbsp;从Xml中读取指定节点的数据,并填充各个属性&nbsp;<br />'&nbsp;需要首先设置Id&nbsp;<br />Public&nbsp;Function&nbsp;GetInfoFromXml(objXmlDoc)&nbsp;<br />　Dim&nbsp;objNodeList&nbsp;<br />　Dim&nbsp;I&nbsp;<br />　ClearError&nbsp;<br />　If&nbsp;objXmlDoc&nbsp;Is&nbsp;Nothing&nbsp;Then&nbsp;<br />　　GetInfoFromXml&nbsp;=&nbsp;False&nbsp;<br />　　AddErr&nbsp;"Dom对象为空值"&nbsp;<br />　　Exit&nbsp;Function&nbsp;<br />　End&nbsp;If&nbsp;<br />　If&nbsp;CStr(m_intId)&nbsp;=&nbsp;"-1"&nbsp;Then&nbsp;<br />　　GetInfoFromXml&nbsp;=&nbsp;False&nbsp;<br />　　AddErr&nbsp;"未正确设置联系人对象的ID属性"&nbsp;<br />　　Exit&nbsp;Function&nbsp;<br />　Else&nbsp;<br />　　I&nbsp;=&nbsp;m_intId&nbsp;-&nbsp;1&nbsp;'&nbsp;要读取得节点位置&nbsp;<br />　End&nbsp;If&nbsp;<br />　'&nbsp;选择并读取节点信息,赋予各个属性&nbsp;<br />　Set&nbsp;objNodeList&nbsp;=&nbsp;objXmlDoc.getElementsByTagName("Person")&nbsp;<br />　If&nbsp;objNodeList.length&nbsp;-&nbsp;m_intId&nbsp;＞=&nbsp;0&nbsp;Then&nbsp;<br />　　On&nbsp;Error&nbsp;Resume&nbsp;Next&nbsp;<br />　　m_strName&nbsp;=&nbsp;objNodeList(I).selectSingleNode("Name").Text&nbsp;<br />　　m_strNick&nbsp;=&nbsp;objNodeList(I).selectSingleNode("Nick").Text&nbsp;<br />　　m_strMobile&nbsp;=&nbsp;objNodeList(I).selectSingleNode("Mobile").Text&nbsp;<br />　　m_strTel&nbsp;=&nbsp;objNodeList(I).selectSingleNode("Tel").Text&nbsp;<br />　　m_strEmail&nbsp;=&nbsp;objNodeList(I).selectSingleNode("Email").Text&nbsp;<br />　　m_strQQ&nbsp;=&nbsp;objNodeList(I).selectSingleNode("QQ").Text&nbsp;<br />　　m_strCompany&nbsp;=&nbsp;objNodeList(I).selectSingleNode("Company").Text&nbsp;<br />　　GetInfoFromXml&nbsp;=&nbsp;True&nbsp;<br />　Else&nbsp;<br />　　GetInfoFromXml&nbsp;=&nbsp;False&nbsp;<br />　　AddErr&nbsp;"获取联系信息发生错误"&nbsp;<br />　　Set&nbsp;objNodeList&nbsp;=&nbsp;Nothing&nbsp;<br />　　Exit&nbsp;Function&nbsp;<br />　End&nbsp;If&nbsp;<br />　Set&nbsp;objNodeList&nbsp;=&nbsp;Nothing&nbsp;<br />End&nbsp;Function&nbsp;<br />'&nbsp;添加信息到XML文件中&nbsp;<br />'&nbsp;需要首先设置好要填充的属性&nbsp;<br />Public&nbsp;Function&nbsp;AddToXml(objXmlDoc)&nbsp;<br />　Dim&nbsp;objPerson,&nbsp;objNode&nbsp;<br />　ClearError&nbsp;<br />　If&nbsp;objXmlDoc&nbsp;Is&nbsp;Nothing&nbsp;Then&nbsp;<br />　　AddToXml&nbsp;=&nbsp;False&nbsp;<br />　　AddErr&nbsp;"Dom对象为空值"&nbsp;<br />　　Exit&nbsp;Function&nbsp;<br />　End&nbsp;If&nbsp;<br />　'&nbsp;创建Person节点&nbsp;<br />　Set&nbsp;objPerson&nbsp;=&nbsp;objXmlDoc.createElement("Person")&nbsp;<br />　objXmlDoc.documentElement.appendChild&nbsp;objPerson&nbsp;<br />　'&nbsp;创建各个子节点&nbsp;<br />　'-----------------------------------------------------&nbsp;<br />　Set&nbsp;objNode&nbsp;=&nbsp;objXmlDoc.createElement("Name")&nbsp;<br />　objNode.Text&nbsp;=&nbsp;m_strName&nbsp;<br />　objPerson.appendChild&nbsp;objNode&nbsp;<br />　Set&nbsp;objNode&nbsp;=&nbsp;objXmlDoc.createElement("Nick")&nbsp;<br />　objNode.Text&nbsp;=&nbsp;m_strNick&nbsp;<br />　objPerson.appendChild&nbsp;objNode&nbsp;<br />　Set&nbsp;objNode&nbsp;=&nbsp;objXmlDoc.createElement("Mobile")&nbsp;<br />　objNode.Text&nbsp;=&nbsp;m_strMobile&nbsp;<br />　objPerson.appendChild&nbsp;objNode&nbsp;<br />　Set&nbsp;objNode&nbsp;=&nbsp;objXmlDoc.createElement("Tel")&nbsp;<br />　objNode.Text&nbsp;=&nbsp;m_strTel&nbsp;<br />　objPerson.appendChild&nbsp;objNode&nbsp;<br />　Set&nbsp;objNode&nbsp;=&nbsp;objXmlDoc.createElement("Email")&nbsp;<br />　objNode.Text&nbsp;=&nbsp;m_strEmail&nbsp;<br />　objPerson.appendChild&nbsp;objNode&nbsp;<br />　Set&nbsp;objNode&nbsp;=&nbsp;objXmlDoc.createElement("QQ")&nbsp;<br />　objNode.Text&nbsp;=&nbsp;m_strQQ&nbsp;<br />　objPerson.appendChild&nbsp;objNode&nbsp;<br />　Set&nbsp;objNode&nbsp;=&nbsp;objXmlDoc.createElement("Company")&nbsp;<br />　objNode.Text&nbsp;=&nbsp;m_strCompany&nbsp;<br />　objPerson.appendChild&nbsp;objNode&nbsp;<br />　'-----------------------------------------------------&nbsp;<br />　Set&nbsp;objNode&nbsp;=&nbsp;Nothing&nbsp;<br />　Set&nbsp;objPerson&nbsp;=&nbsp;Nothing&nbsp;<br />　&nbsp;On&nbsp;Error&nbsp;Resume&nbsp;Next&nbsp;<br />　objXmlDoc.save&nbsp;Server.MapPath(C_XMLFILE)&nbsp;'保存XML文件&nbsp;<br />　If&nbsp;Err.Number&nbsp;=&nbsp;0&nbsp;Then&nbsp;<br />　　AddToXml&nbsp;=&nbsp;True&nbsp;<br />　Else&nbsp;<br />　　AddToXml&nbsp;=&nbsp;False&nbsp;<br />　　AddErr&nbsp;Err.Description&nbsp;<br />　End&nbsp;If&nbsp;<br />End&nbsp;Function&nbsp;<br />'&nbsp;从XML文件中删除数据&nbsp;<br />'&nbsp;需要首先设置Id&nbsp;<br />Public&nbsp;Function&nbsp;DeleteFromXml(objXmlDoc)&nbsp;<br />　Dim&nbsp;objNodeList,&nbsp;objNode&nbsp;<br />　ClearError&nbsp;<br />　If&nbsp;objXmlDoc&nbsp;Is&nbsp;Nothing&nbsp;Then&nbsp;<br />　　DeleteFromXml&nbsp;=&nbsp;False&nbsp;<br />　　AddErr&nbsp;"Dom对象为空值"&nbsp;<br />　　Exit&nbsp;Function&nbsp;<br />　End&nbsp;If&nbsp;<br />　If&nbsp;CStr(m_intId)&nbsp;=&nbsp;"-1"&nbsp;Then&nbsp;<br />　　DeleteFromXml&nbsp;=&nbsp;False&nbsp;<br />　　AddErr&nbsp;"未正确设置联系人对象的ID属性"&nbsp;<br />　　Exit&nbsp;Function&nbsp;<br />　End&nbsp;If&nbsp;<br />　Set&nbsp;objNodeList&nbsp;=&nbsp;objXmlDoc.getElementsByTagName("Person")&nbsp;<br />　If&nbsp;objNodeList.length&nbsp;-&nbsp;m_intId&nbsp;＜&nbsp;0&nbsp;Then&nbsp;<br />　　DeleteFromXml&nbsp;=&nbsp;False&nbsp;<br />　　AddErr&nbsp;"未找到相应的联系人"&nbsp;<br />　　Set&nbsp;objNodeList&nbsp;=&nbsp;Nothing&nbsp;<br />　　Exit&nbsp;Function&nbsp;<br />　End&nbsp;If&nbsp;<br />　On&nbsp;Error&nbsp;Resume&nbsp;Next&nbsp;<br />　Set&nbsp;objNode&nbsp;=&nbsp;objXmlDoc.documentElement.removeChild(objNodeList(intId-1))&nbsp;<br />　If&nbsp;objNode&nbsp;Is&nbsp;Nothing&nbsp;Then&nbsp;<br />　　DeleteFromXml&nbsp;=&nbsp;False&nbsp;<br />　　AddErr&nbsp;"删除联系人失败"&nbsp;<br />　　Set&nbsp;objNodeList&nbsp;=&nbsp;Nothing&nbsp;<br />　　Exit&nbsp;Function&nbsp;<br />　Else&nbsp;<br />　　objXmlDoc.save&nbsp;Server.MapPath(C_XMLFILE)&nbsp;<br />　End&nbsp;If&nbsp;<br />　Set&nbsp;objNode&nbsp;=&nbsp;Nothing&nbsp;<br />　Set&nbsp;objNodeList&nbsp;=&nbsp;Nothing&nbsp;<br />　If&nbsp;Err.Number&nbsp;=&nbsp;0&nbsp;Then&nbsp;<br />　　DeleteFromXml&nbsp;=&nbsp;True&nbsp;<br />　Else&nbsp;<br />　　DeleteFromXml&nbsp;=&nbsp;False&nbsp;<br />　　AddErr&nbsp;Err.Description&nbsp;<br />　End&nbsp;If&nbsp;<br />End&nbsp;Function&nbsp;<br />'&nbsp;修改XML文件中的数据&nbsp;<br />'&nbsp;需要首先设置好Id&nbsp;<br />Public&nbsp;Function&nbsp;EditToXml(objXmlDoc)&nbsp;<br />　Dim&nbsp;objPersonList,&nbsp;objOldPerson,&nbsp;objNewPerson,&nbsp;objNode&nbsp;<br />　ClearError&nbsp;<br />　If&nbsp;objXmlDoc&nbsp;Is&nbsp;Nothing&nbsp;Then&nbsp;<br />　　EditToXml&nbsp;=&nbsp;False&nbsp;<br />　　AddErr&nbsp;"Dom对象为空值"&nbsp;<br />　　Exit&nbsp;Function&nbsp;<br />　End&nbsp;If&nbsp;<br />　If&nbsp;CStr(m_intId)&nbsp;=&nbsp;"-1"&nbsp;Then&nbsp;<br />　　EditToXml&nbsp;=&nbsp;False&nbsp;<br />　　AddErr&nbsp;"未正确设置联系人对象的ID属性"&nbsp;<br />　　Exit&nbsp;Function&nbsp;<br />　End&nbsp;If&nbsp;<br />　Set&nbsp;objPersonList&nbsp;=&nbsp;objXmlDoc.getElementsByTagName("Person")&nbsp;<br />　If&nbsp;objPersonList.length&nbsp;-&nbsp;m_intId&nbsp;＜&nbsp;0&nbsp;Then&nbsp;<br />　　DeleteFromXml&nbsp;=&nbsp;False&nbsp;<br />　　AddErr&nbsp;"未找到相应的联系人"&nbsp;<br />　　Set&nbsp;objPersonList&nbsp;=&nbsp;Nothing&nbsp;<br />　　Exit&nbsp;Function&nbsp;<br />　End&nbsp;If&nbsp;<br />　Set&nbsp;objOldPerson&nbsp;=&nbsp;objPersonList(m_intId-1)&nbsp;'&nbsp;要修改的旧节点&nbsp;<br />　Set&nbsp;objNewPerson&nbsp;=&nbsp;objXmlDoc.createElement("Person")&nbsp;'&nbsp;用来替换旧节点的新节点&nbsp;<br />　Set&nbsp;objNode&nbsp;=&nbsp;objXmlDoc.createElement("Name")&nbsp;<br />　objNode.Text&nbsp;=&nbsp;m_strName&nbsp;<br />　objNewPerson.appendChild&nbsp;objNode&nbsp;<br />　Set&nbsp;objNode&nbsp;=&nbsp;objXmlDoc.createElement("Nick")&nbsp;<br />　objNode.Text&nbsp;=&nbsp;m_strNick&nbsp;<br />　objNewPerson.appendChild&nbsp;objNode&nbsp;<br />　Set&nbsp;objNode&nbsp;=&nbsp;objXmlDoc.createElement("Mobile")&nbsp;<br />　objNode.Text&nbsp;=&nbsp;m_strMobile&nbsp;<br />　objNewPerson.appendChild&nbsp;objNode&nbsp;<br />　Set&nbsp;objNode&nbsp;=&nbsp;objXmlDoc.createElement("Tel")&nbsp;<br />　objNode.Text&nbsp;=&nbsp;m_strTel&nbsp;<br />　objNewPerson.appendChild&nbsp;objNode&nbsp;<br />　Set&nbsp;objNode&nbsp;=&nbsp;objXmlDoc.createElement("Email")&nbsp;<br />　objNode.Text&nbsp;=&nbsp;m_strEmail&nbsp;<br />　objNewPerson.appendChild&nbsp;objNode&nbsp;<br />　Set&nbsp;objNode&nbsp;=&nbsp;objXmlDoc.createElement("QQ")&nbsp;<br />　objNode.Text&nbsp;=&nbsp;m_strQQ&nbsp;<br />　objNewPerson.appendChild&nbsp;objNode&nbsp;<br />　Set&nbsp;objNode&nbsp;=&nbsp;objXmlDoc.createElement("Company")&nbsp;<br />　objNode.Text&nbsp;=&nbsp;m_strCompany&nbsp;<br />　objNewPerson.appendChild&nbsp;objNode&nbsp;<br />　On&nbsp;Error&nbsp;Resume&nbsp;Next&nbsp;<br />　'&nbsp;进行替换&nbsp;<br />　Set&nbsp;objNode&nbsp;=&nbsp;objXmlDoc.documentElement.replaceChild(objNewPerson,&nbsp;objOldPerson)&nbsp;<br />　If&nbsp;objNode&nbsp;Is&nbsp;Nothing&nbsp;Then&nbsp;<br />　EditToXml&nbsp;=&nbsp;False&nbsp;<br />　AddErr&nbsp;"修改联系人失败"&nbsp;<br />　Set&nbsp;objOldPerosn&nbsp;=&nbsp;Nothing&nbsp;<br />　Set&nbsp;objNewPerson&nbsp;=&nbsp;Nothing&nbsp;<br />　Set&nbsp;objPersonList&nbsp;=&nbsp;Nothing&nbsp;<br />　Exit&nbsp;Function&nbsp;<br />Else&nbsp;<br />　objXmlDoc.save&nbsp;Server.MapPath(C_XMLFILE)&nbsp;<br />End&nbsp;If&nbsp;<br />Set&nbsp;objOldPerson&nbsp;=&nbsp;Nothing&nbsp;<br />Set&nbsp;objNewPerson&nbsp;=&nbsp;Nothing&nbsp;<br />Set&nbsp;objPersonList&nbsp;=&nbsp;Nothing&nbsp;<br />If&nbsp;Err.Number&nbsp;=&nbsp;0&nbsp;Then&nbsp;<br />　EditToXml&nbsp;=&nbsp;True&nbsp;<br />Else&nbsp;<br />　EditToXml&nbsp;=&nbsp;False&nbsp;<br />　AddErr&nbsp;Err.Description&nbsp;<br />End&nbsp;If&nbsp;<br />End&nbsp;Function&nbsp;<br />End&nbsp;Class&nbsp;<br /></div></div><br /><br /><br />]]>
      </description>
      <category>JavaScript/DOM</category>
   </item>
   <item>
      <title>IE/Firefox兼容性汇总(JavaScript)</title>
      <author>zhanghuiguoanlige@126.com</author>
      <link>http://dev.mo.cn/article_82.html</link>
      <pubDate>2008-7-8 4:03:51</pubDate>
      <guid>http://dev.mo.cn/article_82.html</guid>
      <description>
      <![CDATA[以下以&nbsp;IE&nbsp;代替&nbsp;Internet&nbsp;Explorer，以&nbsp;MF&nbsp;代替&nbsp;Mozzila&nbsp;Firefox<br /><br />1.&nbsp;document.form.item&nbsp;问题<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(1)现有问题：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;现有代码中存在许多&nbsp;document.formName.item("itemName")&nbsp;这样的语句，不能在&nbsp;MF&nbsp;下运行<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(2)解决方法：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;改用&nbsp;document.formName.elements["elementName"]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(3)其它<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;参见&nbsp;2<br /><br />2.&nbsp;集合类对象问题<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(1)现有问题：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;现有代码中许多集合类对象取用时使用&nbsp;()，IE&nbsp;能接受，MF&nbsp;不能。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(2)解决方法：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;改用&nbsp;[]&nbsp;作为下标运算。如：document.forms("formName")&nbsp;改为&nbsp;document.forms["formName"]。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;又如：document.getElementsByName("inputName")(1)&nbsp;改为&nbsp;document.getElementsByName("inputName")[1]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(3)其它<br /><br />3.&nbsp;window.event<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(1)现有问题：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;使用&nbsp;window.event&nbsp;无法在&nbsp;MF&nbsp;上运行<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(2)解决方法：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MF&nbsp;的&nbsp;event&nbsp;只能在事件发生的现场使用，此问题暂无法解决。可以这样变通：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;原代码(可在IE中运行)：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;input&nbsp;type="button"&nbsp;name="someButton"&nbsp;value="提交"&nbsp;onclick=""/&gt;<br />&nbsp;&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;&nbsp;&lt;script&nbsp;language="javascript"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;gotoSubmit()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(window.event);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;use&nbsp;window.event<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/script&gt;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;新代码(可在IE和MF中运行)：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;input&nbsp;type="button"&nbsp;name="someButton"&nbsp;value="提交"&nbsp;onclick=""/&gt;<br />&nbsp;&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;&nbsp;&lt;script&nbsp;language="javascript"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;gotoSubmit(evt)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;evt&nbsp;=&nbsp;evt&nbsp;?&nbsp;evt&nbsp;:&nbsp;(window.event&nbsp;?&nbsp;window.event&nbsp;:&nbsp;null);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(evt);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;use&nbsp;evt<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/script&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;此外，如果新代码中第一行不改，与老代码一样的话(即&nbsp;gotoSubmit&nbsp;调用没有给参数)，则仍然只能在IE中运行，但不会出错。所以，这种方案&nbsp;tpl&nbsp;部分仍与老代码兼容。<br /><br />4.&nbsp;HTML&nbsp;对象的&nbsp;id&nbsp;作为对象名的问题<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(1)现有问题<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在&nbsp;IE&nbsp;中，HTML&nbsp;对象的&nbsp;ID&nbsp;可以作为&nbsp;document&nbsp;的下属对象变量名直接使用。在&nbsp;MF&nbsp;中不能。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(2)解决方法<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用&nbsp;getElementById("idName")&nbsp;代替&nbsp;idName&nbsp;作为对象变量使用。<br /><br />5.&nbsp;用idName字符串取得对象的问题<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(1)现有问题<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在IE中，利用&nbsp;eval(idName)&nbsp;可以取得&nbsp;id&nbsp;为&nbsp;idName&nbsp;的&nbsp;HTML&nbsp;对象，在MF&nbsp;中不能。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(2)解决方法<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用&nbsp;getElementById(idName)&nbsp;代替&nbsp;eval(idName)。<br /><br />6.&nbsp;变量名与某&nbsp;HTML&nbsp;对象&nbsp;id&nbsp;相同的问题<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(1)现有问题<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在&nbsp;MF&nbsp;中，因为对象&nbsp;id&nbsp;不作为&nbsp;HTML&nbsp;对象的名称，所以可以使用与&nbsp;HTML&nbsp;对象&nbsp;id&nbsp;相同的变量名，IE&nbsp;中不能。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(2)解决方法<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在声明变量时，一律加上&nbsp;var&nbsp;，以避免歧义，这样在&nbsp;IE&nbsp;中亦可正常运行。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;此外，最好不要取与&nbsp;HTML&nbsp;对象&nbsp;id&nbsp;相同的变量名，以减少错误。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(3)其它<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;参见&nbsp;问题4<br /><br />7.&nbsp;event.x&nbsp;与&nbsp;event.y&nbsp;问题<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(1)现有问题<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在IE&nbsp;中，event&nbsp;对象有&nbsp;x,&nbsp;y&nbsp;属性，MF中没有。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(2)解决方法<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在MF中，与event.x&nbsp;等效的是&nbsp;event.pageX。但event.pageX&nbsp;IE中没有。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;故采用&nbsp;event.clientX&nbsp;代替&nbsp;event.x。在IE&nbsp;中也有这个变量。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event.clientX&nbsp;与&nbsp;event.pageX&nbsp;有微妙的差别（当整个页面有滚动条的时候），不过大多数时候是等效的。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果要完全一样，可以稍麻烦些：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mX&nbsp;=&nbsp;event.x&nbsp;?&nbsp;event.x&nbsp;:&nbsp;event.pageX;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;然后用&nbsp;mX&nbsp;代替&nbsp;event.x<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(3)其它<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event.layerX&nbsp;在&nbsp;IE&nbsp;与&nbsp;MF&nbsp;中都有，具体意义有无差别尚未试验。<br /><br /><br />8.&nbsp;关于frame<br />&nbsp;&nbsp;&nbsp;&nbsp;(1)现有问题<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在&nbsp;IE中&nbsp;可以用window.testFrame取得该frame，mf中不行<br />&nbsp;&nbsp;&nbsp;&nbsp;(2)解决方法<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在frame的使用方面mf和ie的最主要的区别是：<br />如果在frame标签中书写了以下属性：<br />&lt;frame&nbsp;src="xx.htm"&nbsp;id="frameId"&nbsp;name="frameName"&nbsp;/&gt;<br />那么ie可以通过id或者name访问这个frame对应的window对象<br />而mf只可以通过name来访问这个frame对应的window对象<br />例如如果上述frame标签写在最上层的window里面的htm里面，那么可以这样访问<br />ie：&nbsp;window.top.frameId或者window.top.frameName来访问这个window对象<br />mf：&nbsp;只能这样window.top.frameName来访问这个window对象<br /><br />另外，在mf和ie中都可以使用window.top.document.getElementById("frameId")来访问frame标签<br />并且可以通过window.top.document.getElementById("testFrame").src&nbsp;=&nbsp;'xx.htm'来切换frame的内容<br />也都可以通过window.top.frameName.location&nbsp;=&nbsp;'xx.htm'来切换frame的内容<br />关于frame和window的描述可以参见bbs的‘window与frame’文章<br />以及/test/js/test_frame/目录下面的测试<br />----adun&nbsp;2004.12.09修改<br /><br />9.&nbsp;在mf中，自己定义的属性必须getAttribute()取得<br />10.在mf中没有&nbsp;&nbsp;&nbsp;parentElement&nbsp;parement.children&nbsp;&nbsp;&nbsp;而用<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parentNode&nbsp;parentNode.childNodes<br />&nbsp;&nbsp;&nbsp;&nbsp;childNodes的下标的含义在IE和MF中不同，MF使用DOM规范，childNodes中会插入空白文本节点。<br />&nbsp;&nbsp;&nbsp;一般可以通过node.getElementsByTagName()来回避这个问题。<br />&nbsp;&nbsp;&nbsp;&nbsp;当html中节点缺失时，IE和MF对parentNode的解释不同，例如<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;form&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;table&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;input/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/table&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/form&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;MF中input.parentNode的值为form,&nbsp;而IE中input.parentNode的值为空节点<br /><br />&nbsp;&nbsp;&nbsp;MF中节点没有removeNode方法，必须使用如下方法&nbsp;node.parentNode.removeChild(node)<br /><br />11.const&nbsp;问题<br />&nbsp;&nbsp;&nbsp;(1)现有问题:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在&nbsp;IE&nbsp;中不能使用&nbsp;const&nbsp;关键字。如&nbsp;const&nbsp;constVar&nbsp;=&nbsp;32;&nbsp;在IE中这是语法错误。<br />&nbsp;&nbsp;&nbsp;(2)解决方法:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;不使用&nbsp;const&nbsp;，以&nbsp;var&nbsp;代替。<br /><br />12.&nbsp;body&nbsp;对象<br />&nbsp;&nbsp;&nbsp;&nbsp;MF的body在body标签没有被浏览器完全读入之前就存在，而IE则必须在body完全被读入之后才存在<br /><br />13.&nbsp;url&nbsp;encoding<br />在js中如果书写url就直接写&不要写&例如var&nbsp;url&nbsp;=&nbsp;'xx.jsp?objectName=xx&objectEvent=xxx';<br />frm.action&nbsp;=&nbsp;url那么很有可能url不会被正常显示以至于参数没有正确的传到服务器<br />一般会服务器报错参数没有找到<br />当然如果是在tpl中例外，因为tpl中符合xml规范，要求&书写为&<br />一般MF无法识别js中的&<br /><br /><br />14.&nbsp;nodeName&nbsp;和&nbsp;tagName&nbsp;问题<br />&nbsp;&nbsp;&nbsp;(1)现有问题：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在MF中，所有节点均有&nbsp;nodeName&nbsp;值，但&nbsp;textNode&nbsp;没有&nbsp;tagName&nbsp;值。在&nbsp;IE&nbsp;中，nodeName&nbsp;的使用好象<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;有问题（具体情况没有测试，但我的IE已经死了好几次）。<br />&nbsp;&nbsp;&nbsp;(2)解决方法：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;使用&nbsp;tagName，但应检测其是否为空。<br /><br />15.&nbsp;元素属性<br />&nbsp;&nbsp;&nbsp;&nbsp;IE下&nbsp;input.type属性为只读，但是MF下可以修改<br /><br /><br />16.&nbsp;document.getElementsByName()&nbsp;和&nbsp;document.all[name]&nbsp;的问题<br />&nbsp;&nbsp;&nbsp;(1)现有问题：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在&nbsp;IE&nbsp;中，getElementsByName()、document.all[name]&nbsp;均不能用来取得&nbsp;div&nbsp;元素（是否还有其它不能取的元素还不知道）。<br /><br /><br />1,document.getElementById替代document.all（ie适用）<br />2,集合[]替代()（ie适用）<br />3,target替代srcElement;parentNode替代parentElement（parentNode&nbsp;ie适用）<br />4,node.parentNode.removeChild(node)替代removeNode(this)（ie适用）<br />5,有空白文本节点<br />6,无outerHTML属性<br />7,事件局部变量e替代事件全局变量event<br />8,e.button键值有别于event.button,只有3个键值而无组合键值<br />9,无ondrag事件<br />10,DOMMouseScroll替代onmousewheel;-e.detail替代event.wheelDelta<br />11,addEventListener替代attachEvent;removeEventListener替代detachEvent<br />12,e.preventDefault()替代event.returnValue=false;e.stopPropagation()替代event.cancelBubble=true<br />13,style.top、style.left等严格检查"px"单位（加"px"&nbsp;ie适用）<br />14,style="-moz-opacity:0.9"替代style="filter:alpha(opacity=90)";无其它filter<br />15,style.cursor="pointer"替代style.cursor="hand"（ie适用）<br />16,title替代alt（ie适用）<br />17,状态栏默认不可修改,需调整ff设置<br />18,内置绘图功能以canvas或者SVG替代vml<br />19,代码出错时经常不报错（想来也是ff的无奈之举吧,如果每个ie独有的表达方式换在它里面都报错的话,怕是报都报不过来吧）<br />20,对缓存的清理非常不好<br />注:标明“ie适用”者为通用性建议写法,未标明者在ie里不适用。&nbsp;<br /><br /><br /><br /><br />以下所有IE指IE6.0<br /><br />验证是否是IE浏览器(来之于google&nbsp;js)&nbsp;<br /><br />var&nbsp;agt=navigator.userAgent.toLowerCase();<br />var&nbsp;is_ie=(agt.indexOf("msie")!=-1&nbsp;&&&nbsp;document.all);<br />正式开始<br /><br />事件委托方法<br /><br />IE<br /><br />document.body.onload&nbsp;=&nbsp;inject;&nbsp;//Function&nbsp;inject()在这之前已被实现<br /><br />firefox<br /><br />document.body.onload&nbsp;=&nbsp;inject();<br /><br />有人说标准是：<br /><br />document.body.onload=new&nbsp;Function('inject()');<br /><br />在firefox无法取得event.srcElement<br /><br />通过其他方式传递对象<br /><br />if(isIE)<br />thistable.attachEvent("onmousedown",OnClickChangeTdBackColor);<br />//thistable.onmousedown=OnClickChangeTdBackColor;<br />else//deal&nbsp;firefox<br />{<br /><br /><br />for(var&nbsp;i=0;i&lt;thistable.rows.length;i++)<br />{<br />var&nbsp;rowObj&nbsp;=&nbsp;thistable.rows[i];<br />for(&nbsp;var&nbsp;j=0;j&lt;rowObj.cells.length;j++)<br />{<br />var&nbsp;cellObj&nbsp;=&nbsp;rowObj.cells[j];<br />cellObj.setAttribute("onmousedown","OnClickChangeTdBackColor(this)");<br />}<br />//alert(rowObj.cells[0].tagName);<br />}<br />}<br />这是来之&nbsp;http://blog.joycode.com/lostinet/archive/2005/02/27/44999.aspx<br /><br />在FireFox下编写事件处理函数是很麻烦的事.<br />因为FireFox并没有&nbsp;window.event&nbsp;.&nbsp;如果要得到&nbsp;event&nbsp;对象,就必须要声明时间处理函数的第一个参数为event.<br /><br />所以为了兼容IE与FireFox,一般的事件处理方法为:<br />btn.onclick=handle_btn_click;<br />function&nbsp;handle_btn_click(evt)<br />{<br />if(evt==null)evt=window.event;//IE<br />//处理事件.<br />}<br />对于简单的程序,这不算麻烦.<br /><br />但对于一些复杂的程序,某写函数根本就不是直接与事件挂钩的.如果要把event传进该参数,那么所有的方法都要把event传来传去..这简直就是噩梦.<br /><br />下面介绍一个解决这个麻烦事的方法,与原理.<br /><br />JScript中，函数的调用是有一个&nbsp;func.caller&nbsp;这个属性的.<br />例如&nbsp;<br />function&nbsp;A()<br />{<br />B();<br />}<br />function&nbsp;B()<br />{<br />alert(B.caller);<br />}<br />如果B被A调用,那么B.caller就是A<br /><br />另外,函数有一个arguments属性.&nbsp;这个属性可以遍历函数当前执行的参数:<br />function&nbsp;myalert()<br />{<br />var&nbsp;arr=[];<br />for(var&nbsp;i=0;i<br />arr[i]=myalert.arguments[i];<br />alert(arr.join("-"));<br />}<br />alert("hello","world",1,2,3)<br />就能显示&nbsp;hello-world-1-2-3<br />(arguments的个数与调用方有关,而与函数的参数定义没有任何关系)<br /><br />根据这两个属性,我们可以得到第一个函数的event对象:<br />btn.onclick=handle_click;<br />function&nbsp;handle_click()<br />{<br />showcontent();<br />}<br />function&nbsp;showcontent()<br />{<br />var&nbsp;evt=SearchEvent();<br />if(evt&&evt.shiftKey)//如果是基于事件的调用,并且shift被按下<br />window.open(global_helpurl);<br />else<br />location.href=global_helpurl;<br />}<br />function&nbsp;SearchEvent()<br />{<br />func=SearchEvent.caller;<br />while(func!=null)<br />{<br />var&nbsp;arg0=func.arguments[0];<br />if(arg0)<br />{<br />if(arg0.constructor==Event)&nbsp;//&nbsp;如果就是event&nbsp;对象<br />return&nbsp;arg0;<br />}<br />func=func.caller;<br />}<br />return&nbsp;null;<br />}<br />这个例子使用了SearchEvent来搜索event对象.&nbsp;其中&nbsp;'Event'&nbsp;是&nbsp;FireFox&nbsp;的&nbsp;event.constructor&nbsp;.<br />在该例子运行时,<br />SearchEvent.caller就是showcontent,但是showcontent.arguments[0]是空.所以&nbsp;func=func.caller&nbsp;时,func变为handle_click&nbsp;.<br />handle_click&nbsp;被&nbsp;FireFox&nbsp;调用,&nbsp;虽然没有定义参数,但是被调用时,第一个参数就是event,所以handle_click.arguments[0]就是event&nbsp;!<br /><br />针对上面的知识,我们可以结合&nbsp;prototype.__defineGetter__&nbsp;来实现&nbsp;window.event&nbsp;在&nbsp;FireFox&nbsp;下的实现:<br /><br />下面给出一个简单的代码..&nbsp;有兴趣的可以补充<br /><br />if(window.addEventListener)<br />{<br />FixPrototypeForGecko();<br />}<br />function&nbsp;FixPrototypeForGecko()<br />{<br />HTMLElement.prototype.__defineGetter__("runtimeStyle",element_prototype_get_runtimeStyle);<br />window.constructor.prototype.__defineGetter__("event",window_prototype_get_event);<br />Event.prototype.__defineGetter__("srcElement",event_prototype_get_srcElement);<br />}<br />function&nbsp;element_prototype_get_runtimeStyle()<br />{<br />//return&nbsp;style&nbsp;instead...<br />return&nbsp;this.style;<br />}<br />function&nbsp;window_prototype_get_event()<br />{<br />return&nbsp;SearchEvent();<br />}<br />function&nbsp;event_prototype_get_srcElement()<br />{<br />return&nbsp;this.target;<br />}<br /><br />function&nbsp;SearchEvent()<br />{<br />//IE<br />if(document.all)<br />return&nbsp;window.event;<br /><br />func=SearchEvent.caller;<br />while(func!=null)<br />{<br />var&nbsp;arg0=func.arguments[0];<br />if(arg0)<br />{<br />if(arg0.constructor==Event)<br />return&nbsp;arg0;<br />}<br />func=func.caller;<br />}<br />return&nbsp;null;<br />}<br />&lt;/body&gt;&lt;/html&gt;<br /><br /><br /><br />firefox与IE(parentElement)的父元素的区别<br /><br />因为firefox与IE都支持DOM,因此使用obj.parentNode是不错选择.<br /><br />IE<br />obj.parentElement<br />firefox<br />obj.parentNode<br /><br /><br />asp.net中UniqueID和clientID的区别<br /><br />要使用document.getElementById&nbsp;方法，则使用控件的时候要这样来作<br /><br />"javascript:OnSelectSubCatalog(\""+subCatalog_drp.ClientID+"\","+catalogIDX+","+catID.ToString()+")";<br /><br /><br />调用Select元素的区别<br /><br />移出一个选择项<br /><br /><br />--------------------------------------------------------------------------------<br /><br /><br />IE&nbsp;：sel.options.remove(sel.selectedIndex);&nbsp;<br />firefox&nbsp;：<br /><br />增加选择项：<br /><br /><br />--------------------------------------------------------------------------------<br /><br />IE:&nbsp;subCatalog.add(new&nbsp;Option(text,value));<br /><br />firefox:&nbsp;<br />var&nbsp;opnObj&nbsp;=&nbsp;document.createElement("OPTION");&nbsp;<br />//opnObj.id&nbsp;=&nbsp;optionID;<br />opnObj.value&nbsp;=&nbsp;value;&nbsp;<br />opnObj.text&nbsp;=&nbsp;text;&nbsp;<br />subCatalog.appendChild(opnObj);<br />&nbsp;<br /><br /><br /><br /><br />]]>
      </description>
      <category>JavaScript/DOM</category>
   </item>
   <item>
      <title>一个简单的JavaScript对象编程示例</title>
      <author>zhanghuiguoanlige@126.com</author>
      <link>http://dev.mo.cn/article_9.html</link>
      <pubDate>2008-3-28 6:49:34</pubDate>
      <guid>http://dev.mo.cn/article_9.html</guid>
      <description>
      <![CDATA[<div class="code"><div class="code_title"><span> &nbsp;<img src="images/code.gif" alt="" style="padding:0px;border:0px;" /></span>&nbsp;&nbsp;&nbsp;<a href="javascript:void(0);" onclick="window.clipboardData.setData('Text',this.parentNode.parentNode.childNodes[1].outerText);alert('븴Ƴɹ,Ctrl+VճҪλ!!');">ȫ</a></div><div class="code_content">&lt;!DOCTYPE&nbsp;html&nbsp;PUBLIC&nbsp;"-//W3C//DTD&nbsp;XHTML&nbsp;1.0&nbsp;Transitional//EN"&nbsp;"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;<br />&lt;html&nbsp;xmlns="http://www.w3.org/1999/xhtml"&nbsp;&gt;<br />&lt;head&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;title&gt;一个简单的JavaScript对象编程示例&lt;/title&gt;<br />&lt;/head&gt;<br />&lt;body&gt;<br />&lt;script&nbsp;type&nbsp;="text/javascript"&nbsp;&gt;<br /><br />function&nbsp;pig(Speed){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.runSpeed=Speed;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.Run=function(runTime){&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;&nbsp;runTime&nbsp;*&nbsp;this.runSpeed;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />}<br /><br />var&nbsp;aPig=new&nbsp;pig("10");<br />document.write("我是一头小猪,我的速度是"&nbsp;+&nbsp;aPig.runSpeed&nbsp;+"公里/小时;我要开始跑步了....");<br />var&nbsp;runOver=aPig.Run(5);<br />document.write("跑了5小时,终于跑完了;我跑了"&nbsp;+&nbsp;runOver&nbsp;+&nbsp;"公里!");<br />&lt;/script&gt;<br /><br />&lt;/body&gt;<br />&lt;/html&gt;</div></div>]]>
      </description>
      <category>JavaScript/DOM</category>
   </item>
</channel>
</rss>
