<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="css/rss.xslt"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>夜的第七章</title><link>http://www.leadnt.com/</link><description>ASP.NET、MVC、UED、互联网开发</description><generator>RainbowSoft Studio Z-Blog 1.8 Walle Build 100427</generator><language>zh-CN</language><copyright>[2007 - 2011] &amp;amp;copy;  Leadnt.com var _bdhmProtocol = ((&amp;quot;https:&amp;quot; == document.location.protocol) ? &amp;quot; https://&amp;quot; : &amp;quot; http://&amp;quot;);document.write(unescape(&amp;quot;%3Cscript src='&amp;quot; + _bdhmProtocol + &amp;quot;hm.baidu.com/h.js%3F998a6cb2fb39023cd571cb7e45f2610a' type='text/javascript'%3E%3C/script%3E&amp;quot;));</copyright><pubDate>Fri, 06 Jan 2012 21:24:50 +0800</pubDate><item><title>微软企业库Entlib 5.0就是一坑爹的玩意</title><author>djy365@sina.com (Roy)</author><link>http://www.leadnt.com/.NET/WeiRuanQiYeKuEntlib-5-0JiuShiYiKengDieDeWanYi.html</link><pubDate>Fri, 06 Jan 2012 21:19:26 +0800</pubDate><guid>http://www.leadnt.com/.NET/WeiRuanQiYeKuEntlib-5-0JiuShiYiKengDieDeWanYi.html</guid><description><![CDATA[<p>如果把配置文件放在网站根目录，会报找不到entlib.config，这系企业库内部查找的时候路径有问题，网上有解决办法，就是修改企业库，或者放在web.config里。</p><p>&nbsp;</p><p>如果在MVC下做模型验证，加验证属性时，引用了企业库5.0的，会报错：<span class="CodePlexPageHeader">A validation attribute of type ValidatorCompositionAttribute cannot be used to validate values.                     </span></p><p><span class="CodePlexPageHeader">原因是企业库5.0对验证进行了封装和拦截，以前用到.NET内部的验证要走企业库，于是，他妈的不支持了，不支持你重写什么劲哪？</span></p><p>解决办法是，重载模型验证：</p><pre>public class MyModelBinder : DefaultModelBinder {	protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext) {					//base.OnModelUpdated(controllerContext, bindingContext);		ValidatorFactory factory = EnterpriseLibraryContainer.Current.GetInstance&lt;ValidatorFactory&gt;();		var validator = factory.CreateValidator(bindingContext.ModelType);		Dictionary&lt;string, bool&gt; startedValid = new Dictionary&lt;string, bool&gt;(StringComparer.OrdinalIgnoreCase);		foreach (var result in validator.Validate(bindingContext.Model)) {			string subPropertyName = CreateSubPropertyName(bindingContext.ModelName, result.Key);			if (!startedValid.ContainsKey(subPropertyName)) {				startedValid[subPropertyName] = bindingContext.ModelState.IsValidField(subPropertyName);			}			if (startedValid[subPropertyName]) {				bindingContext.ModelState.AddModelError(subPropertyName, result.Message);			}		}	}}</pre><p>最後在global.asax.cs 中的Application_Start 設定一下，加入</p><table>    <tbody>        <tr>            <td class="number">&nbsp;</td>            <td class="content"><code class="plain">ModelBinders.Binders.DefaultBinder = </code><code class="keyword">new</code> <code class="plain">MyModelBinder();</code></td>        </tr>    </tbody></table><pre></pre><p>参考资料：</p><p><span style="color: rgb(255, 0, 0);">http://entlib.codeplex.com/discussions/211051</span></p><p>http://www.cnblogs.com/klzwj1988/archive/2010/05/12/1733730.html</p><p>http://www.cnblogs.com/kyo-yo/archive/2010/07/19/Learning-EntLib-Fifth-Introduction-Validation-module-information-Part1.html</p><p><span style="color: rgb(255, 0, 0);">http://www.dotblogs.com.tw/maev85/archive/2010/08/31/17507.aspx</span></p><p>&nbsp;</p>]]></description><category>.NET</category><comments>http://www.leadnt.com/.NET/WeiRuanQiYeKuEntlib-5-0JiuShiYiKengDieDeWanYi.html#comment</comments><wfw:comment>http://www.leadnt.com/</wfw:comment><wfw:commentRss>http://www.leadnt.com/feed.asp?cmt=660</wfw:commentRss><trackback:ping>http://www.leadnt.com/cmd.asp?act=tb&amp;id=660&amp;key=15512165</trackback:ping></item><item><title>Entity Framework POCO SaveChanges()失效的原因及解决</title><author>djy365@sina.com (Roy)</author><link>http://www.leadnt.com/.NET/Entity-Framework-POCO-SaveChanges-ShiXiaoDeYuanYinJiJieJue.html</link><pubDate>Thu, 05 Jan 2012 10:21:31 +0800</pubDate><guid>http://www.leadnt.com/.NET/Entity-Framework-POCO-SaveChanges-ShiXiaoDeYuanYinJiJieJue.html</guid><description><![CDATA[public void UpdateContact(Contact contact)<br/>{<br/>	var findContact = GetContact(contact.ContactID);<br/>	findContact = contact;<br/>	_context.SaveChanges();<br/>}<br/><br/>public Contact GetContact(int contactId)<br/>{<br/>	return GetAllContacts().SingleOrDefault(c => c.ContactID == contactId);<br/>}<br/><br/><br/>public IQueryable<Contact> GetAllContacts()<br/>{<br/>	return _context.Contacts;<br/>}<br/><br/>问题出在当赋值findContact = contact时，ObjectStateManager不知道EntityState发生改变了（还一直是为改变）。 因此，没有生成更新的SQL语句，有下面几种方法可以更新:<br/><br/>Option 1: 逐个属性赋值:<br/><br/>var findContact = GetContact(contact.ContactID);<br/>findContact.FirstName = contact.FirstName;<br/>findContact.LastName = contact.LastName;<br/>...<br/>_context.SaveChanges();<br/><br/>Option 2: 使用ApplyCurrentValues方法:<br/><br/>var findContact = GetContact(contact.ContactID);<br/>_context.ApplyCurrentValues("Contacts", contact);<br/>_context.SaveChanges();<br/><br/>Option 3: 附上更新的实体，并改变ObjectStateManager中的状态。(注意：这不会使数据库查询现有的contact).<br/><br/>_context.AttachTo("Contacts", contact);<br/>var contactEntry = Context.ObjectStateManager.GetObjectStateEntry(contact);<br/>contactEntry.ChangeState(EntityState.Modified);<br/>_context.SaveChanges();]]></description><category>.NET</category><comments>http://www.leadnt.com/.NET/Entity-Framework-POCO-SaveChanges-ShiXiaoDeYuanYinJiJieJue.html#comment</comments><wfw:comment>http://www.leadnt.com/</wfw:comment><wfw:commentRss>http://www.leadnt.com/feed.asp?cmt=659</wfw:commentRss><trackback:ping>http://www.leadnt.com/cmd.asp?act=tb&amp;id=659&amp;key=e0fc1ecf</trackback:ping></item><item><title>ASP.NET HashTable冲突可能导致拒绝服务漏洞更新补丁下载</title><author>djy365@sina.com (Roy)</author><link>http://www.leadnt.com/.NET/ASP.NET_HashTable__Cause_DoS_Vulnerability_Security_Update.html</link><pubDate>Sat, 31 Dec 2011 09:51:00 +0800</pubDate><guid>http://www.leadnt.com/.NET/ASP.NET_HashTable__Cause_DoS_Vulnerability_Security_Update.html</guid><description><![CDATA[<p>问题描述：</p><p><span lang="zh-CN" id="result_box"><span>在</span></span>Microsoft .NET Framework（包含1.1 SP1, 2.0 SP2, 3.5 SP1, 3.5.1, and 4.0）框架中的子系统Microsoft ASP.NET中构造HashTable的CaseInsensitiveHashProvider.getHashCode函数，在web表单提交时对提交表单参数做哈希计算时不做限制，从而引起哈希计算冲突。攻击者通过发送过多的参数从而引起服务器CPU消耗过高从而导致&ldquo;拒绝服务&rdquo;，又名<span lang="zh-CN" class="short_text" id="result_box"><span>&ldquo;</span><span>在</span><span>HashTable中</span><span>的</span><span>冲突可能</span><span>导致</span><span>拒绝服务漏洞</span><span>。</span><span>&rdquo;</span></span></p><p>该更新包含在<a href="http://technet.microsoft.com/en-us/security/bulletin/ms11-100" target="_blank">微软安全公告MS11-100</a>中。</p><p>相关补丁下载地址列表：</p><table width="676" cellspacing="0" cellpadding="0" border="1" class="dataTable" style="">    <thead>        <tr>            <th>操作系统</th>            <th>对于更新补丁下载地址链接</th>        </tr>    </thead>    <tbody>        <tr>            <th colspan="5">Windows XP</th>        </tr>    </tbody>    <tbody>        <tr>            <td>Windows XP Service Pack 3</td>            <td><a href="http://www.microsoft.com/downloads/details.aspx?familyid=471e1f51-c79c-4285-9f1e-aee1e4c4f189">Microsoft .NET Framework 1.1 Service Pack 1</a><br />            (KB2656353)<br />            <br />            <a href="http://www.microsoft.com/downloads/details.aspx?familyid=eff633f7-abd9-45cc-acbd-4885123dbed2">Microsoft .NET Framework 2.0 Service Pack 2</a><br />            (KB2656352)<br />            <br />            <a href="http://www.microsoft.com/downloads/details.aspx?familyid=306acd0a-bea2-40dd-a639-f381587c9eb7">Microsoft .NET Framework 3.5 Service Pack 1</a><br />            (KB2657424)<br />            <br />            <a href="http://www.microsoft.com/downloads/details.aspx?familyid=37a8fb34-e3ad-4605-980b-28361889ce72">Microsoft .NET Framework 4</a><sup>[1]</sup><br />            (KB2656351)</td>        </tr>        <tr class="alternateRow">            <td>Windows XP Professional x64 Edition Service Pack 2</td>            <td><a href="http://www.microsoft.com/downloads/details.aspx?familyid=471e1f51-c79c-4285-9f1e-aee1e4c4f189">Microsoft .NET Framework 1.1 Service Pack 1</a><br />            (KB2656353)<br />            <br />            <a href="http://www.microsoft.com/downloads/details.aspx?familyid=eff633f7-abd9-45cc-acbd-4885123dbed2">Microsoft .NET Framework 2.0 Service Pack 2</a><br />            (KB2656352)<br />            <br />            <a href="http://www.microsoft.com/downloads/details.aspx?familyid=306acd0a-bea2-40dd-a639-f381587c9eb7">Microsoft .NET Framework 3.5 Service Pack 1</a><br />            (KB2657424)<br />            <br />            <a href="http://www.microsoft.com/downloads/details.aspx?familyid=37a8fb34-e3ad-4605-980b-28361889ce72">Microsoft .NET Framework 4</a><sup>[1]</sup><br />            (KB2656351)</td>        </tr>    </tbody>    <tbody>        <tr>            <th colspan="5">Windows Server 2003</th>        </tr>    </tbody>    <tbody>        <tr>            <td>Windows Server 2003 Service Pack 2</td>            <td><a href="http://www.microsoft.com/downloads/details.aspx?familyid=7538762a-50e9-4f13-a60e-ff99aa8fbbf8">Microsoft .NET Framework 1.1 Service Pack 1</a><br />            (KB2656358)<br />            <br />            <a href="http://www.microsoft.com/downloads/details.aspx?familyid=eff633f7-abd9-45cc-acbd-4885123dbed2">Microsoft .NET Framework 2.0 Service Pack 2</a><br />            (KB2656352)<br />            <br />            <a href="http://www.microsoft.com/downloads/details.aspx?familyid=306acd0a-bea2-40dd-a639-f381587c9eb7">Microsoft .NET Framework 3.5 Service Pack 1</a><br />            (KB2657424)<br />            <br />            <a href="http://www.microsoft.com/downloads/details.aspx?familyid=37a8fb34-e3ad-4605-980b-28361889ce72">Microsoft .NET Framework 4</a><sup>[1]</sup><br />            (KB2656351)</td>        </tr>        <tr class="alternateRow">            <td>Windows Server 2003 x64 Edition Service Pack 2</td>            <td><a href="http://www.microsoft.com/downloads/details.aspx?familyid=471e1f51-c79c-4285-9f1e-aee1e4c4f189">Microsoft .NET Framework 1.1 Service Pack 1</a><br />            (KB2656353)<br />            <br />            <a href="http://www.microsoft.com/downloads/details.aspx?familyid=eff633f7-abd9-45cc-acbd-4885123dbed2">Microsoft .NET Framework 2.0 Service Pack 2</a><br />            (KB2656352)<br />            <br />            <a href="http://www.microsoft.com/downloads/details.aspx?familyid=306acd0a-bea2-40dd-a639-f381587c9eb7">Microsoft .NET Framework 3.5 Service Pack 1</a><br />            (KB2657424)<br />            <br />            <a href="http://www.microsoft.com/downloads/details.aspx?familyid=37a8fb34-e3ad-4605-980b-28361889ce72">Microsoft .NET Framework 4</a><sup>[1]</sup><br />            (KB2656351)</td>        </tr>        <tr>            <td>Windows Server 2003 with SP2 for Itanium-based Systems</td>            <td><a href="http://www.microsoft.com/downloads/details.aspx?familyid=471e1f51-c79c-4285-9f1e-aee1e4c4f189">Microsoft .NET Framework 1.1 Service Pack 1</a><br />            (KB2656353)<br />            <br />            <a href="http://www.microsoft.com/downloads/details.aspx?familyid=eff633f7-abd9-45cc-acbd-4885123dbed2">Microsoft .NET Framework 2.0 Service Pack 2</a><br />            (KB2656352)<br />            <br />            <a href="http://www.microsoft.com/downloads/details.aspx?familyid=306acd0a-bea2-40dd-a639-f381587c9eb7">Microsoft .NET Framework 3.5 Service Pack 1</a><br />            (KB2657424)<br />            <br />            <a href="http://www.microsoft.com/downloads/details.aspx?familyid=37a8fb34-e3ad-4605-980b-28361889ce72">Microsoft .NET Framework 4</a><sup>[1]</sup><br />            (KB2656351)</td>        </tr>    </tbody>    <tbody>        <tr>            <th colspan="5">Windows Vista</th>        </tr>    </tbody>    <tbody>        <tr class="alternateRow">            <td>Windows Vista Service Pack 2</td>            <td><a href="http://www.microsoft.com/downloads/details.aspx?familyid=471e1f51-c79c-4285-9f1e-aee1e4c4f189">Microsoft .NET Framework 1.1 Service Pack 1</a><br />            (KB2656353)<br />            <br />            <a href="http://www.microsoft.com/downloads/details.aspx?familyid=49050cf2-949a-40e5-b2ee-6257a3837294">Microsoft .NET Framework 2.0 Service Pack 2</a><br />            (KB2656362)<br />            <br />            <a href="http://www.microsoft.com/downloads/details.aspx?familyid=306acd0a-bea2-40dd-a639-f381587c9eb7">Microsoft .NET Framework 3.5 Service Pack 1</a><br />            (KB2657424)<br />            <br />            <a href="http://www.microsoft.com/downloads/details.aspx?familyid=37a8fb34-e3ad-4605-980b-28361889ce72">Microsoft .NET Framework 4</a><sup>[1]</sup><br />            (KB2656351)</td>        </tr>        <tr>            <td>Windows Vista x64 Edition Service Pack 2</td>            <td><a href="http://www.microsoft.com/downloads/details.aspx?familyid=471e1f51-c79c-4285-9f1e-aee1e4c4f189">Microsoft .NET Framework 1.1 Service Pack 1</a><br />            (KB2656353)<br />            <br />            <a href="http://www.microsoft.com/downloads/details.aspx?familyid=49050cf2-949a-40e5-b2ee-6257a3837294">Microsoft .NET Framework 2.0 Service Pack 2</a><br />            (KB2656362)<br />            <br />            <a href="http://www.microsoft.com/downloads/details.aspx?familyid=306acd0a-bea2-40dd-a639-f381587c9eb7">Microsoft .NET Framework 3.5 Service Pack 1</a><br />            (KB2657424)<br />            <br />            <a href="http://www.microsoft.com/downloads/details.aspx?familyid=37a8fb34-e3ad-4605-980b-28361889ce72">Microsoft .NET Framework 4</a><sup>[1]</sup><br />            (KB2656351)</td>        </tr>    </tbody>    <tbody>        <tr>            <th colspan="5">Windows Server 2008</th>        </tr>    </tbody>    <tbody>        <tr class="alternateRow">            <td>Windows Server 2008 for 32-bit Systems Service Pack 2</td>            <td><a href="http://www.microsoft.com/downloads/details.aspx?familyid=471e1f51-c79c-4285-9f1e-aee1e4c4f189">Microsoft .NET Framework 1.1 Service Pack 1</a>**<br />            (KB2656353)<br />            <br />            <a href="http://www.microsoft.com/downloads/details.aspx?familyid=49050cf2-949a-40e5-b2ee-6257a3837294">Microsoft .NET Framework 2.0 Service Pack 2</a>**<br />            (KB2656362)<br />            <br />            <a href="http://www.microsoft.com/downloads/details.aspx?familyid=306acd0a-bea2-40dd-a639-f381587c9eb7">Microsoft .NET Framework 3.5 Service Pack 1</a>**<br />            (KB2657424)<br />            <br />            <a href="http://www.microsoft.com/downloads/details.aspx?familyid=37a8fb34-e3ad-4605-980b-28361889ce72">Microsoft .NET Framework 4</a>**<sup>[1]</sup><br />            (KB2656351)</td>        </tr>        <tr>            <td>Windows Server 2008 for x64-based Systems Service Pack 2</td>            <td><a href="http://www.microsoft.com/downloads/details.aspx?familyid=471e1f51-c79c-4285-9f1e-aee1e4c4f189">Microsoft .NET Framework 1.1 Service Pack 1</a>**<br />            (KB2656353)<br />            <br />            <a href="http://www.microsoft.com/downloads/details.aspx?familyid=49050cf2-949a-40e5-b2ee-6257a3837294">Microsoft .NET Framework 2.0 Service Pack 2</a>**<br />            (KB2656362)<br />            <br />            <a href="http://www.microsoft.com/downloads/details.aspx?familyid=306acd0a-bea2-40dd-a639-f381587c9eb7">Microsoft .NET Framework 3.5 Service Pack 1</a>**<br />            (KB2657424)<br />            <br />            <a href="http://www.microsoft.com/downloads/details.aspx?familyid=37a8fb34-e3ad-4605-980b-28361889ce72">Microsoft .NET Framework 4</a>**<sup>[1]</sup><br />            (KB2656351)</td>        </tr>        <tr class="alternateRow">            <td>Windows Server 2008 for Itanium-based Systems Service Pack 2</td>            <td><a href="http://www.microsoft.com/downloads/details.aspx?familyid=471e1f51-c79c-4285-9f1e-aee1e4c4f189">Microsoft .NET Framework 1.1 Service Pack 1</a><br />            (KB2656353)<br />            <br />            <a href="http://www.microsoft.com/downloads/details.aspx?familyid=49050cf2-949a-40e5-b2ee-6257a3837294">Microsoft .NET Framework 2.0 Service Pack 2</a><br />            (KB2656362)<br />            <br />            <a href="http://www.microsoft.com/downloads/details.aspx?familyid=306acd0a-bea2-40dd-a639-f381587c9eb7">Microsoft .NET Framework 3.5 Service Pack 1</a><br />            (KB2657424)<br />            <br />            <a href="http://www.microsoft.com/downloads/details.aspx?familyid=37a8fb34-e3ad-4605-980b-28361889ce72">Microsoft .NET Framework 4</a><sup>[1]</sup><br />            (KB2656351)</td>        </tr>    </tbody>    <tbody>        <tr>            <th colspan="5">Windows 7</th>        </tr>    </tbody>    <tbody>        <tr>            <td>Windows 7 for 32-bit Systems</td>            <td><a href="http://www.microsoft.com/downloads/details.aspx?familyid=2de28d32-1efd-4177-82e6-19a08266096c">Microsoft .NET Framework 3.5.1</a><br />            (KB2656355)<br />            <br />            <a href="http://www.microsoft.com/downloads/details.aspx?familyid=37a8fb34-e3ad-4605-980b-28361889ce72">Microsoft .NET Framework 4</a><sup>[1]</sup><br />            (KB2656351)</td>        </tr>        <tr class="alternateRow">            <td>Windows 7 for 32-bit Systems Service Pack 1</td>            <td><a href="http://www.microsoft.com/downloads/details.aspx?familyid=26e0b56d-9228-49cf-9276-0741257567a9">Microsoft .NET Framework 3.5.1</a><br />            (KB2656356)<br />            <br />            <a href="http://www.microsoft.com/downloads/details.aspx?familyid=37a8fb34-e3ad-4605-980b-28361889ce72">Microsoft .NET Framework 4</a><sup>[1]</sup><br />            (KB2656351)</td>        </tr>        <tr>            <td>Windows 7 for x64-based Systems</td>            <td><a href="http://www.microsoft.com/downloads/details.aspx?familyid=2de28d32-1efd-4177-82e6-19a08266096c">Microsoft .NET Framework 3.5.1</a><br />            (KB2656355)<br />            <br />            <a href="http://www.microsoft.com/downloads/details.aspx?familyid=37a8fb34-e3ad-4605-980b-28361889ce72">Microsoft .NET Framework 4</a><sup>[1]</sup><br />            (KB2656351)</td>        </tr>        <tr class="alternateRow">            <td>Windows 7 for x64-based Systems Service Pack 1</td>            <td><a href="http://www.microsoft.com/downloads/details.aspx?familyid=26e0b56d-9228-49cf-9276-0741257567a9">Microsoft .NET Framework 3.5.1</a><br />            (KB2656356)<br />            <br />            <a href="http://www.microsoft.com/downloads/details.aspx?familyid=37a8fb34-e3ad-4605-980b-28361889ce72">Microsoft .NET Framework 4</a><sup>[1]</sup><br />            (KB2656351)</td>        </tr>    </tbody>    <tbody>        <tr>            <th colspan="5">Windows Server 2008 R2</th>        </tr>    </tbody>    <tbody>        <tr>            <td>Windows Server 2008 R2 for x64-based Systems</td>            <td><a href="http://www.microsoft.com/downloads/details.aspx?familyid=2de28d32-1efd-4177-82e6-19a08266096c">Microsoft .NET Framework 3.5.1</a>*<br />            (KB2656355)<br />            <br />            <a href="http://www.microsoft.com/downloads/details.aspx?familyid=37a8fb34-e3ad-4605-980b-28361889ce72">Microsoft .NET Framework 4</a><sup>[1]</sup><br />            (KB2656351)</td>        </tr>        <tr class="alternateRow">            <td>Windows Server 2008 R2 for x64-based Systems Service Pack 1</td>            <td><a href="http://www.microsoft.com/downloads/details.aspx?familyid=26e0b56d-9228-49cf-9276-0741257567a9">Microsoft .NET Framework 3.5.1</a>*<br />            (KB2656356)<br />            <br />            <a href="http://www.microsoft.com/downloads/details.aspx?familyid=37a8fb34-e3ad-4605-980b-28361889ce72">Microsoft .NET Framework 4</a>*<sup>[1]</sup><br />            (KB2656351)</td>        </tr>        <tr>            <td>Windows Server 2008 R2 for Itanium-based Systems</td>            <td><a href="http://www.microsoft.com/downloads/details.aspx?familyid=2de28d32-1efd-4177-82e6-19a08266096c">Microsoft .NET Framework 3.5.1</a><br />            (KB2656355)<br />            <br />            <a href="http://www.microsoft.com/downloads/details.aspx?familyid=37a8fb34-e3ad-4605-980b-28361889ce72">Microsoft .NET Framework 4</a><sup>[1]</sup><br />            (KB2656351)</td>        </tr>        <tr class="alternateRow">            <td>Windows Server 2008 R2 for Itanium-based Systems Service Pack 1</td>            <td><a href="http://www.microsoft.com/downloads/details.aspx?familyid=26e0b56d-9228-49cf-9276-0741257567a9">Microsoft .NET Framework 3.5.1</a><br />            (KB2656356)<br />            <br />            <a href="http://www.microsoft.com/downloads/details.aspx?familyid=37a8fb34-e3ad-4605-980b-28361889ce72">Microsoft .NET Framework 4</a><sup>[1]</sup><br />            (KB2656351)</td>        </tr>    </tbody></table><p>&nbsp;</p><p>相关漏洞详情：http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2011-3414</p><p>相关补丁详情：http://technet.microsoft.com/en-us/security/bulletin/ms11-100</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p>]]></description><category>.NET</category><comments>http://www.leadnt.com/.NET/ASP.NET_HashTable__Cause_DoS_Vulnerability_Security_Update.html#comment</comments><wfw:comment>http://www.leadnt.com/</wfw:comment><wfw:commentRss>http://www.leadnt.com/feed.asp?cmt=658</wfw:commentRss><trackback:ping>http://www.leadnt.com/cmd.asp?act=tb&amp;id=658&amp;key=c9aa668f</trackback:ping></item><item><title>(转)javascript添加事件、动态添加、修改、删除对象的属性和方法</title><author>djy365@sina.com (Roy)</author><link>http://www.leadnt.com/Javascript/Zhuan-javascriptTianJiaShiJianDongTaiTianJiaXiuGaiShanChuDuiXiangDeShuXingHeFangFa.html</link><pubDate>Wed, 28 Dec 2011 10:39:44 +0800</pubDate><guid>http://www.leadnt.com/Javascript/Zhuan-javascriptTianJiaShiJianDongTaiTianJiaXiuGaiShanChuDuiXiangDeShuXingHeFangFa.html</guid><description><![CDATA[[code=javascript]<br/>var msg = "参数";<br/>if (window.attachEvent)<br/>{<br/>//支持 IE<br/>btn.attachEvent("onclick", function () { showMessage(msg) });<br/>}<br/>else<br/>{<br/>//支持 FF<br/>btn.addEventListener("click", function () { showMessage(msg) }, false);<br/>}<br/><br/> <br/><br/>添加和删除事件<br/><br/><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><br/><html xmlns="http://www.w3.org/1999/xhtml"><br/><head><br/><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><br/><title>JavaScript添加、删除事件的方法</title><br/><script type="text/javascript"><br/>var EventUtil=new Object;<br/>EventUtil.addEvent=function(oTarget,sEventType,funName){<br/>    if(oTarget.addEventListener){//for DOM;<br/>  oTarget.addEventListener(sEventType,funName, false);<br/> }else if(oTarget.attachEvent){<br/>  oTarget.attachEvent("on"+sEventType,funName);<br/> }else{<br/>  oTarget["on"+sEventType]=funName;<br/> }<br/>};<br/>EventUtil.removeEvent=function(oTarget,sEventType,funName){<br/>    if(oTarget.removeEventListener){//for DOM;<br/>  oTarget.removeEventListener(sEventType,funName, false);<br/> }else if(oTarget.detachEvent){<br/>  oTarget.detachEvent("on"+sEventType,funName);<br/> }else{<br/>  oTarget["on"+sEventType]=null;<br/> }<br/>};<br/>function removeClick(){<br/> alert("click");<br/> var oDiv=document.getElementById("odiv");<br/> oDiv.style.cursor="auto";<br/> EventUtil.removeEvent(oDiv,"click",removeClick);<br/>}<br/><br/>function addLoadEvent(func){<br/>    var oldonload=window.onload;<br/>    if(typeof window.onload !="function"){<br/>        window.onload=func;<br/>    }else{<br/>        window.onload=function(){<br/>            oldonload();<br/>            func();<br/>        }<br/>    }<br/>}<br/><br/>addLoadEvent(addClick);<br/>function addClick(){<br/> var oDiv=document.getElementById("odiv");<br/> oDiv.style.cursor="pointer";<br/> EventUtil.addEvent(oDiv,"click",removeClick);<br/>}<br/></script><br/></head><br/><br/><br/><p>第一次点的时候弹出警告，并移除click事件,再点点击就失效了</p><div id="odiv" style="background:#003399; height:70px; width:126px; margin:0 auto; color:skyblue; ">第一次警告，第二次没反应！</div><br/><br/><br/> <br/><br/> <br/><br/>属性<br/><br/>在其他语言中，对象一旦生成，就不可更改了，要为一个对象添加修改成员必须要在对<br/>应的类中修改，并重新实例化，而且程序必须经过重新编译。JavaScript 中却非如此，它提<br/>供了灵活的机制来修改对象的行为，可以动态添加、修改、删除属性和方法。例如首先使用<br/>类Object来创建一个空对象user：<br/>var user=new Object();<br/>1．添加属性<br/>这时user 对象没有任何属性和方法，显然没有任何用途。但可以为它动态的添加属性<br/>和方法，例如：<br/>user.name=”jack”;<br/>user.age=21;<br/>user.sex=”male”;<br/>通过上述语句，user 对象便具有了三个属性：name、age和sex。下面输出这三个语句：<br/>alert(user.name);<br/>alert(user.age);<br/>alert(user.sex);<br/>由代码运行效果可知，三个属性已经完全属于user 对象了。<br/>2．添加方法<br/>添加方法的过程和属性类似：<br/>user.alert=function(){<br/>alert(“my name is:”+this.name);<br/>}<br/>这就为user 对象添加了一个方法“alert”，通过执行它，可以弹出一个对话框显示自己<br/>的名字介绍：<br/>user.alert();<br/>3．修改属性<br/>修改一个属性的过程就是用新的属性替换旧的属性，例如：<br/>user.name=”tom”;<br/>user.alert=function(){<br/>alert(“hello,”+this.name);<br/>}<br/>这样就修改了user 对象name属性的值和alert方法，它从显示“my name is”变为了显<br/>示“hello”。<br/>4．删除属性<br/>删除一个属性的过程也很简单，就是将其置为undefined：<br/>user.name=undefined;<br/>user.alert=undefined;<br/>这样就删除了name属性和alert方法。在之后的代码中，这些属性变的不可用。<br/>在添加、修改或者删除属性时，和引用属性相同，也可以采用方括号（[]）语法：<br/>user[“name”]=”tom”;<br/>使用这种方式还有一个额外的特点，就是可以使用非标识符字符串作为属性名称，例如<br/>标识符中不允许以数字开头或者出现空格，但在方括号（[]）语法中却可以使用：<br/>user[“my name”]=”tom”;<br/>需要注意，在使用这种非标识符作为名称的属性时，仍然要用方括号语法来引用：<br/>alert(user[“my name”]);<br/>而不能写为：<br/>alert(user.my name);<br/>利用对象的这种性质，甚至可以很容易实现一个简单的哈希表，在本书的后面将会看到<br/>其应用。此可见，JavaScript中的每个对象都是动态可变的，这给编程带来了很大的灵活性，<br/>也和其他语言产生了很大的区别，读者可以体会这种性质。<br/>[/code]]]></description><category>Javascript</category><comments>http://www.leadnt.com/Javascript/Zhuan-javascriptTianJiaShiJianDongTaiTianJiaXiuGaiShanChuDuiXiangDeShuXingHeFangFa.html#comment</comments><wfw:comment>http://www.leadnt.com/</wfw:comment><wfw:commentRss>http://www.leadnt.com/feed.asp?cmt=657</wfw:commentRss><trackback:ping>http://www.leadnt.com/cmd.asp?act=tb&amp;id=657&amp;key=7f66c328</trackback:ping></item><item><title>C#读取word.doc,docx</title><author>djy365@sina.com (Roy)</author><link>http://www.leadnt.com/.NET/C-DuQuword-doc-docx.html</link><pubDate>Fri, 23 Dec 2011 17:21:55 +0800</pubDate><guid>http://www.leadnt.com/.NET/C-DuQuword-doc-docx.html</guid><description><![CDATA[引用com里的Microsoft.Office.Interop.Word；<br/>[code=csharp]<br/>using System;<br/>using System.Collections.Generic;<br/>using System.Linq;<br/>using System.Text;<br/>using Microsoft.Office.Interop.Word;<br/><br/>namespace WordDemo<br/>{<br/>    class Program<br/>    {<br/>        static void Main(string[] args)<br/>        {<br/>            object oMissing = System.Reflection.Missing.Value;<br/>            Application app = new Application();<br/>            app.Visible = false;<br/>            object fileName = @"C:\Users\dujianyu\Desktop\2011111811125930.doc";<br/>            Document doc = new Document();<br/>            object format = WdOpenFormat.wdOpenFormatDocument;<br/>            doc = app.Documents.Open(ref fileName, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing,<br/>ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing,<br/>ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing);<br/>            string content = doc.Content.Text.ToString();<br/>            doc.Close(ref oMissing, ref oMissing, ref oMissing);<br/>            app.Quit(ref oMissing, ref oMissing, ref oMissing);<br/><br/>            int i = 0;<br/>        }<br/>    }<br/>}<br/><br/>[/code]]]></description><category>.NET</category><comments>http://www.leadnt.com/.NET/C-DuQuword-doc-docx.html#comment</comments><wfw:comment>http://www.leadnt.com/</wfw:comment><wfw:commentRss>http://www.leadnt.com/feed.asp?cmt=656</wfw:commentRss><trackback:ping>http://www.leadnt.com/cmd.asp?act=tb&amp;id=656&amp;key=ad2bf9e1</trackback:ping></item><item><title>x64的firefox - waterfox</title><author>djy365@sina.com (Roy)</author><link>http://www.leadnt.com/Daity/x64Defirefox-waterfox.html</link><pubDate>Thu, 22 Dec 2011 14:52:02 +0800</pubDate><guid>http://www.leadnt.com/Daity/x64Defirefox-waterfox.html</guid><description><![CDATA[<p>1，英文原版下载：<br />http://waterfoxproj.sourceforge.net/downloads<br />2，简体中文包下载：<br />ftp://ftp.mozilla.org/pub/mozilla.org/firefox/nightly/9-candidates/build1/win32/xpi/zh-CN.xpi<br />3，下载后，用Waterfox打开xpi文件，安装之，重启Waterfox<br />4，重启后，输入about:config，在filter栏中输入general.useragent.locale，将en-US改为zh-CN，重启Waterfox</p>]]></description><category>日记/随笔</category><comments>http://www.leadnt.com/Daity/x64Defirefox-waterfox.html#comment</comments><wfw:comment>http://www.leadnt.com/</wfw:comment><wfw:commentRss>http://www.leadnt.com/feed.asp?cmt=655</wfw:commentRss><trackback:ping>http://www.leadnt.com/cmd.asp?act=tb&amp;id=655&amp;key=72454bed</trackback:ping></item><item><title>(转)jQuery页面滚动到指定节点id</title><author>djy365@sina.com (Roy)</author><link>http://www.leadnt.com/Javascript/Zhuan-jQueryYeMianGunDongDaoZhiDingJieDianid.html</link><pubDate>Thu, 22 Dec 2011 10:55:41 +0800</pubDate><guid>http://www.leadnt.com/Javascript/Zhuan-jQueryYeMianGunDongDaoZhiDingJieDianid.html</guid><description><![CDATA[原文地址：http://zww.me/archives/25144<br/>[code=javascript]<br/>假设：你的主题最上面的 id 是 header，最下面的“返回顶部”的 id 为 top<br/><br/>jQuery 代码如下：<br/><br/>jQuery(document).ready(function($) {<br/><br/>$body = (window.opera) ? (document.compatMode == "CSS1Compat" ? $('html') : $('body')) : $('html,body');// 这行是 Opera 的补丁, 少了它 Opera 是直接用跳的而且画面闪烁 by willin<br/><br/>$('#top').click(function(){<br/>	$body.animate({scrollTop: $('#header').offset().top}, 1000);<br/>	return false;// 返回false可以避免在原链接后加上#<br/>});<br/><br/>});<br/><br/><br/>说明：直接看注释<br/><br/>$('#top').click(function(){...}); 这是滚动基本代码，可以根据自个情况变通，也就是举一反三了，如：既然可以返回顶部，那么就可以滚动到底部、滚动到某一个 id、滚动到中间……<br/><br/>那么我再贴出一个滚动到“评论框”的例子：<br/><br/>例子前提假如：文章标题下面有个“添加评论”，原来的html如下<br/><br/><div id="add-comment"><a href="#respond"></a></div><br/>（注：#respond 是评论框的 id）<br/><br/>那么 $('#top').click(function(){...}); 这段代码就变为如下：<br/><br/>$('#add-comment').click(function(){<br/>	$body.animate({scrollTop: $('#respond').offset().top}, 1000);<br/>	return false;<br/>});<br/>[/code]]]></description><category>Javascript</category><comments>http://www.leadnt.com/Javascript/Zhuan-jQueryYeMianGunDongDaoZhiDingJieDianid.html#comment</comments><wfw:comment>http://www.leadnt.com/</wfw:comment><wfw:commentRss>http://www.leadnt.com/feed.asp?cmt=654</wfw:commentRss><trackback:ping>http://www.leadnt.com/cmd.asp?act=tb&amp;id=654&amp;key=25346fd3</trackback:ping></item><item><title>(转)jQuery性能优化</title><author>djy365@sina.com (Roy)</author><link>http://www.leadnt.com/Javascript/Zhuan-jQueryXingNengYouHua.html</link><pubDate>Fri, 16 Dec 2011 17:11:45 +0800</pubDate><guid>http://www.leadnt.com/Javascript/Zhuan-jQueryXingNengYouHua.html</guid><description><![CDATA[本文原文地址：http://www.artzstudio.com/2009/04/jquery-performance-rules/<br/><br/>代码优化分多个方面，而性能是主要的优化目标。本文将从对象缓存、DOM操作等12个方面讲解如何优化jQuery代码的执行效率，从而总体提升代码性能。<br/><br/><h2>1、总是从ID选择器开始继承</h2><br/>在jQuery中最快的选择器是ID选择器，因为它直接来自 于JavaScript的getElementById()方法。<br/>例如有一段HTML代码：<br/>[code=html]<br/>        <div id=“content”>        <form method=“post” action=“#”>        <h2>交通信号灯</h2>        <ul id=“traffic_light”>        <li><input type=“radio” class=“on” name=“light” value=“red” /> 红色</li>        <li><input type=“radio” class=“off” name=“light” value=“yellow” /> 黄色</li>        <li><input type=“radio” class=“off” name=“light” value=“green” /> 绿色</li>        </ul>        <input class=“button” id=“traffic_button” type=“submit” value=“Go” /><br/>        </form>        </div>[/code]<br/>[code=javascript]<br/>如果采用下面的选择器，那么效率是低效的。<br/><br/>        var traffic_button = $('#content .button');<br/><br/>因为button已经有ID了，我们可以直接使用ID选择器。如下所示：<br/><br/>        var traffic_button = $(“#traffic_button”);<br/><br/>当然 这只是对于单一的元素来讲。如果你需要选择多个元素，这必然会涉及到 DOM遍历和循环，为了提高性能，建议从最近的ID开始继承。<br/><br/>如下所示：<br/><br/>        var traffic_lights = $(“#traffic_light input”);<br/><br/><br/><br/><h2>2、在class前使用tag(标签名)</h2><br/>在jQuery中第二快的选择器是tag(标签)选择器比 如：<br/><br/>        $(“head”)<br/><br/>跟ID选择器累时，因为它来自原生的getElementsByTagName() 方法。继续看刚才那段HTML代码：<br/><br/>        <div id=“content”>        <form method=“post” action=“#”>        <h2>交通信号灯</h2>        <ul id=“traffic_light”>        <li><input type=“radio” class=“on” name=“light” value=“red” /> 红色</li>        <li><input type=“radio” class=“off” name=“light” value=“yellow” /> 黄色</li>        <li><input type=“radio” class=“off” name=“light” value=“green” /> 绿色</li>        </ul>        <input class=“button” id=“traffic_button” type=“submit” value=“Go” /><br/>        </form>        </div><br/>比如需要选择红绿单选框，那么可以使用一个tag name来限制(修饰)class ，如下所示：<br/><br/>        var active_light = $(“input.on”);<br/><br/>当然也可以结合 就近的ID，如下所示：<br/><br/>        var active_light = $(“#traffic_light input.on”);<br/><br/>在使用tag来修饰class的时候，我们需要注意以下几点：<br/><br/>（1） 不要使用tag来修饰ID，如下所示：<br/><br/>        var content = $(“div#content”);<br/><br/>这样一来，选择器会先遍历所有的div元素，然后匹配#content。<br/><br/>（2）不要画蛇添足的使用ID来修饰ID，如下所示：<br/><br/>        var traffic_light = $(“#content #traffic_light”);<br/><br/><br/><h2>3、将jQuery对 象缓存起来</h2><br/>把jQuery对象缓存起来 就是要告诉我们 要养成将jQuery对象缓存进变量的习惯。下面是一个jQuery新手写的一段代码：<br/><br/>        $(“#traffic_light input.on”).bind(“click”, function(){ … });<br/>        $(“#traffic_light input.on”).css(“border”, “1px dashed yellow”);<br/>        $(“#traffic_light input.on”).css(“background-color”, “orange”);<br/>        $(“#traffic_light input.on”).fadeIn(“slow”);<br/><br/>但切记不要这么做。我们应该先将对象缓存进一个变量然后再操作，如下所示：<br/><br/>        var $active_light = $(“#traffic_light input.on”);<br/>        $active_light.bind(“click”, function(){ … });<br/>        $active_light.css(“border”, “1px dashed yellow”);<br/>        $active_light.css(“background-color”, “orange”);<br/>        $active_light.fadeIn(“slow”);<br/><br/>记住，永远不要让相同的选择器在你的代码里出现多次.<br/><br/>注：<br/><br/>（1）为了区分普通的JavaScript对象和jQuery对 象，可以在变量首字母前加上$符号。<br/><br/>（2）上面代码可以使用jQuery的链式操作加以改善，如 下所示：<br/><br/>        var $active_light = $(“#traffic_light input.on”);<br/>        $active_light.bind(“click”, function(){ … })<br/>        .css(“border”, “1px dashed yellow”)<br/>        .css(“background-color”, “orange”)<br/>        .fadeIn(“slow”);<br/><br/>如果你打算在其他函数中使用jQuery对象，那么你必须把 它们缓存到全局环境中。如下代码所示：<br/><br/>        // 在全局范围定义一个对象(例如:window对象)<br/>        window.$my = {<br/>        head : $(“head”),<br/>        traffic_light : $(“#traffic_light”),<br/>        traffic_button : $(“#traffic_button”)<br/>        };<br/>        function do_something(){ // 现在你可以引用存储的结果并操作它们<br/>        var script = document.createElement(“script”);<br/>        $my.head.append(script);<br/>        // 当你在函数内部操作是,可以继续将查询存入全局对象中去.<br/>        $my.cool_results = $(“#some_ul li”);<br/>        $my.other_results = $(“#some_table td”);<br/>        // 将全局函数作为一个普通的jquery对象去使用.<br/>        $my.other_results.css(“border-color”, “red”);<br/>        $my.traffic_light.css(“border-color”, “green”);<br/>        }<br/>        //你也可以在其他函数中使用它<br/><br/><br/><br/><br/><h2>4、限制直接对DOM进行操作</h2><br/>这里的基本思想是在内存中建立你确实想要的东西，然后更新DOM，这并不是一个jQuery最佳实践，但必须进行有效的JavaScript操作，直接的DOM操作速度很慢。例如，你想动 态的创建一组列表元素，千万不要这样做，如下所示：<br/><br/>        var top_100_list = [...], // 假设这里是100个独一无二的字符串<br/>        $mylist = $(“#mylist”); // jQuery 选择到 <ul> 元素<br/>        for (var i=0, l=top_100_list.length; i<l; i++) {<br/>        $mylist.append(“<li>” + top_100_list[i] + “</li>”);<br/>        }<br/><br/>我们应该将整套元素字符串在插入进DOM中之前先全部创建好，如下所示：<br/><br/>        // 这个变量将用来存储我们的列表元素<br/>        var top_100_list = [...],$mylist = $(“#mylist”), top_100_li = “”;<br/>        for (var i=0, l=top_100_list.length; i<l; i++){<br/>        top_100_li += “<li>” + top_100_list[i] + “</li>”;<br/>        }<br/>        $mylist.html(top_100_li);<br/><br/>注：记得以前还看过一朋友写过这样的代码：<br/><br/>        for (i = 0; i < 1000; i++) {<br/>        var $myList = $('#myList’);<br/>        $myList.append('This is list item ' + i);<br/>        }<br/><br/>你应该已经看出问题所在了，#mylist被循环获取了1000次！<br/><br/><br/><br/><br/><br/><h2>5、冒泡</h2><br/>除非在特殊情况下，否则每一个js事件(例如：click,mouseover等。)都会冒泡到父级节点，当我们需要给多个元素调用同个函数时这点 会很有用。<br/><br/>代替这种效率很差的多元素事件监听的方法就是，你只需向它们的父节点绑定一次。比如，我们要为一个拥有很多输入框的表单绑定这样的行为：当输入框被 选中时为它添加一个class。传统的做法是，直接选中input，然后绑定focus等，如下所示：<br/><br/>        $(“#entryform input”).bind(“focus”, function(){<br/>        $(this).addClass(“selected”);<br/>        }).bind(“blur”, function(){<br/>        $(this).removeClass(“selected”);<br/>        });<br/><br/>当然上面代码能帮我们完成相应的任务，但如果你要寻求更高效的方法，请使用如下代码：<br/><br/>        $(“#entryform”).bind(“focus”, function(e){<br/>        var $cell = $(e.target); // e.target 捕捉到触发的目标元素<br/>        $cell.addClass(“selected”);<br/>        }).bind(“blur”, function(e){<br/>        var $cell = $(e.target);<br/>        $cell.removeClass(“selected”);<br/>        });<br/><br/>通过在父级监听获取焦点和失去焦点的事件，对目标元素进行操作。在上面代码中，父级元素扮演了一个调度员的角色， 它可以基于目标元素绑定事件，如果你发现你给很多元素绑定了同一个事件监听， 那么现在的你肯定知道哪里做错了。<br/><br/>同理，在Table操作时，我们也可以使用这种方式加以改进代码：<br/><br/>普通的方式：<br/><br/>        $('#myTable td’).click(function(){<br/>        $(this).css('background’, 'red’);<br/>        });<br/><br/>改进方式：<br/><br/>        $('#myTable’).click(function(e) {<br/>        var $clicked = $(e.target);<br/>        $clicked.css('background’, 'red’);<br/>        });<br/><br/>假设有100个td，在使用普通的方式的时候，你绑定了100个事件。在改进方式中，你只为一个元素绑定了1个事件。至于是100个事件的效率高， 还是1个事件的效率高，相信你也能自行分辨了。<br/><br/><br/><br/><br/><h2>6、推迟到 $(window).load</h2><br/>jQuery 对于开发者来说有一个很诱人的东西，可以把任何东西挂到$(document).ready下。尽管$(document).rady 确实很有用，它可以在页面渲染时，其它元素还没下载完成就执行。如果你发现你的页面一直是载入中的状态，很有可能就是$(document).ready 函数引起的。<br/><br/>你可以通过将jQuery函数绑定 到$(window).load 事件的方法来减少页面载入时的CPU使用率，它会在所有的html(包括<iframe>)被下载完成后执行。<br/><br/>        $(window).load(function(){<br/>        // 页面完全载入后才初始化的jQuery函数.<br/>        });<br/><br/>一些特效的功能，例如拖放，视觉特效和动画，预载入隐藏图像等等，都是适合这种技术的场合。<br/><br/><br/><br/><br/><br/>7、压缩JavaScript<br/><br/>压缩和最小化你的JavaScript文件：<br/><br/>在线压缩地址：http://dean.edwards.name/packer/，压缩 之前，请保证你的代码的规范性，否则可能失败，导致JS错误。<br/><br/><br/><br/><br/><br/>8、尽量使用ID代替Class<br/><br/>前面性能优化已经说过，ID选择器的速度是最快的。所以在HTML代码中，能使用ID的尽量使用ID来代替class。<br/><br/>看下面的一个例子：<br/><br/>        var $myList = $('#myList’); // 创建一个list<br/>        var myListItems = '<ul>’;<br/>        for (i = 0; i < 1000; i++) {<br/>        // 这里使用的是class<br/>        myListItems += '<li class=”listItem’ + i + '”>This is a list item</li>’;<br/>        }<br/><br/>        myListItems += '</ul>’;<br/>        $myList.html(myListItems);<br/>        for (i = 0; i < 1000; i++) { // 选择每一个 li<br/>        var selectedItem = $('.listItem’ + i);<br/>        }<br/><br/>在代码最后，选择每个li的过程中，总共用了5066毫秒，超过5秒了。接着我们做一个对比，用ID代替class：<br/><br/>        var $myList = $('#myList’); // 创建一个list<br/>        var myListItems = '<ul>’;<br/>        for (i = 0; i < 1000; i++) {<br/>        //这里使用的是id<br/>        myListItems += '<li id=”listItem’ + i + '”>This is a list item</li>’;<br/>        }<br/><br/>        myListItems += '</ul>’;<br/>        $myList.html(myListItems);<br/>        for (i = 0; i < 1000; i++) { // 选择每一个 li<br/>        var selectedItem = $('#listItem’ + i);<br/>        }<br/><br/>在上段代码中，选择每个li总共只用了61毫秒，相比class的方式，将近快了100倍。<br/><br/><br/><br/><br/><br/><br/>9、给选择器一个上下文<br/><br/>jQuery选择器中有一个这样的选择器，它能指定上下文。<br/><br/>        jQuery( expression, context );<br/><br/>通过它，能缩小选择器在DOM中搜索的范围，达到节省时间，提高效率。<br/><br/>普通方式：<br/><br/>        $('.myDiv’);<br/><br/>改进方式：<br/><br/>        $('.myDiv’ , $(“#listItem”) );<br/><br/><br/><br/><br/><br/><br/>10、慎用 .live() 方法（尽量不要使用）<br/><br/>这是jQuery1.3.1版本之后增加的方法，这个方法的功能就是为 新增的DOM元素 动态绑定事件。但对于效率来说，这个方法比较占用资源。所以请尽量不要使用它。<br/><br/>例如有这么一段代码：<br/><br/>        <script type=“text/javascript” ><br/>        $(function(){<br/>        $(“p”).click(function(){<br/>        alert($(this).text());<br/>        });<br/>        $(“button”).click(function(){<br/>        $(“<p>this is second p</p>”).appendTo(“body”);<br/>        });<br/>        }) </script><br/>        <br/>        <p>this is first p</p> <button>add</button><br/>        <br/><br/>运行后，你会发现 新增 的 p元素，并没用被绑定click事件。你可以改成.live(”click”)方式解决此问题，代码如下：<br/><br/>        $(function(){<br/>        $(“p”).live(“click”,function(){ //改成live方式<br/>        alert( $(this).text() );<br/>        });<br/>        $(“button”).click(function(){ $(“<p>this is second p</p>”).appendTo(“body”); });})<br/><br/>但我并不建议大家这么做，我想用另一种方式去解决这个问题，代码如下：<br/><br/>        $(function(){<br/>        $(“p”).click(function(){<br/>        alert( $(this).text() );<br/>        });<br/>        $(“button”).click(function(){<br/>        $(“<p>this is second p</p>”).click(function(){ //为新增的元素重新绑定一次<br/>        alert( $(this).text() );<br/>        }).appendTo(“body”);<br/>        });<br/>        })<br/><br/>虽然我把绑定事件重新写了一次，代码多了点，但这种方式的效率明显高于live()方式，特别是在频繁的DOM操作中，这点非常明显。<br/><br/><br/><br/><br/><br/><br/>11、子选择器和后代选择器<br/><br/>后代选择器经常用到，比如：<br/><br/>        $(“#list p”);<br/><br/>后代选择器获取的是元素内部所有元素，而有时候实际只要获取 子元素，那么就不应该使用后代选择器。<br/>应该使用子选择器，代码如下：<br/><br/>        $(“#list > p”);<br/><br/><br/><br/><br/><br/>12、使用data()方法存储临时变量<br/><br/>下面是一段非常简单的代码：<br/><br/>        $(function(){<br/>        var flag = false;<br/>        $(“button”).click(function(){<br/>        if(flag){<br/>        $(“p”).text(“true”);<br/>        flag=false;<br/>        }else{<br/>        $(“p”).text(“false”);<br/>        flag=true;<br/>        }<br/>        });<br/>        })<br/><br/>改用data()方式后，代码如下：<br/><br/>        $(function(){<br/>        $(“button”).click(function(){<br/>        if( $(“p”).data(“flag”) ){<br/>        $(“p”).text(“true”);<br/>        $(“p”).data(“flag”,false);<br/>        }else{<br/>        $(“p”).text(“false”);<br/>        $(“p”).data(“flag”,true);<br/>        }<br/>        });<br/>        })<br/><br/><br/><br/><br/><br/>3，尽量使 用原生的JavaScript方法<br/><br/> <br/><br/>    看下面一段代码，它用来判断多选框是否被选中：<br/><br/> <br/><br/>    $(document).ready(function(){ <br/>    var $cr = $("#cr");  //jQuery对象 <br/>    $cr.click(function(){<br/>    if($cr.is(":checked")){ //jQuery方式判断<br/>    alert("感谢你的支持!你可以继续操作！"); <br/>    }<br/>    })<br/>    });<br/><br/>上 面代码中，判断是否选中是用了 jquery的方法，但这里可以直接使用原生的JavaScript方法，看下面代码：<br/><br/>    $(document).ready(function(){ <br/>    var $cr = $("#cr");  //jQuery对象<br/>    var cr = $cr.get(0); //DOM对象，获取 $cr[0]<br/>    $cr.click(function(){ <br/>    if(cr.checked){ //原生的JavaScript方式判断<br/>    alert("感谢你的支持!你可以继续操作!");<br/>    }<br/>    })<br/>    });<br/><br/> <br/><br/>毋庸置疑，第二种方式效率高于第一种方式，因为他不需要 拐弯抹角的去调用许多函数。<br/><br/>更多：<br/><br/>$(this).css("color","red");   ...... <br/><br/>改成：<br/><br/>this.style.color ="red"   ...... <br/><br/>$("<p></p>")<br/><br/>改成:<br/><br/>$( document.createElement("p") )<br/><br/>有时候你 也许根本不需要jQuery。（ 如果不涉及兼容性问题和自己的水平问题。）<br/><br/> <br/><br/><br/><br/><br/>14，使用for代替each()方法<br/>    <br/>    这个跟13有点类似，但我特意提取出来，让大家注 意下。<br/> <br/><br/> <br/><br/>    var array = new Array ();  <br/>    for (var i=0; i<10000; i++) {  <br/>        array[i] = 0;  <br/>    }  <br/><br/>    $.each (array, function (i) {  <br/>        array[i] = i;  <br/>    });  <br/>    <br/><br/><br/><br/> 15，使用join()来拼接字符串。<br/>    <br/>    也许你 之前一直使用 " +  " 来 拼接长字符串。现在你可以改改了。虽然它可能会有点奇怪，但它确实有助于优化性能，尤其是长字符串处理的时候。<br/> <br/>    首 先创建一个数组，然后循环，最后使用join()把数组转化为字符串。<br/> <br/>      <br/>     var array = [];  <br/>    for (var i=0; i<=10000; i++) {       <br/>        array[i] = '<li>'+i+'</li>';  <br/>    }     <br/>    $('#list').html (array.join (''));  <br/> <br/> <br/><br/><br/><br/><br/> 16，Ajax中文乱码。<br/>    <br/>  Ajax传递中文时会乱码，传统方式大家都是利用escape去编码，然后去后台解码。<br/><br/>$.ajax({<br/>type: "POST",<br/>url: "AjaxTest.jsp",<br/>data: "txt="+$('#txt').val(),<br/>success: function(msg){<br/>$("#AjaxResponse").text(msg);<br/>}<br/>});<br/> <br/><br/><br/><br/>现在你可以换一换了，你可以非常简单的 解决这个问题，只需要添加一参数即可：<br/> $.ajax({<br/>type: "POST",<br/>url: "AjaxTest.jsp",<br/>data: "txt="+$('#tbox1').val(),<br/>success: function(msg){<br/>$("#AjaxResponse").text(msg);<br/>},<br/>contentType:"application/x-www-form-urlencoded;charset=utf-8"<br/>});<br/><br/><br/>[/code]]]></description><category>Javascript</category><comments>http://www.leadnt.com/Javascript/Zhuan-jQueryXingNengYouHua.html#comment</comments><wfw:comment>http://www.leadnt.com/</wfw:comment><wfw:commentRss>http://www.leadnt.com/feed.asp?cmt=653</wfw:commentRss><trackback:ping>http://www.leadnt.com/cmd.asp?act=tb&amp;id=653&amp;key=7f9cb5ca</trackback:ping></item><item><title>javascript实现插件化调用</title><author>djy365@sina.com (Roy)</author><link>http://www.leadnt.com/WEB/javascriptShiXianChaJianHuaDiaoYong.html</link><pubDate>Mon, 12 Dec 2011 15:56:21 +0800</pubDate><guid>http://www.leadnt.com/WEB/javascriptShiXianChaJianHuaDiaoYong.html</guid><description><![CDATA[通过对javascript插件化调用，对付自定义表单时可灵活配置，不用再一次书写冗长的代码，便于开发，更便于维护。<br/><br/>[code=javascript]<br/>var validFuncs = window.validFuncs || {};<br/>			<br/>			//提交时调用的函数<br/>			function validSubmit()<br/>			{<br/>				for(var func in validFuncOptions)<br/>				{<br/>					if(!validFuncs[func]())<br/>					{<br/>						return false;<br/>					}<br/>				}<br/>			}<br/>			<br/>			//片段一<br/>			function A()<br/>			{<br/>				alert('a');<br/>				return false;<br/>			}<br/>			<br/>			validFuncs[0] = A;<br/>			<br/>			<br/>			//片段二<br/>			function B()<br/>			{<br/>				alert('b');<br/>			}<br/>			validFuncs['a'] = B;<br/>[/code]<br/><br/>[code=html]<br/><!-- 最终页面的触发 --><br/>		<input type="button" value="Click" onclick="clk();"/><br/>[/code]<br/>]]></description><category>WEB</category><comments>http://www.leadnt.com/WEB/javascriptShiXianChaJianHuaDiaoYong.html#comment</comments><wfw:comment>http://www.leadnt.com/</wfw:comment><wfw:commentRss>http://www.leadnt.com/feed.asp?cmt=652</wfw:commentRss><trackback:ping>http://www.leadnt.com/cmd.asp?act=tb&amp;id=652&amp;key=a9cc84e8</trackback:ping></item><item><title>(转)blueprint–css framework研究</title><author>djy365@sina.com (Roy)</author><link>http://www.leadnt.com/WEB/blueprintcss-frameworkYanJiu.html</link><pubDate>Fri, 09 Dec 2011 16:08:54 +0800</pubDate><guid>http://www.leadnt.com/WEB/blueprintcss-frameworkYanJiu.html</guid><description><![CDATA[<blockquote><p><a target="_blank" href="http://code.google.com/p/blueprintcss/">blueprint</a>是一个所谓的css framework，相比较而言blueprint 代码中的注释还是比较详细的。</p><p>按照Jeff Croft的<a target="_blank" href="http://www.alistapart.com/articles/frameworksfordesigners">Frameworks for Designers</a>(或中文版本 <a target="_blank" href="http://css.chinahtml.com/2007/css-118602092315431.shtml">理解Web框架，和如何构建一个CSS框架</a>)描述的如何构建一个css framework的方法：</p><p><font size="2"> <em>There are several possible ways to go about  building a framework, but the most common and arguably the most useful  is to abstract your common CSS into individual stylesheets that each  cover a particular part of the whole. For example, you may have a  stylesheet that sets up the typography and another that handles the mass  reset. The beauty of the approach is the ability to selectively include  only the styles that you need. You may end up with six or seven  different stylesheets in your framework, but if a particular project  doesn&rsquo;t need one or two of them, they don&rsquo;t have to be included. The  framework we created in our office has five stylesheets:.</em></font></p><ul>    <li><em>reset.css&mdash;handles the mass reset. </em></li>    <li><em>type.css&mdash;handles the typography. </em></li>    <li><em>grid.css&mdash;handles the layout grid. </em></li>    <li><em>widgets.css&mdash;handles widgets like tabs, drop-down menus, and &ldquo;read more&rdquo; buttons. </em></li>    <li><em>base.css&mdash;includes all the other stylesheets, so that we only  need to call base.css from our (X)HTML documents to use the entire  framework.</em></li></ul><p>blueprint的构建方式也与此类似：</p><p><strong>分而治之</strong>：</p><p>buleprint在功能组织上，将诸如布局(layout)、排版(typography)、组件（widget）、重置（reset）、打印 (print)等功能分散到不同的css文件中。这样方便使用者只需要导入自己所要使用的功能，不用导入全部文件，提高页面装载性能。目前在组件部分只提 供了对button的处理，尚未做到麦肯锡的MECE（&rdquo;相互独立，完全穷尽&rdquo;）的道。</p><p><strong>统一接口：</strong></p><p>尽管功能分散到多个css文件，但是导入时候，仍然只需要包含同样的文件screen.css文件，具体的导入细节在screen.css中再处理，统一了对外接口。</p><p>&lt;link rel=&rdquo;stylesheet&rdquo; href=&rdquo;css/blueprint/screen.css&rdquo; type=&rdquo;text/css&rdquo; media=&rdquo;screen, projection&rdquo; /&gt;</p><p><strong>blueprint 所包含的css文件说明：</strong></p><ul>    <li>screen.css<br />    This is the main file of the framework. It imports other CSS<br />    files from the &ldquo;lib&rdquo; directory, and should be included on<br />    every page.</li></ul><p>类似于Jeff Croft的base.css功能，只需要包含此文件，就可以导入</p><ul>    <li>print.css<br />    This file sets some default print rules, so that printed versions<br />    of your site looks better than they usually would. It should be<br />    included on every page.</li></ul><p>用于处理打印，可以归类为widget。</p><ul>    <li>lib/grid.css<br />    This file sets up the grid (it&rsquo;s true). It has a lot of classes<br />    you apply to divs to set up any sort of column-based grid.</li></ul><p>用于处理页面的布局（栏目）</p><ul>    <li>lib/typography.css<br />    This file sets some default typography. It also has a few<br />    methods for some really fancy stuff to do with your text.</li></ul><p>用于处理页面元素的排版。</p><ul>    <li>lib/reset.css<br />    This file resets CSS values that browsers tend to set for you.</li></ul><p>用于重置页面，对没有指定css属性的页面元素指定缺省值。</p><ul>    <li>lib/buttons.css<br />    Provides some great CSS-only buttons.</li></ul><p>用于处理按钮,可以归类为widget</p><ul>    <li>lib/compressed.css<br />    A compressed version of the core files. Use this on every live site.<br />    See screen.css for instructions</li></ul><p>提供压缩过的（包含grid.css,tyopgraphy.css,reset.css,buttons.css）的css文件。</p></blockquote><h3>2、各模块用法研究</h3><h3>2.1、grid.css研究</h3><ul>    <li><font size="4">对跨浏览器居中处理的兼容性处理</font></li></ul><blockquote><p>一般而言，要处理firefox、ie在处理居中时候的不同，采用如下方式：</p></blockquote> <blockquote><pre>body{text-align: center;}div#container{margin-left: auto;margin-right: auto;width: 50em;text-align: left;}</pre></blockquote><p>摘自：<a title="http://www.maxdesign.com.au/presentation/center/" href="http://www.maxdesign.com.au/presentation/center/">http://www.maxdesign.com.au/presentation/center/</a></p><blockquote><p>blueprint的处理方式：</p></blockquote> <blockquote><pre>body {  text-align: center; <span>/* IE6 Fix */</span>  margin:36px 0;}<span>/* A container should group all your columns. */</span>.container {  text-align: left;  position: relative;  padding: 0;  margin: 0 auto;   <span>/* Centers layout */</span>  width: 1150px;     <span>/* Total width */</span>}</pre></blockquote><ul>    <li>    <pre><font size="4">分栏（Columns）的实现</font></pre>    </li></ul><p>blueprint的处理方式：</p><p>blueprint定义了.column  , .span-x ,.last  ，两者结合来实现分栏功能。</p><p>其中：.column定义栏目的float属性；.span-x定义栏目宽度；.last将margin-right置为0px,</p><blockquote><pre>.column {  <span>float</span>: left;  margin-right: 10px;  padding: 0;}</pre><pre><span>/* Use these classes to set how wide a column should be. */</span>.span-1   { width: 30px; }.span-2   { width: 70px; }.span-3   { width: 110px; }.span-4   { width: 150px; }....span-8   { width: 310px; }.span-9   { width: 350px; }.span-10  { width: 390px; }....span-23  { width: 910px; }.span-24  { width: 950px; margin: 0; }.span-25  { width: 200px; }.span-26 { width: 1150px; margin: 0; }<span>/* The last element in a multi-column block needs this class. */</span>.last     { margin-right: 0; }</pre><pre>三栏的实现：</pre><pre>&lt;div <span>class</span>=<span>&quot;container&quot;</span>&gt;        &lt;div <span>class</span>=<span>&quot;column span-24&quot;</span>&gt;                Header        &lt;/div&gt;        &lt;div <span>class</span>=<span>&quot;column span-4&quot;</span>&gt;                Left sidebar        &lt;/div&gt;        &lt;div <span>class</span>=<span>&quot;column span-16&quot;</span>&gt;                Main content        &lt;/div&gt;        &lt;div <span>class</span>=<span>&quot;column span-4 last&quot;</span>&gt;                Right sidebar        &lt;/div&gt;&lt;/div&gt;</pre></blockquote><pre>     四栏的实现：</pre><blockquote><pre>&lt;div <span>class</span>=<span>&quot;container&quot;</span>&gt;        &lt;div <span>class</span>=<span>&quot;column span-26&quot;</span>&gt;                Header        &lt;/div&gt;        &lt;div <span>class</span>=<span>&quot;column span-4&quot;</span>&gt;                Left sidebar        &lt;/div&gt;        &lt;div <span>class</span>=<span>&quot;column span-3 &quot;</span>&gt;                Main content 0        &lt;/div&gt;          &lt;div <span>class</span>=<span>&quot;column span-25&quot;</span>&gt;               Main content  1        &lt;/div&gt;        &lt;div <span>class</span>=<span>&quot;column span-4 last&quot;</span>&gt;                Right sidebar        &lt;/div&gt;&lt;/div&gt;</pre><pre>注意把.container中的width(定义了整个页面的width)修改为1150px</pre><pre>空白栏目的实现：</pre><pre>   对于多栏目（例如5栏目），其中有空白栏目（例如左右两栏目为空白），可以使用.append-x和.prepend-x来填充。</pre><pre>其中.append-x在栏目后（padding-right）添加空白栏目，.prepend-x在栏目前（padding-left）添加空白栏目。</pre></blockquote><ul>    <li>    <pre><font size="4">通用的容器定义</font></pre>    </li></ul><blockquote><pre><span>/* A container should group all your columns. */</span>.container {  text-align: left;  position: relative;  padding: 0;  margin: 0 auto;   <span>/* Centers layout */</span>  width: 1150px;     <span>/* Total width */</span>}</pre></blockquote><h4>2.2、reset.css研究</h4><blockquote><p>reset.css的最初代码应该来自于Eric Meyer,Eric Meyer有两篇关于reset的日志，用于处理跨浏览器缺省值不同的问题。Eric Meyer的文档写得很精彩：</p><p>Reset Reasoning：<a title="http://meyerweb.com/eric/thoughts/2007/04/18/reset-reasoning/" href="http://meyerweb.com/eric/thoughts/2007/04/18/reset-reasoning/">http://meyerweb.com/eric/thoughts/2007/04/18/reset-reasoning/</a></p><p>Reset Reloaded：<a title="http://meyerweb.com/eric/thoughts/2007/05/01/reset-reloaded/" href="http://meyerweb.com/eric/thoughts/2007/05/01/reset-reloaded/">http://meyerweb.com/eric/thoughts/2007/05/01/reset-reloaded/</a></p></blockquote><ul>    <li>为何要reset</li></ul><blockquote><p><em>The basic reason is that all browsers have  presentation defaults, but no browsers have the same defaults. (Okay, no  two browser families&mdash;most Gecko-based browsers do have the same  defaults.)<br />For example, some browsers indent unordered and ordered lists with left  margins, whereas others use left padding. In past years, we tackled  these inconsistencies on a case-by-case basis;</em></p></blockquote><ul>    <li>为何使用reset style，而不是universal selector</li></ul><blockquote><p>所谓universal selector 就是使用* 来代表document所有的元素，例如</p><pre>* {    margin: 0;    padding 0;}</pre></blockquote><ul>    <li>关于reset style话题的一些资源：</li></ul><blockquote><p>YUI的reset库：<a title="http://developer.yahoo.com/yui/reset/" href="http://developer.yahoo.com/yui/reset/">http://developer.yahoo.com/yui/reset/</a></p><p><a title="http://leftjustified.net/journal/2004/10/19/global-ws-reset/" href="http://leftjustified.net/journal/2004/10/19/global-ws-reset/">http://leftjustified.net/journal/2004/10/19/global-ws-reset/</a></p><p>以下几篇实际上是讨论css framework或tips的文章，只不过都提到了reset话题。</p><p><a title="http://www.smashingmagazine.com/2007/05/10/70-expert-ideas-for-better-css-coding/" href="http://www.smashingmagazine.com/2007/05/10/70-expert-ideas-for-better-css-coding/">http://www.smashingmagazine.com/2007/05/10/70-expert-ideas-for-better-css-coding/</a></p><p><a title="http://www.christianmontoya.com/2007/02/01/css-techniques-i-use-all-the-time/" href="http://www.christianmontoya.com/2007/02/01/css-techniques-i-use-all-the-time/">http://www.christianmontoya.com/2007/02/01/css-techniques-i-use-all-the-time/</a></p><p><a title="http://businesslogs.com/design_and_usability/my_5_css_tips.php" href="http://businesslogs.com/design_and_usability/my_5_css_tips.php">http://businesslogs.com/design_and_usability/my_5_css_tips.php</a></p><p><a title="http://www.pingmag.jp/2006/05/18/5-steps-to-css-heaven/" href="http://www.pingmag.jp/2006/05/18/5-steps-to-css-heaven/">http://www.pingmag.jp/2006/05/18/5-steps-to-css-heaven/</a></p></blockquote><h4>2.3、typography.css研究</h4><blockquote><p>typography.css用于确定页面元素缺省的排版格式（baseline）：</p><p>Setting Type on the Web to a Baseline Grid：</p><p><a title="http://alistapart.com/articles/settingtypeontheweb" href="http://alistapart.com/articles/settingtypeontheweb">http://alistapart.com/articles/settingtypeontheweb</a></p></blockquote><h4>2.4、buttons.css研究</h4><blockquote><p><a target="_blank" href="http://particletree.com/features/rediscovering-the-button-element">Rediscovering the Button Element</a> 讨论了用button元素来替代input元素的种种好处，button元素是提供了较为丰富的功能。</p><p><a title="http://particletree.com/features/rediscovering-the-button-element" href="http://particletree.com/features/rediscovering-the-button-element">http://particletree.com/features/rediscovering-the-button-element</a></p></blockquote><h4>2.4、print.css研究</h4><blockquote><p>Eric Meyer有一篇关于css实现print功能的文章，可以作为理解print.css的参考。</p><h3><a href="http://www.alistapart.com/articles/goingtoprint"><font size="2">CSS Design: Going to Print</font></a></h3><h4><a href="http://meyerweb.com/eric/articles/webrev/200001.html">Print Different</a></h4></blockquote><h4>2.5、compressed.css</h4><p>compressed.css是对blueprint几个文件压缩合成包，同时也对css文件进行了压缩，去除了无用的空格、换行、注释等文本。</p><p>此种方式用于在上生产系统部署时候使用，避免在页面导入多个css文件，同时也有利于提高页面性能。</p><blockquote><p>按照lib/screen.css中的说明，应该使用了teenage提供的css压缩服务：</p><p><a title="http://teenage.cz/acidofil/tools/cssformat.php" href="http://teenage.cz/acidofil/tools/cssformat.php">http://teenage.cz/acidofil/tools/cssformat.php</a></p><p>另外类似的提供对css、javascript进行优化、压缩的服务还有：</p><p><a title="http://csstidy.sourceforge.net/" href="http://csstidy.sourceforge.net/">http://csstidy.sourceforge.net/</a> （开源）</p><p><a title="http://www.cssdrive.com/index.php/main/csscompressor/" href="http://www.cssdrive.com/index.php/main/csscompressor/">http://www.cssdrive.com/index.php/main/csscompressor/</a></p><p><a title="http://www.cleancss.com/" href="http://www.cleancss.com/">http://www.cleancss.com/</a> （基于csstidy）</p></blockquote><h3>3、使用例子</h3><h3>4、参考文档</h3><p><a title="http://code.google.com/p/blueprintcss/wiki/Tutorial&lt;br&gt;&lt;/a&gt;" href="http://code.google.com/p/blueprintcss/wiki/Tutorial">http://code.google.com/p/blueprintcss/wiki/Tutorial<br /></a></p><h3>5、相关项目</h3><blockquote><p>blueprint-generator: <a title="http://kematzy.com/blueprint-generator/" href="http://kematzy.com/blueprint-generator/">http://kematzy.com/blueprint-generator/</a></p><p>tripoli : <a title="http://monc.se/tripoli/" href="http://monc.se/tripoli/">http://monc.se/tripoli/</a></p></blockquote>]]></description><category>WEB</category><comments>http://www.leadnt.com/WEB/blueprintcss-frameworkYanJiu.html#comment</comments><wfw:comment>http://www.leadnt.com/</wfw:comment><wfw:commentRss>http://www.leadnt.com/feed.asp?cmt=651</wfw:commentRss><trackback:ping>http://www.leadnt.com/cmd.asp?act=tb&amp;id=651&amp;key=a8209fe7</trackback:ping></item></channel></rss>

