﻿<?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/"><channel><title>博客园-HeroBeast</title><link>http://www.cnblogs.com/HeroBeast/</link><description>海尔比斯特's Blogs</description><language>zh-cn</language><lastBuildDate>Sun, 12 Oct 2008 23:23:20 GMT</lastBuildDate><pubDate>Sun, 12 Oct 2008 23:23:20 GMT</pubDate><ttl>60</ttl><item><title>json table</title><link>http://www.cnblogs.com/HeroBeast/archive/2008/10/10/1307963.html</link><dc:creator>HeroBeast</dc:creator><author>HeroBeast</author><pubDate>Fri, 10 Oct 2008 05:27:00 GMT</pubDate><guid>http://www.cnblogs.com/HeroBeast/archive/2008/10/10/1307963.html</guid><wfw:comment>http://www.cnblogs.com/HeroBeast/comments/1307963.html</wfw:comment><comments>http://www.cnblogs.com/HeroBeast/archive/2008/10/10/1307963.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/HeroBeast/comments/commentRss/1307963.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/HeroBeast/services/trackbacks/1307963.html</trackback:ping><description><![CDATA[<p>jsonObj={   <br />&#160; 'id':'tableid',    <br />&#160; 'classname':'tableclass',    <br />&#160; 'th':[    <br />&#160;&#160; {'id':'th1','text':'F1'},    <br />{'id':'th2','text':'F2'},    <br />{'id':'th3','classname':'tdclass1','text':'F3'}    <br />],    <br />&#160; 'td':[    <br />&#160;&#160; [{'id':'td1','text':'d1'},{'id':'td1','text':'d1'},{'id':'td1','text':'d1'}],    <br />&#160;&#160; [{'id':'td1','text':'d1'},{'id':'td1','classname':'tdclass1','text':'d1'},{'id':'td1','text':'d1'}],    <br />&#160;&#160; [{'id':'td1','text':'d1'},{'id':'td1','text':'d1'},{'id':'td1','text':'d1'}],    <br />&#160;&#160; [{'id':'td1','text':'d1'},{'id':'td1','text':'d1'},{'text':'d1'}]    <br />]    <br />&#160; };    <br />///使用方法 createTableByJson(div id,json);    <br />createTableByJson('tableTest',jsonObj);    <br />function createTableByJson(divid,jsonObj){    <br />&#160; var ourDiv=document.getElementById(divid);    <br />&#160; var t=document.createElement('table');    <br />&#160; if(jsonObj.id){    <br />&#160;&#160; t.setAttribute(&quot;id&quot;,jsonObj.id);    <br />&#160; }    <br />&#160; if(jsonObj.classname){    <br />&#160;&#160; t.setAttribute(&quot;class&quot;,jsonObj.classname);    <br />&#160;&#160; t.setAttribute(&quot;className&quot;,jsonObj.classname);    <br />&#160; }    <br />&#160; var tb=document.createElement('tbody');    <br />&#160; var tr=document.createElement('tr');    <br />&#160; /// add th    <br />&#160; for(var i=0;i&lt;jsonObj.th.length;i++){    <br />&#160;&#160; var thText=document.createTextNode(jsonObj.th[i].text);    <br />&#160;&#160; var th=document.createElement('th');    <br />if(jsonObj.th[i].id){    <br />&#160; th.setAttribute('id',jsonObj.th[i].id);    <br />}    <br />if(jsonObj.th[i].classname){    <br />&#160; th.setAttribute('class',jsonObj.th[i].classname);    <br />&#160; th.setAttribute('className',jsonObj.th[i].classname);    <br />}    <br />&#160;&#160; th.appendChild(thText);    <br />&#160;&#160; tr.appendChild(th);    <br />&#160; }    <br />&#160; tb.appendChild(tr);    <br />&#160; /// add td    <br />&#160; for(var j=0;j&lt;jsonObj.td.length;j++){    <br />&#160;&#160; tr=document.createElement('tr');    <br />&#160;&#160; for(var i=0;i&lt;jsonObj.td[j].length;i++){    <br />&#160;&#160;&#160;&#160; var tdText=document.createTextNode(jsonObj.td[j][i].text);    <br />&#160;&#160;&#160;&#160; var td=document.createElement('td');    <br />&#160; if(jsonObj.td[j][i].id){    <br />&#160;&#160;&#160; td.setAttribute('id',jsonObj.td[j][i].id);    <br />&#160; }    <br />&#160; if(jsonObj.td[j][i].classname){    <br />&#160;&#160;&#160; td.setAttribute('class',jsonObj.td[j][i].classname);    <br />&#160;&#160;&#160; td.setAttribute('className',jsonObj.td[j][i].classname);    <br />&#160; }    <br />&#160;&#160;&#160;&#160; td.appendChild(tdText);    <br />&#160;&#160;&#160;&#160; tr.appendChild(td);    <br />&#160;&#160; }    <br />&#160;&#160; tb.appendChild(tr);    <br />&#160; }    <br />&#160; t.appendChild(tb);    <br />&#160; ourDiv.appendChild(t);    <br />}</p><img src ="http://www.cnblogs.com/HeroBeast/aggbug/1307963.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42952/" target="_blank">[新闻]微型博客Twitter取消IM服务 称其ROI差</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>JSON扫盲帖+JSON类教程</title><link>http://www.cnblogs.com/HeroBeast/archive/2008/10/10/1307942.html</link><dc:creator>HeroBeast</dc:creator><author>HeroBeast</author><pubDate>Fri, 10 Oct 2008 05:00:00 GMT</pubDate><guid>http://www.cnblogs.com/HeroBeast/archive/2008/10/10/1307942.html</guid><wfw:comment>http://www.cnblogs.com/HeroBeast/comments/1307942.html</wfw:comment><comments>http://www.cnblogs.com/HeroBeast/archive/2008/10/10/1307942.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/HeroBeast/comments/commentRss/1307942.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/HeroBeast/services/trackbacks/1307942.html</trackback:ping><description><![CDATA[<h4>&#160;</h4>  <p>昨天发了json的AS3解析类，从大家的跟帖上来看，好多人还是不知道这个东西的，特建一个扫盲贴。   <br />其实在AS中使用json其实并不是一个必须或是很好的选择，因为AS对xml的解析已经很不错了，但是为什么可以考虑使用json呢，有以下几点：</p>  <ul>   <li>json是介于单纯的文本方式（如：firstName=Brett&amp;lastName=McLaughlin&amp;email=brett@newInstance.com）和xml（&lt;request&gt;&lt;firstName&gt;Brett&lt;/firstName&gt;&lt;lastName&gt;McLaughlin&lt;/lastName&gt;&lt;email&gt;<a href="mailto:brett@newInstance.com">brett@newInstance.com</a>&lt;/email&gt;&lt;/request&gt;）中间的一种格式，他具有文本和xml的中性优势：数据量小和清晰的数据格式。</li>    <li>json是JavaScript Object Notation的简写，那么意思就是说他是来自于javascript的东西。因为现在ajax的流行，大部分网站会采用ajax的模式和构架，那么json会是一个数据传输的首选（文本方式太简单，要是大数据量的时候无法理解，xml的方式数据量大，在解析的时候会增加服务器负担），那么要是一个网站从ajax构架的基础上出一个flex/flash版的界面的时候使用json会最少地减少服务器端的程序改动。</li>    <li>服务器端现在有成熟的JSON解析代码（因为JSON运用太广泛了），那么在开发的时候也不用担心服务器端的解析。</li> </ul> ps：我怎么只能想到上面三点啊，会不会理由太少了？  <br /><strong>JSON 是什么?</strong>  <br /><strong></strong>  <br /><strong>简单 JSON 示例</strong>  <br />按照最简单的形式，可以用下面这样的 JSON 表示名称/值对：   <p>复制内容到剪贴板</p>  <h6>代码:</h6> <code>{ &quot;firstName&quot;: &quot;Brett&quot; } </code>  <p>这个示例非常基本，而且实际上比等效的纯文本名称/值对占用更多的空间： </p>  <p>复制内容到剪贴板</p>  <h6>代码:</h6> <code>firstName=Brett</code>  <p>但是，当将多个名称/值对串在一起时，JSON 就会体现出它的价值了。首先，可以创建包含多个名称/值对的<i>记录</i>，比如： </p>  <p>复制内容到剪贴板</p>  <h6>代码:</h6> <code>{ &quot;firstName&quot;: &quot;Brett&quot;, &quot;lastName&quot;:&quot;McLaughlin&quot;, &quot;email&quot;: &quot;brett@newInstance.com&quot; }</code>  <p>从语法方面来看，这与名称/值对相比并没有很大的优势，但是在这种情况下 JSON 更容易使用，而且可读性更好。例如，它明确地表示以上三个值都是同一记录的一部分；花括号使这些值有了某种联系。   <br /><strong>值的数组</strong>    <br />当需要表示一组值时，JSON 不但能够提高可读性，而且可以减少复杂性。例如，假设您希望表示一个人名列表。在 XML 中，需要许多开始标记和结束标记；如果使用典型的名称/值对（就像在本系列前面文章中看到的那种名称/值对），那么必须建立一种专有的数据格式，或者将键名称修改为 person1-firstName 这样的形式。    <br />如果使用 JSON，就只需将多个带花括号的记录分组在一起： </p>  <p>复制内容到剪贴板</p>  <h6>代码:</h6> <code>{ &quot;people&quot;: [   <br />&#160; { &quot;firstName&quot;: &quot;Brett&quot;, &quot;lastName&quot;:&quot;McLaughlin&quot;, &quot;email&quot;: &quot;brett@newInstance.com&quot; },    <br />&#160; { &quot;firstName&quot;: &quot;Jason&quot;, &quot;lastName&quot;:&quot;Hunter&quot;, &quot;email&quot;: &quot;jason@servlets.com&quot; },    <br />&#160; { &quot;firstName&quot;: &quot;Elliotte&quot;, &quot;lastName&quot;:&quot;Harold&quot;, &quot;email&quot;: &quot;elharo@macfaq.com&quot; }    <br />]}</code>  <p>这不难理解。在这个示例中，只有一个名为 people 的变量，值是包含三个条目的数组，每个条目是一个人的记录，其中包含名、姓和电子邮件地址。上面的示例演示如何用括号将记录组合成一个值。当然，可以使用相同的语法表示多个值（每个值包含多个记录）： </p>  <p>复制内容到剪贴板</p>  <h6>代码:</h6> <code>{ &quot;programmers&quot;: [   <br />&#160; { &quot;firstName&quot;: &quot;Brett&quot;, &quot;lastName&quot;:&quot;McLaughlin&quot;, &quot;email&quot;: &quot;brett@newInstance.com&quot; },    <br />&#160; { &quot;firstName&quot;: &quot;Jason&quot;, &quot;lastName&quot;:&quot;Hunter&quot;, &quot;email&quot;: &quot;jason@servlets.com&quot; },    <br />&#160; { &quot;firstName&quot;: &quot;Elliotte&quot;, &quot;lastName&quot;:&quot;Harold&quot;, &quot;email&quot;: &quot;elharo@macfaq.com&quot; }    <br />],    <br />&quot;authors&quot;: [    <br />&#160; { &quot;firstName&quot;: &quot;Isaac&quot;, &quot;lastName&quot;: &quot;Asimov&quot;, &quot;genre&quot;: &quot;science fiction&quot; },    <br />&#160; { &quot;firstName&quot;: &quot;Tad&quot;, &quot;lastName&quot;: &quot;Williams&quot;, &quot;genre&quot;: &quot;fantasy&quot; },    <br />&#160; { &quot;firstName&quot;: &quot;Frank&quot;, &quot;lastName&quot;: &quot;Peretti&quot;, &quot;genre&quot;: &quot;christian fiction&quot; }    <br />],    <br />&quot;musicians&quot;: [    <br />&#160; { &quot;firstName&quot;: &quot;Eric&quot;, &quot;lastName&quot;: &quot;Clapton&quot;, &quot;instrument&quot;: &quot;guitar&quot; },    <br />&#160; { &quot;firstName&quot;: &quot;Sergei&quot;, &quot;lastName&quot;: &quot;Rachmaninoff&quot;, &quot;instrument&quot;: &quot;piano&quot; }    <br />]    <br />}</code>  <p>这里最值得注意的是，能够表示多个值，每个值进而包含多个值。但是还应该注意，在不同的主条目（programmers、authors 和 musicians）之间，记录中实际的名称/值对可以不一样。JSON 是完全动态的，允许在 JSON 结构的中间改变表示数据的方式。   <br />在处理 JSON 格式的数据时，没有需要遵守的预定义的约束。所以，在同样的数据结构中，可以改变表示数据的方式，甚至可以以不同方式表示同一事物。    <br />ps：以上例子都是来自<a href="http://www.ibm.com/developerworks/cn/web/wa-ajaxintro10/">http://www.ibm.com/developerworks/cn/web/wa-ajaxintro10/</a>，掌握 Ajax，自己懒，看人家有就顺便用了<img alt="" src="http://bbs.actionscript3.cn/images/smilies/default/sweat.gif" border="0" />    <br />当当当，我又回来了，上周忙这上班没顾上写用法，下面就介绍一下adobe的json类的用法。    <br />上次发表的json类有问题（<a href="http://bbs.actionscript3.cn/thread-1625-1-1.html">http://bbs.actionscript3.cn/thread-1625-1-1.html</a>），因为我也是从别人处下载的，谁知道是一个半成品。望大家别生气啊，建议管理员给删除了！    <br />这次是adobe的官方的类，我修改了一下包，这次就可以用了。    <br />下面是教程，比较简单：    <br /><strong>1、服务器端来的json</strong>    <br />怎么样获得服务器端的json我就不说了吧（就是通讯），那么得到的应该是一个字符串，存入变量serverJSON，使用方式如下：</p>  <p>复制内容到剪贴板</p>  <h6>代码:</h6> <code>   <br />import json.*;    <br />var json:Object = new Object();    <br />json = JSON.decode(serverJSON);</code>  <p>json就是一个对象了，简单吧。   <br />举一个例子：    <br />上面的JSON的一段代码：</p>  <p>复制内容到剪贴板</p>  <h6>代码:</h6> <code>{ &quot;programmers&quot;: [   <br />&#160; { &quot;firstName&quot;: &quot;Brett&quot;, &quot;lastName&quot;:&quot;McLaughlin&quot;, &quot;email&quot;: &quot;brett@newInstance.com&quot; },    <br />&#160; { &quot;firstName&quot;: &quot;Jason&quot;, &quot;lastName&quot;:&quot;Hunter&quot;, &quot;email&quot;: &quot;jason@servlets.com&quot; },    <br />&#160; { &quot;firstName&quot;: &quot;Elliotte&quot;, &quot;lastName&quot;:&quot;Harold&quot;, &quot;email&quot;: &quot;elharo@macfaq.com&quot; }    <br />],    <br />&quot;authors&quot;: [    <br />&#160; { &quot;firstName&quot;: &quot;Isaac&quot;, &quot;lastName&quot;: &quot;Asimov&quot;, &quot;genre&quot;: &quot;science fiction&quot; },    <br />&#160; { &quot;firstName&quot;: &quot;Tad&quot;, &quot;lastName&quot;: &quot;Williams&quot;, &quot;genre&quot;: &quot;fantasy&quot; },    <br />&#160; { &quot;firstName&quot;: &quot;Frank&quot;, &quot;lastName&quot;: &quot;Peretti&quot;, &quot;genre&quot;: &quot;christian fiction&quot; }    <br />],    <br />&quot;musicians&quot;: [    <br />&#160; { &quot;firstName&quot;: &quot;Eric&quot;, &quot;lastName&quot;: &quot;Clapton&quot;, &quot;instrument&quot;: &quot;guitar&quot; },    <br />&#160; { &quot;firstName&quot;: &quot;Sergei&quot;, &quot;lastName&quot;: &quot;Rachmaninoff&quot;, &quot;instrument&quot;: &quot;piano&quot; }    <br />]    <br />}</code>  <p>存入变量：serverJSON   <br />代码:</p>  <p>复制内容到剪贴板</p>  <h6>代码:</h6> <code>   <br />var serverJSON:String = '{ &quot;programmers&quot;: [{ &quot;firstName&quot;: &quot;Brett&quot;, &quot;lastName&quot;:&quot;McLaughlin&quot;, &quot;email&quot;: &quot;brett@newInstance.com&quot; },{ &quot;firstName&quot;: &quot;Jason&quot;, &quot;lastName&quot;:&quot;Hunter&quot;, &quot;email&quot;: &quot;jason@servlets.com&quot; }, { &quot;firstName&quot;: &quot;Elliotte&quot;, &quot;lastName&quot;:&quot;Harold&quot;, &quot;email&quot;: &quot;elharo@macfaq.com&quot; }],&quot;authors&quot;: [{ &quot;firstName&quot;: &quot;Isaac&quot;, &quot;lastName&quot;: &quot;Asimov&quot;, &quot;genre&quot;: &quot;science fiction&quot; },{ &quot;firstName&quot;: &quot;Tad&quot;, &quot;lastName&quot;: &quot;Williams&quot;, &quot;genre&quot;: &quot;fantasy&quot; },{ &quot;firstName&quot;: &quot;Frank&quot;, &quot;lastName&quot;: &quot;Peretti&quot;, &quot;genre&quot;: &quot;christian fiction&quot; }],&quot;musicians&quot;: [{ &quot;firstName&quot;: &quot;Eric&quot;, &quot;lastName&quot;: &quot;Clapton&quot;, &quot;instrument&quot;: &quot;guitar&quot; },{ &quot;firstName&quot;: &quot;Sergei&quot;, &quot;lastName&quot;: &quot;Rachmaninoff&quot;, &quot;instrument&quot;: &quot;piano&quot; }]}'    <br />var s:Object = JSON.decode(serverJSON);    <br />//开始使用    <br />trace(s.programmers[0].firstName);//输出：Brett</code>  <p>不是吧这么简单。其实转变后就成为一个对象了，可以通过点语法来访问这些值了。XML靠边去。   <br /><strong>2、本地对象做成JSON</strong>    <br />你要是能自己拼出JSON字符串也可以，不过我们是在面向对象的世界啊，那么我们都是对象啊，到时候对象直接就可以来用了。    <br />举一个例子：</p>  <p>复制内容到剪贴板</p>  <h6>代码:</h6> <code>   <br />import json.*;    <br />var myObject:Object = new Object();    <br />myObject.ab = &quot;adfsdf&quot;;    <br />myObject.cd = Math.random();    <br />trace(JSON.encode( myObject ));//输出：{&quot;ab&quot;:&quot;adfsdf&quot;,&quot;cd&quot;:0.0599129400216043}</code>  <p>这样就可以给服务器了。   <br />总结：就两个方法，JSON.decode(String),JSON.encode(Object)，有这么简单的方式实现传输量小，而且简单的数据格式，我们为什么还不用呢？    <br />其实XML自然也有他自己的强势，当一个结构复杂的数据结构出现的时候，这个时候JSON就很难搞定了，XML就是首选了。</p><img src ="http://www.cnblogs.com/HeroBeast/aggbug/1307942.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42952/" target="_blank">[新闻]微型博客Twitter取消IM服务 称其ROI差</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>jquery基础</title><link>http://www.cnblogs.com/HeroBeast/archive/2008/10/09/1307388.html</link><dc:creator>HeroBeast</dc:creator><author>HeroBeast</author><pubDate>Thu, 09 Oct 2008 08:54:00 GMT</pubDate><guid>http://www.cnblogs.com/HeroBeast/archive/2008/10/09/1307388.html</guid><wfw:comment>http://www.cnblogs.com/HeroBeast/comments/1307388.html</wfw:comment><comments>http://www.cnblogs.com/HeroBeast/archive/2008/10/09/1307388.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/HeroBeast/comments/commentRss/1307388.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/HeroBeast/services/trackbacks/1307388.html</trackback:ping><description><![CDATA[<p>demo7:table滑过变色,隔行变色.   <br />$(document).ready(function(){&#160;&#160; //这个就是传说的ready    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; $(&quot;.stripe tr&quot;).mouseover(function(){&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //如果鼠标移到class为stripe的表格的tr上时，执行函数    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; $(this).addClass(&quot;over&quot;);}).mouseout(function(){     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //给这行添加class值为over，并且当鼠标一出该行时执行函数    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; $(this).removeClass(&quot;over&quot;);})&#160;&#160; //移除该行的class    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; $(&quot;.stripe tr:even&quot;).addClass(&quot;alt&quot;);    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //给class为stripe的表格的偶数行添加class值为alt    <br />});    <br />在效果上,我又加了点击 某行 变色:    <br />$(document).ready(function(){&#160;&#160; //这个就是传说的ready    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; $(&quot;.stripe tr&quot;).mouseover(function(){&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //如果鼠标移到class为stripe的表格的tr上时，执行函数    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; $(this).addClass(&quot;over&quot;);}).mouseout(function(){     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //给这行添加class值为over，并且当鼠标一出该行时执行函数    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; $(this).removeClass(&quot;over&quot;);}).click(function(){ //移除该行的class    <br />&#160;&#160;&#160;&#160; $(this).toggleClass(&quot;click&quot;).removeClass(&quot;alt&quot;)})//点击变色,注意：因为有隔行变色，所以这里必须在触发toggleClass时,remove(&quot;alt&quot;).    <br />&#160;&#160;&#160;&#160; $(&quot;.stripe tr:even&quot;).addClass(&quot;alt&quot;);    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //给class为stripe的表格的偶数行添加class值为alt    <br />});    <br />说到这里 ，不得不说一下 toggle与toggleClass区别：    <br />$(document).ready(function(){&#160;&#160; //这个就是传说的ready    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; $(&quot;.stripe tr&quot;).mouseover(function(){&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //如果鼠标移到class为stripe的表格的tr上时，执行函数    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; $(this).addClass(&quot;over&quot;);}).mouseout(function(){     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //给这行添加class值为over，并且当鼠标一出该行时执行函数    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; $(this).removeClass(&quot;over&quot;);}).toggle(function(){ $(this).addClass(&quot;click&quot;); },function(){ $(this).removeClass(&quot;click&quot;);}).unbind(&quot;click&quot;)    <br />&#160;&#160;&#160;&#160; $(&quot;.stripe tr:even&quot;).addClass(&quot;alt&quot;);    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //给class为stripe的表格的偶数行添加class值为alt    <br />});    <br />可以发现：    <br />toggleClass：可以发现超连接还是可以连接的，没有被 toggle和click占用    <br />toggle：可以发现超连接已经不可以用了，所以说toggle不适合这种情况。不过可以把click解绑(unbind(&quot;click&quot;))，代码量好象比click结合toggleClass多，所以我选择的是toggleClass.</p><img src ="http://www.cnblogs.com/HeroBeast/aggbug/1307388.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42951/" target="_blank">[新闻]用手机聊Gtalk的方法以及应用总结</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title /><link>http://www.cnblogs.com/HeroBeast/archive/2008/10/09/1307360.html</link><dc:creator>HeroBeast</dc:creator><author>HeroBeast</author><pubDate>Thu, 09 Oct 2008 08:27:00 GMT</pubDate><guid>http://www.cnblogs.com/HeroBeast/archive/2008/10/09/1307360.html</guid><wfw:comment>http://www.cnblogs.com/HeroBeast/comments/1307360.html</wfw:comment><comments>http://www.cnblogs.com/HeroBeast/archive/2008/10/09/1307360.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/HeroBeast/comments/commentRss/1307360.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/HeroBeast/services/trackbacks/1307360.html</trackback:ping><description><![CDATA[<h6>表格隔行换色</h6>  <p>表格行间隔行用不同颜色表示,便于信息浏览,同时具有鼠标经过行高亮效果.</p>  <p>传统的做法要在tr里加 onMouseOver=&quot;this.className='two'&quot; onMouseOut=&quot;this.className='one'&quot; 很麻烦</p>  <p>jQuery只用5行代码就搞定。</p>  <pre>&lt;script type=&quot;text/javascript&quot; src=&quot;jquery.js&quot;&gt;&lt;/script&gt;</pre>

<h6>效果展示：</h6>

<p>姓名
  <br />年龄

  <br />MSN

  <br />Email</p>

<p>Owen
  <br />30

  <br />owen.net@hotmail.com

  <br /><a href="http://www.cnblogs.com/css/">css</a></p>

<p>Owen
  <br />30

  <br />owen.net@hotmail.com

  <br /><a href="http://www.cnblogs.com/css/">css</a></p>

<p>Owen
  <br />30

  <br />owen.net@hotmail.com

  <br /><a href="http://www.cnblogs.com/css/">css</a></p>

<p>Owen
  <br />30

  <br />owen.net@hotmail.com

  <br /><a href="http://www.cnblogs.com/css/">css</a></p>

<p>Owen
  <br />30

  <br />owen.net@hotmail.com

  <br /><a href="http://www.cnblogs.com/css/">css</a></p>

<p>Owen
  <br />30

  <br />owen.net@hotmail.com

  <br /><a href="http://www.cnblogs.com/css/">css</a></p>

<h6>JS代码</h6>

<p>1 &lt;script type=&quot;text/javascript&quot;&gt;
  <br />2 $(document).ready(function(){

  <br />3 $(&quot;.stripe_tb tr&quot;).mouseover(function(){ //如果鼠标移到class为stripe_tb的表格的tr上时，执行函数

  <br />4 $(this).addClass(&quot;over&quot;);}).mouseout(function(){ //给这行添加class值为over，并且当鼠标一出该行时执行函数

  <br />5 $(this).removeClass(&quot;over&quot;);}) //移除该行的class

  <br />6 $(&quot;.stripe_tb tr:even&quot;).addClass(&quot;alt&quot;); //给class为stripe_tb的表格的偶数行添加class值为alt

  <br />7 });

  <br />8 &lt;/script&gt;</p>

<h6>CSS代码</h6>

<p>1 &lt;style type=&quot;text/css&quot;&gt; /*注意选择器的层叠关系*/
  <br />2 .stripe_tb th{background:#B5CBE6; color:#039; line-height:20px; height:30px}

  <br />3 .stripe_tb td{padding:6px 11px; border-bottom:1px solid #95bce2; vertical-align:top; text-align:center}

  <br />4 .stripe_tb td *{padding:6px 11px}

  <br />5 .stripe_tb tr.alt td{background:#ecf6fc} /*这行将给所有偶数行加上背景色*/

  <br />6 .stripe_tb tr.over td{background:#FEF3D1} /*这个将是鼠标高亮行的背景色*/

  <br />7 &lt;/style&gt;</p>

<h6>HTML代码</h6>

<p> 1 &lt;table class=&quot;stripe_tb&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; width=&quot;50%&quot;&gt;
  <br /> 2 &lt;!--用class=&quot;stripe_tb&quot;来标识需要使用该效果的表格--&gt;

  <br /> 3 &lt;thead&gt;

  <br /> 4 &lt;tr&gt;

  <br /> 5 &lt;th&gt;姓名&lt;/th&gt;

  <br /> 6 &lt;th&gt;年龄&lt;/th&gt;

  <br /> 7 &lt;th&gt;MSN&lt;/th&gt;

  <br /> 8 &lt;th&gt;Email&lt;/th&gt;

  <br /> 9 &lt;/tr&gt;

  <br />10 &lt;/thead&gt;

  <br />11 &lt;tr&gt;

  <br />12 &lt;td&gt;Owen&lt;/td&gt;

  <br />13 &lt;td&gt;30&lt;/td&gt;

  <br />14 &lt;td&gt;owen.net@hotmail.com&lt;/td&gt;

  <br />15 &lt;td&gt;&lt;a href=&quot;http://www.cnblogs.com/css/&quot;&gt;css&lt;/a&gt;&lt;/td&gt;

  <br />16 &lt;/tr&gt;

  <br />17 &lt;tr&gt;

  <br />18 &lt;td&gt;Owen&lt;/td&gt;

  <br />19 &lt;td&gt;30&lt;/td&gt;

  <br />20 &lt;td&gt;owen.net@hotmail.com&lt;/td&gt;

  <br />21 &lt;td&gt;&lt;a href=&quot;http://www.cnblogs.com/css/&quot;&gt;css&lt;/a&gt;&lt;/td&gt;

  <br />22 &lt;/tr&gt;

  <br />23 &lt;tr&gt;

  <br />24 &lt;td&gt;Owen&lt;/td&gt;

  <br />25 &lt;td&gt;30&lt;/td&gt;

  <br />26 &lt;td&gt;owen.net@hotmail.com&lt;/td&gt;

  <br />27 &lt;td&gt;&lt;a href=&quot;http://www.cnblogs.com/css/&quot;&gt;css&lt;/a&gt;&lt;/td&gt;

  <br />28 &lt;/tr&gt;

  <br />29 &lt;tr&gt;

  <br />30 &lt;td&gt;Owen&lt;/td&gt;

  <br />31 &lt;td&gt;30&lt;/td&gt;

  <br />32 &lt;td&gt;owen.net@hotmail.com&lt;/td&gt;

  <br />33 &lt;td&gt;&lt;a href=&quot;http://www.cnblogs.com/css/&quot;&gt;css&lt;/a&gt;&lt;/td&gt;

  <br />34 &lt;/tr&gt;

  <br />35 &lt;tr&gt;

  <br />36 &lt;td&gt;Owen&lt;/td&gt;

  <br />37 &lt;td&gt;30&lt;/td&gt;

  <br />38 &lt;td&gt;owen.net@hotmail.com&lt;/td&gt;

  <br />39 &lt;td&gt;&lt;a href=&quot;http://www.cnblogs.com/css/&quot;&gt;css&lt;/a&gt;&lt;/td&gt;

  <br />40 &lt;/tr&gt;

  <br />41 &lt;tr&gt;

  <br />42 &lt;td&gt;Owen&lt;/td&gt;

  <br />43 &lt;td&gt;30&lt;/td&gt;

  <br />44 &lt;td&gt;owen.net@hotmail.com&lt;/td&gt;

  <br />45 &lt;td&gt;&lt;a href=&quot;http://www.cnblogs.com/css/&quot;&gt;css&lt;/a&gt;&lt;/td&gt;

  <br />46 &lt;/tr&gt;

  <br />47 &lt;/table&gt;</p>

<p>Tag标签: <a href="http://www.cnblogs.com/css/tag/jQuery/">jQuery</a>,<a href="http://www.cnblogs.com/css/tag/javascript/">javascript</a>,<a href="http://www.cnblogs.com/css/tag/%e8%a1%a8%e6%a0%bc/">表格</a></p><img src ="http://www.cnblogs.com/HeroBeast/aggbug/1307360.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42951/" target="_blank">[新闻]用手机聊Gtalk的方法以及应用总结</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>关于loose.dtd和xhtml1-transitional.dtd等文档类型定义模型中CSS失效的解决办法。</title><link>http://www.cnblogs.com/HeroBeast/archive/2008/10/09/1306794.html</link><dc:creator>HeroBeast</dc:creator><author>HeroBeast</author><pubDate>Thu, 09 Oct 2008 01:34:00 GMT</pubDate><guid>http://www.cnblogs.com/HeroBeast/archive/2008/10/09/1306794.html</guid><wfw:comment>http://www.cnblogs.com/HeroBeast/comments/1306794.html</wfw:comment><comments>http://www.cnblogs.com/HeroBeast/archive/2008/10/09/1306794.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/HeroBeast/comments/commentRss/1306794.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/HeroBeast/services/trackbacks/1306794.html</trackback:ping><description><![CDATA[<p>这是一位高人的文章，源文地址在：<a href="http://blog.csdn.net/net_lover/archive/2006/08/25/1116488.aspx">http://blog.csdn.net/net_lover/archive/2006/08/25/1116488.aspx</a>    <br />这里我还收集了一个《滚动条资料整合》的文章（源文地址：<a href="http://www.choco.cn/post/76.html">http://www.choco.cn/post/76.html</a>）我把它们收集在一起主要是为了查看方便。 </p>  <p>关于loose.dtd和xhtml1-transitional.dtd等文档类型定义模型中CSS失效的解决办法。</p>  <p>最近，很多人反映 下面的CSS定义在 loose.dtd和xhtml1-transitional.dtd下无效了：</p>  <p>body{   <br />SCROLLBAR-FACE-COLOR: #f2f2f2;     <br />SCROLLBAR-HIGHLIGHT-COLOR: #ffffff;     <br />SCROLLBAR-SHADOW-COLOR: #999999;     <br />SCROLLBAR-3DLIGHT-COLOR: #999999;     <br />SCROLLBAR-ARROW-COLOR: #999999;     <br />SCROLLBAR-TRACK-COLOR: #ff0000;     <br />SCROLLBAR-DARKSHADOW-COLOR: #ffffff;</p>  <p>overflow-y:hidden   <br />}</p>  <p>解决办法就是</p>  <p>html,body{   <br />SCROLLBAR-FACE-COLOR: #f2f2f2;     <br />SCROLLBAR-HIGHLIGHT-COLOR: #ffffff;     <br />SCROLLBAR-SHADOW-COLOR: #999999;     <br />SCROLLBAR-3DLIGHT-COLOR: #999999;     <br />SCROLLBAR-ARROW-COLOR: #999999;     <br />SCROLLBAR-TRACK-COLOR: #ff0000;     <br />SCROLLBAR-DARKSHADOW-COLOR: #ffffff;</p>  <p>overflow-y:hidden   <br />}</p>  <p>新的文档类型定义模型使用html 元素作为容器。</p>  <p>类似的还有</p>  <p>document.body.scrollHeight等结果为0</p>  <p>需要使用新的办法：</p>  <p>var eleHeight   <br />if(document.documentElement)    <br />eleHeight = document.documentElement.scrollHeight    <br />else    <br />eleHeight = document.body.scrollHeight</p>  <p><strong><strong>滚动条资料整合</strong></strong></p>  <p>一直只会用简单的滚动条设置，今天抽了一下空，在网上找了几篇关于scrollbra的文章来，节选和修正了一下，整合成为一篇比较完整的文章，方便大家查阅，以后就不用找来找去了。基本上它的属性都已经列出来并且去掉了重复的部分，如果有新的我会在后续加上去的。好了，就说到这里拉，还在上班呢。</p>  <p>另外要注意的是，shtml的doctype就好像不支持scrollbar的这些属性我使用过几个头都不能让IE正确显示滚动条，这方面的资料还没有找到，有空放上去，大家使用的时候记得要注意了。。</p>  <p>可以显示效果：   <br />&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot;&gt;</p>  <p>不能显示效果：   <br />&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot;    <br />&quot;http://www.w3.org/TR/html4/loose.dtd&quot;&gt;（注！看日志最后一行）    <br />&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;    <br />&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;</p>  <p>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ 躲在虫谷的猫 －</p>  <p><strong>1.Scrollbar 属性 </strong>    <br />Scrollbar Properties     <br />属性 CSS Version     <br />版本 Compatibility     <br />兼容性 Inherit From Parent     <br />继承性 Description     <br />简介     <br />scrollbar-3d-light-color IE专有属性 IE5.5+ 有 设置或检索 滚动条 亮边框颜色     <br />scrollbar-highlight-color IE专有属性 IE5.5+ 有 设置或检索 滚动条 3D界面的亮边（ThreedHighlight）颜色     <br />scrollbar-face-color IE专有属性 IE5.5+ 有 设置或检索 滚动条 3D表面（ThreedFace）的颜色     <br />scrollbar-arrow-color IE专有属性 IE5.5+ 有 设置或检索 滚动条 方向箭头的颜色     <br />scrollbar-shadow-color IE专有属性 IE5.5+ 有 设置或检索 滚动条 3D界面的暗边（ThreedShadow）颜色     <br />scrollbar-dark-shadow-color IE专有属性 IE5.5+ 有 设置或检索 滚动条 暗边框（ThreedDarkShadow）颜色     <br />scrollbar-base-color IE专有属性 IE5.5+ 有 设置或检索 滚动条 基准颜色。其它界面颜色将据此自动调整.一般情况下只需要设置这一个属性就可以达到改变滚动条颜色的目的</p>  <p><a href="http://www.twentys.net/"><img height="200" alt="设计" src="http://www.7880.com/Upload/2004_Pack/scroll.gif" width="150" border="0" /></a></p>  <p>以上七个属性设置的值都是颜色值，可以使用样式表定义的各种表达方式。 [IE专有属性 IE5.5+]    <br />－&gt; 如果你觉得写样式表的方式太麻烦，可以直接使用插件，下载地址： <a href="http://www.windstudio.net/dw/files/ie55_scrollbar.mxp">http://www.windstudio.net/dw/files/ie55_scrollbar.mxp </a>    <br />提醒：以上效果需要IE5.5以上版本支持。     <br />使用以上的样式定义内容，我们可以指定浏览器窗口、多行文本框的滚动条的显示与否和颜色样式，第一组样式属性用于     <br />设定被设定对象是否显示滚动条，第二组样式属性则用于设置滚动条的颜色，要注意的本文涉及的样式属性都是ie才能支     <br />持的，第二组的样式属性只有ie5.5版本才能支持，所以请大家在调试的时候注意。 </p>  <p><strong>2.overflow内容溢出时的设置</strong>    <br />overflow-x水平方向内容溢出时的设置     <br />overflow-y垂直方向内容溢出时的设置     <br />以上三个属性设置的值为visible(默认值)、scroll、hidden、auto。 </p>  <p>去掉水平及竖直的滚动条，可在网页原代码中加入以下代码：&lt;body scroll=no&gt;    <br />B.去水平滚动条：&lt;body style=&#8221;overflow-x:hidden&#8221;&gt;     <br />C.去竖直滚动条：&lt;body style=&#8221;overflow-y:hidden&#8221;&gt; </p>  <p><strong>3.使用图片代替浏览器中的滚动条？</strong>    <br />如果用源代码的方式，恐怕太麻烦了：)这里有一个文件包，可以直接下载以后使用。    <br />地址：http://www.hi-fi2000.com/iescroll.zip     <br />提示：     <br />源代码中：调用JS的是这一句：     <br />&lt;SCRIPT src=&#8221;4.files/scroll.js&#8221;&gt;&lt;/SCRIPT&gt;可以通过修改这一句来修改JS的存放目录，图片的修改也是一样。如果你打算让滚动条更适合你的站点，可以直接修改图片来达到目的。     <br />其中：    <br />垂直滚动条：1.jpg     <br />上箭头：2.jpg     <br />垂直滚动条：3.jpg     <br />下箭头：4.jpg     <br />水平滚动槽：5.jpg     <br />左箭头：6.jpg     <br />水平滚动条：7.jpg     <br />右箭头：8.jpg     <br />两根滚动条交接：9.jpg </p>  <p><strong>4.设定多行文本框的滚动条 </strong>    <br />没有水平滚动条     <br />&lt;textarea style=&quot;overflow-x:hidden&quot;&gt;&lt;/textarea&gt;     <br />没有垂直滚动条     <br />&lt;textarea style=&quot;overflow-y:hidden&quot;&gt;&lt;/textarea&gt;     <br />没有滚动条     <br />&lt;textarea style=&quot;overflow-x:hidden;overflow-y:hidden&quot;&gt;&lt;/textarea&gt; </p>  <p><strong>5.设定窗口滚动条的颜色 </strong>    <br />.coolscrollbar { scrollbar-arrow-color:yellow; scrollbar-base-color:lightsalmon; }     <br />将以上语句加入到样式表文件中或html头部的&lt;style&gt;&lt;/style&gt;当中，然后使用     <br />&lt;textarea class=&quot;coolscrollbar&quot;&gt;&lt;/textarea&gt; </p>  <p><strong>6.滚屏显示 </strong>    <br />当网页中有长篇文章时，浏览起来就比较吃劲了，想想一边忙着拖动滚动条，一边忙着浏览，确实挺累人的。为了客人能够轻松的浏览，我们可以使用script代码实现网页的自动滚屏，当双击网页的时候，网页将会自动向下滚动，再次单击时滚动停止。将下面的代码插入到&lt;body&gt; &lt;/body&gt;之间。     <br />&lt;script language&quot;javascript&quot;&gt;     <br />var currentpos,timer;     <br />function initialize()     <br />{     <br />timer=setInterval(&quot;scrollwindow()&quot;,10);     <br />}     <br />function sc(){     <br />clearInterval(timer);     <br />}     <br />function scrollwindow()     <br />{     <br />currentpos=document.body.scrollTop;     <br />window.scroll(0,++currentpos);     <br />if (currentpos != document.body.scrollTop)     <br />sc();     <br />}     <br />document.onmousedown=sc     <br />document.ondblclick=initialize     <br />&lt;/script&gt;</p><img src ="http://www.cnblogs.com/HeroBeast/aggbug/1306794.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42951/" target="_blank">[新闻]用手机聊Gtalk的方法以及应用总结</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>A Plugin Development Pattern</title><link>http://www.cnblogs.com/HeroBeast/archive/2008/10/08/1306267.html</link><dc:creator>HeroBeast</dc:creator><author>HeroBeast</author><pubDate>Wed, 08 Oct 2008 05:01:00 GMT</pubDate><guid>http://www.cnblogs.com/HeroBeast/archive/2008/10/08/1306267.html</guid><wfw:comment>http://www.cnblogs.com/HeroBeast/comments/1306267.html</wfw:comment><comments>http://www.cnblogs.com/HeroBeast/archive/2008/10/08/1306267.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/HeroBeast/comments/commentRss/1306267.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/HeroBeast/services/trackbacks/1306267.html</trackback:ping><description><![CDATA[摘要: I've been developing jQuery plugins for quite a while now, and I've become rather comfortable with a particular style of plugin development for my scripts. This article is meant to share the pattern t&nbsp;&nbsp;<a href='http://www.cnblogs.com/HeroBeast/archive/2008/10/08/1306267.html'>阅读全文</a><img src ="http://www.cnblogs.com/HeroBeast/aggbug/1306267.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42950/" target="_blank">[新闻]Google开拓美政府机构市场 微软业务受冲击</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>jQuery插件开发基础1</title><link>http://www.cnblogs.com/HeroBeast/archive/2008/10/08/1306260.html</link><dc:creator>HeroBeast</dc:creator><author>HeroBeast</author><pubDate>Wed, 08 Oct 2008 04:52:00 GMT</pubDate><guid>http://www.cnblogs.com/HeroBeast/archive/2008/10/08/1306260.html</guid><wfw:comment>http://www.cnblogs.com/HeroBeast/comments/1306260.html</wfw:comment><comments>http://www.cnblogs.com/HeroBeast/archive/2008/10/08/1306260.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/HeroBeast/comments/commentRss/1306260.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/HeroBeast/services/trackbacks/1306260.html</trackback:ping><description><![CDATA[<p>插件1：</p>  <p>jquery.plugindemo1.js</p>  <p>=================================================</p>  <p>jQuery.Demo1 = function(param) { </p>  <p> alert('This is a test. This is only a test.'+param);   <br /> };&#160; </p>  <p>=============================================</p>  <p>&#160;</p>  <p>调用：</p>  <p>&lt;script type=&quot;text/javascript&quot;&gt;   <br />&#160;&#160;&#160; $(function(){    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; $.Demo1(&quot;xxx&quot;);    <br />&#160;&#160;&#160; });    <br />&#160;&#160;&#160; &lt;/script&gt;</p><img src ="http://www.cnblogs.com/HeroBeast/aggbug/1306260.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42950/" target="_blank">[新闻]Google开拓美政府机构市场 微软业务受冲击</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>应用程序体系结构</title><link>http://www.cnblogs.com/HeroBeast/archive/2008/10/07/1305435.html</link><dc:creator>HeroBeast</dc:creator><author>HeroBeast</author><pubDate>Tue, 07 Oct 2008 04:48:00 GMT</pubDate><guid>http://www.cnblogs.com/HeroBeast/archive/2008/10/07/1305435.html</guid><wfw:comment>http://www.cnblogs.com/HeroBeast/comments/1305435.html</wfw:comment><comments>http://www.cnblogs.com/HeroBeast/archive/2008/10/07/1305435.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/HeroBeast/comments/commentRss/1305435.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/HeroBeast/services/trackbacks/1305435.html</trackback:ping><description><![CDATA[<p>&#160;</p>  <p>在我专攻代码之前，我想谈谈我尝试做的事。您可能记得，SuperGraph 让您从函数列表中进行选择。我希望能够在具体的目录中放置外接程序程序集，让 SuperGraph 检测它们，加载它们，并找到它们中包含的所有函数。</p>  <p>如果 SuperGraph 自己能完成此操作则不需要单独的 AppDomain<code>。</code><b>Assembly.Load()</b> 通常运行良好，但程序集无法独立卸载（只有 AppDomain 可以卸载）。这意味着如果您正在编写服务器，而且您希望用户无需启动和停止服务器即能更新他们的外接程序，那么您将无法使用默认的 AppDomain 实现此任务。</p>  <p>要实现此功能，我们将在一个独立的 AppDomain 中加载所有外接程序程序集。当添加或修改文件时，我们将卸载 AppDomain，创建新的 AppDomain，然后将当前文件加载到其中。这样，一切就都完美无缺了。</p>  <p>为了把这个讲得更明白一点，我创建了一个典型方案，如图 1 所示。</p>  <p><code><img height="308" alt="" src="http://www.yesky.com/SoftChannel/72342380484755456/20020911/fangz20910_1.gif" width="550" border="0" /></code></p>  <p><b>图 1：典型的 AppDomain 方案</b></p>  <p>在这个图表中，<b>Loader</b><code> </code>类创建一个名为 <b>Functions</b> 的新<code> </code>AppDomain。创建 AppDomain<code> </code>之后，<b>Loader</b><code> </code>在新的 AppDomain 中创建 <b>RemoteLoader</b><code> </code>的实例。</p>  <p>要加载程序集，请在 <code>RemoteLoader</code> 上调用加载函数。该函数打开新的程序集，找到程序集中的所有函数，将函数打包到 <code>FunctionList </code>对象中，然后将该对象返回到 <code>Loader</code>。然后，就可以通过 <code>Graph</code> 函数使用此 <code>FunctionList</code> 中的 <code>Function</code> 对象。</p>  <p><b>创建 AppDomain</b></p>  <p>第一项任务是创建 AppDomain。要以正确的方式创建 AppDomain，我们需要向 AppDomain 传递一个 <b>AppDomainSetup</b><code> </code>对象。一旦您理解了这一切的工作原理，关于这些的文档就足够使用了，但是如果您正在试图理解其工作原理，那么这些文档的帮助并不大。当关于该主题的 Google 搜索将上个月的专栏作为较高的匹配之一返回时，我怀疑我可能有点麻烦了。</p>  <p>必须处理的基本问题是如何在运行时加载程序集。默认情况下，运行时将查看全局程序集缓存或当前应用程序目录树。而我们希望从完全不同的目录中加载我们的外接程序。</p>  <p>当您查看 <b>AppDomainSetup</b> 的文档时，您将发现可以把 <b>ApplicationBase</b><code> </code>属性设置为要搜索程序集的目录。然而，我们也需要参考原始的程序目录，因为那是 <b>RemoteLoader</b><code> </code>类存在的地方。</p>  <p>AppDomain<code> </code>的创作者们理解这一点，因此他们已经提供了额外的位置，用于从中搜索程序集。我们将使用 <b>ApplicationBase</b><code> </code>引用外接程序目录，然后将 <b>PrivateBinPath</b><code> </code>设置为指向主应用程序目录。</p>  <p>下面是来自 <b>Loader</b><code> </code>类的代码，可实现此功能：</p>  <p>AppDomainSetup setup = new AppDomainSetup();    <br />setup.ApplicationBase = functionDirectory;     <br />setup.PrivateBinPath = AppDomain.CurrentDomain.BaseDirectory;     <br />setup.ApplicationName = &quot;Graph&quot;;     <br />appDomain = AppDomain.CreateDomain(&quot;Functions&quot;, null, setup); </p>  <p>remoteLoader = (RemoteLoader)    <br />appDomain.CreateInstanceFromAndUnwrap(&quot;SuperGraph.exe&quot;,     <br />&quot;SuperGraphInterface.RemoteLoader&quot;);</p>  <p>创建 AppDomain<code> </code>之后，使用 <b>CreateInstanceFromAndUnwrap()</b><code> </code>函数在新的应用程序域中创建 <b>RemoteLoader</b><code> </code>类的实例。请注意，需要使用类所在的程序集的文件名以及类的全名。</p>  <p>当执行此调用时，我们返回如同 <b>RemoteLoader</b> 一样的实例。实际上，它是一个小型代理类，将所有调用转发到其他 AppDomain 中的 <b>RemoteLoader</b><code> </code>实例中。这和 .NET Remoting 使用的是同一种结构。</p>  <p><b>程序集绑定日志查看器</b></p>  <p>当您编写代码实现此功能时，您会产生错误。本文档对如何调试应用程序并未提供什么建议，但是如果您知道该向谁询问，他们将告诉您有关程序集绑定日志查看器（名为&#8220;fuslogvw.exe&#8221;，因为加载子系统称为&#8220;fusion&#8221;）的信息。运行查看器时，您可以要求它记录故障，然后当您运行的应用程序出现加载程序集的问题时，您可以刷新查看器，获得当前情况的详细信息。</p>  <p>例如，您会发现 <b>Assembly.Load()</b><code> </code>的文件名末尾不需要 .dll，这一点非常有用。您可以从日志中获知这一点，因为它将告诉您它曾试图加载 <b>f.dll.dll</b>。</p>  <p><b>动态加载程序集</b></p>  <p>因此，既然我们已经创建了应用程序域，下一步应该搞清楚如何加载组件并从中提取函数。这需要两段相互独立的代码。第一段代码在目录中查找文件，然后加载找到的每个文件：</p>  <p>void LoadUserAssemblies()    <br />{     <br />availableFunctions = new FunctionList();     <br />LoadBuiltInFunctions(); </p>  <p>DirectoryInfo d = new DirectoryInfo(functionAssemblyDirectory);    <br />foreach (FileInfo file in d.GetFiles(&quot;*.dll&quot;))     <br />{     <br />string filename = file.Name.Replace(file.Extension, &quot;&quot;);     <br />FunctionList functionList = loader.LoadAssembly(filename);</p>  <p>availableFunctions.Merge(functionList);    <br />}     <br />}</p>  <p><b>     <br />Graph</b><code> </code>类中的函数在外接程序目录中查找所有的 dll 文件，删除它们的扩展名，然后告诉加载程序加载它们。返回的函数列表将并入当前的函数列表。</p>  <p>第二段代码在 <b>RemoteLoader</b><code> </code>类中，它实际加载程序集并查找函数：</p>  <p>public FunctionList LoadAssembly(string filename)    <br />{     <br />FunctionList functionList = new FunctionList();     <br />Assembly assembly = AppDomain.CurrentDomain.Load(filename); </p>  <p>foreach (Type t in assembly.GetTypes())    <br />{     <br />functionList.AddAllFromType(t);     <br />}     <br />return functionList;     <br />}</p>  <p>这段代码只是对传入的文件名（实际是程序集名称）调用<code> </code><b>Assembly.Load()</b>，然后将所有有用的函数加载到 <b>FunctionList</b><code> </code>实例中返回给调用程序。</p>  <p>此时，应用程序可以启动，加载外接程序程序集，然后用户就可以引用它们。</p>  <p><b>重新加载程序集</b></p>  <p>下一项任务是能够按照需要重新加载这些程序集。最终，我们希望能够自动实现该任务，但是出于测试目的，我将 <b>Reload</b><code> </code>按钮添加到窗体中，以使程序集能够重新加载。该按钮的处理程序仅调用 <b>Graph.Reload()</b>，它需要执行以下操作： </p>  <ol>   <li>卸载 AppDomain。 </li>    <li>创建新的 AppDomain。 </li>    <li>在新的 AppDomain 中重新加载程序集。 </li>    <li>将图形线条挂钩到新创建的 AppDomain。 </li> </ol>  <p>步骤 4 是必需的，因为 <b>GraphLine</b> 对象包含来自原 AppDomain 的 <b>Function</b> 对象。卸载 AppDomain 后，函数对象无法再被使用。</p>  <p>为解决此问题，<b>HookupFunctions()</b> 修改了 <b>GraphLine</b> 对象，使它们从当前应用程序域指向正确的函数。</p>  <p>代码如下：</p>  <p>loader.Unload();    <br />loader = new Loader(functionAssemblyDirectory);     <br />LoadUserAssemblies();     <br />HookupFunctions();     <br />reloadCount++; </p>  <p>if (this.ReloadCountChanged != null)    <br />ReloadCountChanged(this, new ReloadEventArgs(reloadCount));</p>  <p>只要执行重新加载操作，最后两行将引发一个事件。其作用是更新窗体上的重新加载计数器。</p>  <p><b>检测新的程序集</b></p>  <p>下一步是能够检测在外接程序目录中显示的新的或修改过的程序集。该框架提供 <b>FileSystemWatcher</b> 类来实现此功能。下面是我添加到 <b>Graph</b> 类构造函数中的代码：</p>  <p>watcher = new FileSystemWatcher(functionAssemblyDirectory, &quot;*.dll&quot;);    <br />watcher.EnableRaisingEvents = true;     <br />watcher.Changed += new FileSystemEventHandler(FunctionFileChanged);     <br />watcher.Created += new FileSystemEventHandler(FunctionFileChanged);     <br />watcher.Deleted += new FileSystemEventHandler(FunctionFileChanged);</p>  <p>当创建 <b>FileSystemWatcher</b> 类时，我们告诉它要在什么目录中查找，要跟踪哪些文件。<b>EnableRaisingEvents</b> 属性表示当它检测到更改时，我们是否需要它发送事件。最后 3 行将事件挂钩到类中的某个函数。该函数仅仅调用 <b>Reload()</b> 以重新加载程序集。</p>  <p>这种方法有一些累赘的地方。在更新程序集时，我们必须卸载程序集才能够加载新的版本，但是添加或删除文件时不需要卸载程序集。在这种情况下，对所有更改执行此操作的成本并不是很高，而且它使代码更简单。</p>  <p>在构造此代码之后，我们运行该应用程序，然后尝试把新的程序集复制到外接程序目录中。正如我们所希望的那样，我们获得了文件更改事件，当重新加载完毕时，新的函数就可供使用。</p>  <p>然而，当我们试图更新现有的程序集时，我们遇到了一个问题。运行时已经锁定该文件，这意味着我们无法将新的程序集复制到外接程序目录中，我们收到一个错误。</p>  <p><b>AppDomain</b> 类的<a href="http://design.yesky.com/">设计</a>人员意识到这是一个问题，因此他们提供一种不错的解决方法。当 <b>ShadowCopyFiles</b> 属性设置为 <b>true</b>（字符串 <b>true</b>，不是布尔常数 <b>true</b>。不要问我为什么&#8230;&#8230;）时，运行时将把程序集复制到缓存目录中，然后打开该程序集。这样，原文件就不会被锁定，我们也就能更新正在使用的程序集。ASP.NET 使用了这种机制。</p>  <p>为了启用此功能，我在 <b>Loader</b> 类的构造函数中添加了以下行：</p>  <p>setup.ShadowCopyFiles = &quot;true&quot;;</p>  <p>然后我重新生成了该应用程序，并得到相同的错误。我查看了 <b>ShadowCopyDirectories</b> 属性的文档，该文档明确指出 <b>PrivateBinPath</b> 指定的所有目录（包括 <b>ApplicationBase</b> 指定的目录）是阴影复制的（如果未设置此属性）。记得我是如何说该文档在这个方面不是很好的吗？</p>  <p>有关此属性的文档肯定是错了。我没有验证确切的表现方式，但是我可以告诉您 <b>ApplicationBase</b> 目录中的文件在默认情况下并不是阴影复制的。明确指定目录可以解决此问题：</p>  <p>setup.ShadowCopyDirectories = functionDirectory;</p>  <p>搞明白这一点至少花了我半个小时。</p>  <p>现在我们可以更新现有文件并将其正确地加载进去。可我刚把这个理顺，又遇到了另外一个小的问题。当我们从窗体的按钮上运行重新加载函数时，重新加载总是和绘制发生在同一个线程中，这意味着在重新加载过程中我们不可能尝试绘制直线。</p>  <p>既然我们已经切换到文件更改事件，那么在卸载 AppDomain 之后和加载新的 AppDomain 之前，有可能会进行绘制。如果发生这种情况，我们会得到一个异常。</p>  <p>这是传统的多线程编程问题，使用 C# <b>lock</b> 语句很容易处理。我在绘图函数和重新加载函数中添加了 <b>lock</b> 语句，这就确保了它们不会同时发生。这就解决了该问题，添加程序集的更新版本将使程序自动切换到函数的新版本。这相当不错。</p>  <p>还有一个奇怪的现象。原来用于检测文件更改的 Win32&#174; 函数发送的更改数量很大，因此对文件做一次更新将发送五个更改事件，程序集也将被重新加载五次。解决方法是编写更智能的、可以将这些操作组合在一起的 <b>FileSystemWatcher</b>，但是此版本中没有提供这种解决方法。</p>  <p><b>拖放</b></p>  <p>将文件复制到目录中不是很方便，因此我决定在该应用程序中添加拖放功能。实现该任务的第一步是把窗体的 <b>AllowDrop</b> 属性设置为 true，这将打开拖放功能。下一步，我将一个例程挂钩到 <b>DragEnter</b> 事件。当光标在对象上移动进行拖放操作以确定当前对象是否接受拖放时，将调用该事件。</p>  <p>private void Form1_DragEnter(    <br />object sender, System.Windows.Forms.DragEventArgs e)     <br />{     <br />object o = e.Data.GetData(DataFormats.FileDrop);     <br />if (o != null)     <br />{     <br />e.Effect = DragDropEffects.Copy;     <br />}     <br />string[] formats = e.Data.GetFormats();     <br />}</p>  <p>在此处理程序中，我查看是否有可用的 <code>FileDrop</code> 数据（也就是说，文件被拖放到窗口中）。如果有，我把效果设置为&#8220;复制&#8221;，这将相应地设置光标，并且如果用户释放鼠标按钮，将发送 <b>DragDrop</b> 事件。该函数中的最后一行完全是出于调试目的，用于查看操作中有哪些可用信息。</p>  <p>下一项任务是为 <b>DragDrop</b> 事件编写处理程序：</p>  <p>private void Form1_DragDrop(    <br />object sender, System.Windows.Forms.DragEventArgs e)     <br />{     <br />string[] filenames = (string[]) e.Data.GetData(DataFormats.FileDrop);     <br />graph.CopyFiles(filenames);     <br />}</p>  <p>此例程获得与此操作关联的数据（文件名数组），将其传递到图形函数，然后图形函数把文件复制到外接程序目录中，触发文件更改事件以便重新加载它们。</p>  <p><b>状态</b></p>  <p>此时，您可以运行该应用程序，把新的程序集拖到程序上，程序将很快加载它们并保持运行。这相当不错。</p><img src ="http://www.cnblogs.com/HeroBeast/aggbug/1305435.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42949/" target="_blank">[新闻]消息称苹果正在开发iTunes网络电视</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>C#中动态加载和卸载DLL</title><link>http://www.cnblogs.com/HeroBeast/archive/2008/10/07/1305429.html</link><dc:creator>HeroBeast</dc:creator><author>HeroBeast</author><pubDate>Tue, 07 Oct 2008 04:41:00 GMT</pubDate><guid>http://www.cnblogs.com/HeroBeast/archive/2008/10/07/1305429.html</guid><wfw:comment>http://www.cnblogs.com/HeroBeast/comments/1305429.html</wfw:comment><comments>http://www.cnblogs.com/HeroBeast/archive/2008/10/07/1305429.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/HeroBeast/comments/commentRss/1305429.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/HeroBeast/services/trackbacks/1305429.html</trackback:ping><description><![CDATA[<h6>C#中动态加载和卸载DLL</h6>  <p>在C++中加载和卸载DLL是一件很容易的事，LoadLibrary和FreeLibrary让你能够轻易的在程序中加载DLL，然后在任何地方卸载。在C#中我们也能使用Assembly.LoadFile实现动态加载DLL，但是当你试图卸载时，你会很惊讶的发现Assembly没有提供任何卸载的方法。这是由于托管代码的自动垃圾回收机制会做这件事情，所以C#不提供释放资源的函数，一切由垃圾回收来做。</p>  <p>这引发了一个问题，用Assembly加载的DLL可能只在程序结束的时候才会被释放，这也意味着在程序运行期间无法更新被加载的DLL。而这个功能在某些程序设计时是非常必要的，考虑你正在用反射机制写一个查看DLL中所有函数详细信息的程序，程序提供一个菜单让用户可以选择DLL文件，这时就需要让程序能够卸载DLL，否则一旦用户重新得到新版本DLL时，必须要重新启动程序，重新选择加载DLL文件，这样的设计是用户无法忍受的。</p>  <p>C#也提供了实现动态卸载DLL的方法，通过AppDomain来实现。AppDomain是一个独立执行应用程序的环境，<strong>当AppDomain被卸载的时候，在该环境中的所有资源也将被回收</strong>。关于AppDomain的详细资料参考MSDN。下面是使用AppDomain实现动态卸载DLL的代码，</p>  <p>using System;   <br />using System.Collections.Generic;    <br />using System.Text;    <br />using System.Threading;    <br />using System.Reflection;    <br />namespace UnloadDll    <br />{    <br />&#160;&#160;&#160; class Program    <br />&#160;&#160;&#160; {    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; static void Main(string[] args)    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; string callingDomainName = AppDomain.CurrentDomain.FriendlyName;//Thread.GetDomain().FriendlyName;    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Console.WriteLine(callingDomainName);    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; AppDomain ad = AppDomain.CreateDomain(&quot;DLL Unload test&quot;);    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ProxyObject obj = (ProxyObject)ad.CreateInstanceFromAndUnwrap(@&quot;UnloadDll.exe&quot;, &quot;UnloadDll.ProxyObject&quot;);    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; obj.LoadAssembly();    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; obj.Invoke(&quot;TestDll.Class1&quot;, &quot;Test&quot;, &quot;It's a test&quot;);    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; AppDomain.Unload(ad);    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; obj = null;    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Console.ReadLine();    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }    <br />&#160;&#160;&#160; }    <br />&#160;&#160;&#160; class ProxyObject : MarshalByRefObject    <br />&#160;&#160;&#160; {    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; Assembly assembly = null;    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; public void LoadAssembly()    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; assembly = Assembly.LoadFile(@&quot;TestDLL.dll&quot;);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; public bool Invoke(string fullClassName, string methodName, params Object[] args)    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if(assembly == null)    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return false;    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Type tp = assembly.GetType(fullClassName);    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (tp == null)    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return false;    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; MethodInfo method = tp.GetMethod(methodName);    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (method == null)     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return false;    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Object obj = Activator.CreateInstance(tp);    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; method.Invoke(obj, args);    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return true;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }    <br />&#160;&#160;&#160; }    <br />}</p>  <p><strong>注意：</strong></p>  <p><strong>1. 要想让一个对象能够穿过AppDomain边界，必须要继承MarshalByRefObject类，否则无法被其他AppDomain使用。</strong></p>  <p><strong>2. 每个线程都有一个默认的AppDomain，可以通过Thread.GetDomain()来得到</strong></p><img src ="http://www.cnblogs.com/HeroBeast/aggbug/1305429.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42949/" target="_blank">[新闻]消息称苹果正在开发iTunes网络电视</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>asp.net页面事件执行顺序</title><link>http://www.cnblogs.com/HeroBeast/archive/2008/10/06/1304478.html</link><dc:creator>HeroBeast</dc:creator><author>HeroBeast</author><pubDate>Mon, 06 Oct 2008 01:57:00 GMT</pubDate><guid>http://www.cnblogs.com/HeroBeast/archive/2008/10/06/1304478.html</guid><wfw:comment>http://www.cnblogs.com/HeroBeast/comments/1304478.html</wfw:comment><comments>http://www.cnblogs.com/HeroBeast/archive/2008/10/06/1304478.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/HeroBeast/comments/commentRss/1304478.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/HeroBeast/services/trackbacks/1304478.html</trackback:ping><description><![CDATA[<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Data;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Configuration;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Web;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Web.Security;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Web.UI;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Web.UI.WebControls;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Web.UI.WebControls.WebParts;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Web.UI.HtmlControls;<br />
<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">partial</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;_Default&nbsp;:&nbsp;Page&nbsp;<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Page_Load(</span><span style="color: #0000ff">object</span><span style="color: #000000">&nbsp;sender,&nbsp;EventArgs&nbsp;e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#region</span><span style="color: #000000">&nbsp;OnPreInit&nbsp;第一步</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">override</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;OnPreInit(EventArgs&nbsp;e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">检查&nbsp;IsPostBack&nbsp;属性来确定是不是第一次处理该页。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">创建或重新创建动态控件。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">动态设置主控页。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">动态设置&nbsp;Theme&nbsp;属性。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">读取或设置配置文件属性值。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">注意&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">如果请求是回发请求，则控件的值尚未从视图状态还原。如果在此阶段设置控件属性，则其值可能会在下一事件中被重写。</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">base</span><span style="color: #000000">.OnPreInit(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#endregion</span><span style="color: #000000"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#region</span><span style="color: #000000">&nbsp;OnInit&nbsp;第二步</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">override</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;OnInit(EventArgs&nbsp;e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">在所有控件都已初始化且已应用所有外观设置后引发。使用该事件来读取或初始化控件属性。</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">base</span><span style="color: #000000">.OnInit(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#endregion</span><span style="color: #000000"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#region</span><span style="color: #000000">&nbsp;OnInitComplete&nbsp;第三步</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">override</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;OnInitComplete(EventArgs&nbsp;e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">由&nbsp;Page&nbsp;对象引发。使用该事件来处理要求先完成所有初始化工作的任务。</span><span style="color: #008000"><br />
</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">base</span><span style="color: #000000">.OnInitComplete(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#endregion</span><span style="color: #000000"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#region</span><span style="color: #000000">&nbsp;PreLoad&nbsp;第四步</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">override</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;OnPreLoad(EventArgs&nbsp;e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">如果需要在&nbsp;Load&nbsp;事件之前对页或控件执行处理，请使用该事件。&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">在&nbsp;Page&nbsp;引发该事件后，它会为自身和所有控件加载视图状态，然后会处理&nbsp;Request&nbsp;实例包括的任何回发数据。</span><span style="color: #008000"><br />
</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">base</span><span style="color: #000000">.OnPreLoad(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#endregion</span><span style="color: #000000">&nbsp;</span><span style="color: #000000"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#region</span><span style="color: #000000">&nbsp;OnLoad&nbsp;第五步</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">override</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;OnLoad(EventArgs&nbsp;e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">Page&nbsp;在&nbsp;Page&nbsp;上调用&nbsp;OnLoad&nbsp;事件方法，然后以递归方式对每个子控件执行相同操作，如此循环往复，直到加载完本页和所有控件为止。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">使用&nbsp;OnLoad&nbsp;事件方法来设置控件中的属性并建立数据库连接。</span><span style="color: #008000"><br />
</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">base</span><span style="color: #000000">.OnLoad(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#endregion</span><span style="color: #000000"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#region</span><span style="color: #000000">&nbsp;控件事件&nbsp;第六步</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Button1_Click(</span><span style="color: #0000ff">object</span><span style="color: #000000">&nbsp;sender,&nbsp;EventArgs&nbsp;e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">用这些事件来处理特定控件事件，如&nbsp;Button&nbsp;控件的&nbsp;Click&nbsp;事件或&nbsp;TextBox&nbsp;控件的&nbsp;TextChanged&nbsp;事件。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">注意&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">在回发请求中，如果页包含验证程序控件，请在执行任何处理之前检查&nbsp;Page&nbsp;和各个验证控件的&nbsp;IsValid&nbsp;属性。</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#endregion</span><span style="color: #000000"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#region</span><span style="color: #000000">&nbsp;OnLoadComplete&nbsp;第七步</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">override</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;OnLoadComplete(EventArgs&nbsp;e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">对需要加载页上的所有其他控件的任务使用该事件。</span><span style="color: #008000"><br />
</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">base</span><span style="color: #000000">.OnLoadComplete(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#endregion</span><span style="color: #000000"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#region</span><span style="color: #000000">&nbsp;OnPreRender&nbsp;第八步</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">override</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;OnPreRender(EventArgs&nbsp;e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">在该事件发生前：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">Page&nbsp;对象会针对每个控件和页调用&nbsp;EnsureChildControls。&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">设置了&nbsp;DataSourceID&nbsp;属性的每个数据绑定控件会调用&nbsp;DataBind&nbsp;方法。有关更多信息，请参见下面的数据绑定控件的数据绑定事件。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">页上的每个控件都会发生&nbsp;PreRender&nbsp;事件。使用该事件对页或其控件的内容进行最后更改。</span><span style="color: #008000"><br />
</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">base</span><span style="color: #000000">.OnPreRender(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#endregion</span><span style="color: #000000">&nbsp;</span><span style="color: #000000"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#region</span><span style="color: #000000">&nbsp;SaveStateComplete&nbsp;第九步</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">override</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;OnSaveStateComplete(EventArgs&nbsp;e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">在该事件发生前，已针对页和所有控件保存了&nbsp;ViewState。将忽略此时对页或控件进行的任何更改。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">使用该事件执行满足以下条件的任务：要求已经保存了视图状态，但未对控件进行任何更改。</span><span style="color: #008000"><br />
</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">base</span><span style="color: #000000">.OnSaveStateComplete(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#endregion</span><span style="color: #000000"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#region</span><span style="color: #000000">&nbsp;Render&nbsp;第十步</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">Render<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">这不是事件；在处理的这个阶段，Page&nbsp;对象会在每个控件上调用此方法。所有&nbsp;ASP.NET&nbsp;Web&nbsp;服务器控件都有一个用于写出发送给浏览器的控件标记的&nbsp;Render&nbsp;方法。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">如果创建自定义控件，通常要重写此方法以输出控件的标记。不过，如果自定义控件只合并标准的&nbsp;ASP.NET&nbsp;Web&nbsp;服务器控件，不合并自定义标记，则不需要重写&nbsp;Render&nbsp;方法。有关更多信息，请参见开发自定义&nbsp;ASP.NET&nbsp;服务器控件。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">用户控件（.ascx&nbsp;文件）自动合并呈现，因此不需要在代码中显式呈现该控件。</span><span style="color: #008000"><br />
</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#endregion</span><span style="color: #000000"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#region</span><span style="color: #000000">&nbsp;OnUnload&nbsp;第十一步&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">override</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;OnUnload(EventArgs&nbsp;e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">该事件首先针对每个控件发生，继而针对该页发生。在控件中，使用该事件对特定控件执行最后清理，如关闭控件特定数据库连接。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">对于页自身，使用该事件来执行最后清理工作，如：关闭打开的文件和数据库连接，或完成日志记录或其他请求特定任务。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">注意&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">在卸载阶段，页及其控件已被呈现，因此无法对响应流做进一步更改。如果尝试调用方法（如&nbsp;Response.Write&nbsp;方法），则该页将引发异常。</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">base</span><span style="color: #000000">.OnUnload(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#endregion</span><span style="color: #000000"><br />
}<br />
</span></div>
<p>&nbsp;</p>
<p><a title="源文件" href="http://files.cnblogs.com/HeroBeast/Default.aspx.rar">源文件</a></p>
<img src ="http://www.cnblogs.com/HeroBeast/aggbug/1304478.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42948/" target="_blank">[新闻]微软周一开电话会议 预计将发布Silverlight2.0</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item></channel></rss>