<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blog.darkthread.net/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-CHT"><title type="html">黑暗執行緒</title><subtitle type="html" /><id>http://blog.darkthread.net/blogs/darkthreadtw/atom.aspx</id><link rel="alternate" type="text/html" href="http://blog.darkthread.net/blogs/darkthreadtw/default.aspx" /><link rel="self" type="application/atom+xml" href="http://blog.darkthread.net/blogs/darkthreadtw/atom.aspx" /><generator uri="http://communityserver.org" version="3.1.20917.1142">Community Server</generator><updated>2010-02-21T03:41:11Z</updated><entry><title>jQuery 1.4 Solved The OnChange Event Issue of IE AutoComplete</title><link rel="alternate" type="text/html" href="http://blog.darkthread.net/blogs/darkthreadtw/archive/2010/03/09/jquery1-4-fix-autocomplete-onchange-issue.aspx" /><id>http://blog.darkthread.net/blogs/darkthreadtw/archive/2010/03/09/jquery1-4-fix-autocomplete-onchange-issue.aspx</id><published>2010-03-08T13:36:23Z</published><updated>2010-03-08T13:36:23Z</updated><content type="html">&lt;span id="PostName"&gt;&lt;/span&gt; &lt;p&gt;IE&amp;#39;s AutoComplete feature doesn&amp;#39;t trigger onchange event is a well-known &amp;quot;by-design&amp;quot; behaviour:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms533032%28VS.85%29.aspx"&gt;Using AutoComplete in HTML Forms&lt;/a&gt;&lt;br /&gt;&lt;em&gt;To determine when a user updates the content of a field from the AutoComplete dialog box, use the &lt;/em&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms536956%28VS.85%29.aspx"&gt;&lt;em&gt;onpropertychange&lt;/em&gt;&lt;/a&gt;&lt;em&gt; event, rather than the &lt;/em&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms536912%28VS.85%29.aspx"&gt;&lt;em&gt;onchange&lt;/em&gt;&lt;/a&gt;&lt;em&gt; event, because the &lt;strong&gt;onchange&lt;/strong&gt; event does not fire.&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;I have ever found some fixes (example &lt;a href="http://jehiah.cz/archive/onchange-and-autocomplete"&gt;1&lt;/a&gt;, &lt;a href="https://mootools.lighthouseapp.com/projects/2706/tickets/568-autocomplete-dont-fire-onchange-event-ie"&gt;2&lt;/a&gt;) developed by community before. Today, when I managed to put them into my project, I found something interesting.&lt;/p&gt; &lt;p&gt;As using jQuery 1.4+, if I set change() event on a &amp;lt;input type=&amp;quot;text&amp;quot; /&amp;gt;, it will be triggered as well as the event declared by onchange=&amp;quot;...&amp;quot; when IE AutoComplete.&amp;nbsp; In the other word, jQuery 1.4 solved the &amp;quot;onchange not triggered&amp;quot; issue of IE AutoComplete.&lt;/p&gt; &lt;p&gt;After tracing the code roughly, I found jQuery uses some new mechanism: beforeactive event to store the original value in .data(&amp;quot;_chage_data&amp;quot;), compares it with current value in focusout event, if not equal, then trigger the onchange event...&amp;nbsp; I guess that&amp;#39;s why it can detect the value change when using IE AutoComplete.&lt;/p&gt; &lt;p&gt;So, using jQuery 1.4+, you can solved the well-known &amp;quot;No OnChange Event When IE AutoComplete&amp;quot; issue easily!&lt;/p&gt; &lt;p&gt;Here is my simple test case.&amp;nbsp; When jQuery 1.3.2 is included, no change event will be fired when using IE AutoComplete to fill t1, t2 value.&amp;nbsp;&amp;nbsp; After changing the link to jQuery 1.4.2, you will find AutoComplete on t1 can trigger both &amp;quot;T1 JS change&amp;quot; and &amp;quot;T1 jQuery change&amp;quot; now.&lt;/p&gt; &lt;div class="BlogCodeBlock"&gt; &lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="asp"&gt;&amp;lt;%@ Page Language=&amp;quot;C#&amp;quot; AutoEventWireup=&amp;quot;true&amp;quot; %&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;html&lt;/span&gt; &lt;span class="attr"&gt;xmlns&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;head&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;#39;text/javascript&amp;#39;&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="attr"&gt;src&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;#39;http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.js&amp;#39;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&amp;lt;!--  &amp;lt;script type=&lt;span class="str"&gt;&amp;#39;text/javascript&amp;#39;&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;src=&lt;span class="str"&gt;&amp;#39;http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.js&amp;#39;&lt;/span&gt;&amp;gt;&amp;lt;/script&amp;gt; --&amp;gt;&lt;/pre&gt;&lt;pre&gt;    &amp;lt;script type=&lt;span class="str"&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt;&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;function&lt;/span&gt; output(msg) {&lt;/pre&gt;&lt;pre&gt;            &lt;span class="kwrd"&gt;var&lt;/span&gt; disp = document.getElementById(&lt;span class="str"&gt;&amp;quot;disp&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre class="alt"&gt;            disp.innerHTML += &lt;span class="str"&gt;&amp;quot;&amp;lt;li&amp;gt;&amp;quot;&lt;/span&gt; + msg;&lt;/pre&gt;&lt;pre&gt;        }&lt;/pre&gt;&lt;pre class="alt"&gt;        $(&lt;span class="kwrd"&gt;function&lt;/span&gt;() {&lt;/pre&gt;&lt;pre&gt;            &lt;span class="rem"&gt;//if you set change event on #t1 with jQuery 1.4.2,&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="rem"&gt;//the onchange event will be triggered when using AutoComplete&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;            $(&lt;span class="str"&gt;&amp;quot;#t1&amp;quot;&lt;/span&gt;).change(&lt;span class="kwrd"&gt;function&lt;/span&gt;() {&lt;/pre&gt;&lt;pre class="alt"&gt;                output(&lt;span class="str"&gt;&amp;quot;T1 jQuery change&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;            });&lt;/pre&gt;&lt;pre class="alt"&gt;        });&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;head&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;body&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;form&lt;/span&gt; &lt;span class="attr"&gt;method&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;post&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;T1: &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;input&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;text&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;t1&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;t1&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;onchange&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;output(&amp;#39;T1 JS change&amp;#39;);&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;br&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;T2: &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;input&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;text&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;t2&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;t2&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;onchange&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;output(&amp;#39;T2 JS change&amp;#39;);&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;br&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;input&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;submit&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Submit&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;form&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt; &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;disp&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;body&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;html&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;font color="#ff8000"&gt;【中文摘要】&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;上回試著要&lt;a href="http://blog.darkthread.net/blogs/darkthreadtw/archive/2010/03/05/set-autocomp-off.aspx"&gt;用autocomplete=&amp;quot;off&amp;quot;法&lt;/a&gt;解決IE自動完成時&lt;a href="http://blog.darkthread.net/blogs/darkthreadtw/archive/2010/01/26/change-event-not-fired.aspx"&gt;onchange事件不會被觸發&lt;/a&gt;的老問題，不過如同91在回饋裡所言--要關閉使用者慣用的自動完成功能，就得向User解釋這個難以啟齒的技術鳥問題。萬一不幸遇上&amp;quot;角頭級&amp;quot;的使用者，哪可能耐著性子聽你說什麼IE自動完成、onchange這些鬼東西，只怕會換來一句--&amp;quot;&lt;font color="#ff8000"&gt;onchange是三小，我只聽過回家吃自己啦!&lt;/font&gt;&amp;quot;... 想到這個畫面，我忽然不寒而慄，決定花時間研究一下怎麼讓AutoComplete也觸發change事件。&lt;/p&gt;
&lt;p&gt;開了個小專案寫了jQuery做測試，卻發現一件有趣的事。AutoComplete竟會觸發onchange事件~~~ 是我眼花了還是腦筋不清楚? 明明上回驗證過，像鐵一般的事實這回怎麼來了個急轉彎? 在做了一堆測試比對後，總算釐清一件事實:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;font color="#ff8000"&gt;使用jQuery 1.4設定&amp;lt;input type=&amp;quot;text&amp;quot;&amp;gt;的change()事件後，使用IE AutoComplete也會觸發onchange事件!!&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;我做了一個簡單的測試案例(程式碼在上方)來驗證這點: 首先使用jQuery-1.3.2，用IE自動完成填入t1, t2的資料，並不會觸發onchange事件；改用jQuery-1.4.2後，再以自動完成為t1, t2填入資料, 這回有加掛jQuery chnage()事件的t1會觸發用jQuery及用onchange=&amp;quot;...&amp;quot;宣告的事件，而t2則不會。&lt;/p&gt;
&lt;p&gt;粗略地追了一下程式碼，發現jQuery-1.4在change事件觸發機制上做了改良: 在beforeactive事件時會將原值存在.data(&amp;quot;_chage_data&amp;quot;)、在focusout事件中會用它跟現值比對，不一致時則觸發change事件。這跟我原本想出的解法差不多，而jQuery在核心中已實踐了類似的邏輯，應該就是無形中修好&amp;quot;AutoComplete不觸發OnChange事件&amp;quot;問題的原因。&lt;/p&gt;
&lt;p&gt;總之，不費吹灰之力就修好這個惱人的問題，有賺到的感覺，哈!!&lt;/p&gt;&lt;img src="http://blog.darkthread.net/aggbug.aspx?PostID=6093" width="1" height="1"&gt;</content><author><name>Jeffrey</name><uri>http://blog.darkthread.net/members/Jeffrey.aspx</uri></author><category term="English" scheme="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/English/default.aspx" /><category term="jQuery" scheme="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/jQuery/default.aspx" /></entry><entry><title>利用Windows Mobile模擬器測試網頁</title><link rel="alternate" type="text/html" href="http://blog.darkthread.net/blogs/darkthreadtw/archive/2010/03/07/test-web-with-wm-emulator.aspx" /><id>http://blog.darkthread.net/blogs/darkthreadtw/archive/2010/03/07/test-web-with-wm-emulator.aspx</id><published>2010-03-07T06:59:00Z</published><updated>2010-03-07T06:59:00Z</updated><content type="html">&lt;span id="PostName"&gt;&lt;/span&gt;  &lt;p&gt;上回介紹過&lt;a href="http://blog.darkthread.net/blogs/darkthreadtw/archive/2010/03/04/dev-emu-mgr-standalone.aspx"&gt;獨立安裝Windows Mobile 6模擬器&lt;/a&gt;的方法，最終目標是想利用模擬器測試網站在行動裝置上的呈現與操作效果，今天繼續補完後續步驟。&lt;/p&gt;  &lt;p&gt;首先，我們來讓模擬器可以&amp;quot;上網&amp;quot;。要讓模擬器連上Internet，透過VPC 2007的虛擬網卡驅動程式是&lt;a href="http://msmvps.com/blogs/jeffloucks/archive/2009/09/08/emulating-windows-mobile-6-5-with-networking.aspx"&gt;一種方法&lt;/a&gt;，不過必須安裝VPC 2007，會有平台上的限制，所以像Windows 7、Windows 2007 R2就被發了好人卡；我個人偏愛的是另一種做法---透過&lt;a href="http://www.microsoft.com/taiwan/windowsmobile/devicecenter.mspx"&gt;Mobile Device Center&lt;/a&gt;轉接(就是ActiveSync在Vista之後進化版)。&lt;/p&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;[2010-03-08補充]&lt;/font&gt; 網友guest提供在Windows 7上獨立安裝模擬器所需Virtual Machine Network Services的&lt;a href="http://www.brianpeek.com/blog/archive/2009/05/02/windows-virtual-pc-and-the-microsoft-device-emulator.aspx"&gt;密技&lt;/a&gt;，可以克服Win7上無法安裝VPC2007的問題，特此感謝!&lt;/p&gt;  &lt;p&gt;為了讓模擬器連上Mobile Device Center，我們要先開放DMA連線(如下圖)。另外，網路選項要設成Automatic或The Internet，以允許模擬器連到Internet。有一個小撇步: 當發現模擬器無法連上Internet時(完全連不到或變成連上本機IIS)，在Automatic/The Internet間做一次切換常能解決問題，我不知背後原理為何，大家就姑且當成&amp;quot;電視沒訊號時用力搥一下就會變好&amp;quot;那種密技吧!&lt;/p&gt;  &lt;p&gt;&lt;img src="http://blog.darkthread.net/photos/darkthread/images/6083/500x375.aspx" class="PopBoxImageSmall" alt="" /&gt;&lt;/p&gt;  &lt;p&gt;設定好Mobile Device Center，接著在Device Emulator Manager啟動模擬器的&amp;quot;Cradle”功能，模擬實體手機/PDA用USB連上電腦的樣子。&lt;/p&gt;  &lt;p&gt;&lt;img src="http://blog.darkthread.net/photos/darkthread/images/6082/500x375.aspx" class="PopBoxImageSmall" alt="" /&gt;&lt;/p&gt;  &lt;p&gt;接著Mobile Device Center就會偵測到模擬器連上線了(Connected)，由於我們不需要同步模擬器的行事曆、連絡人，其他功能可以忽略不理。&lt;/p&gt;  &lt;p&gt;&lt;img src="http://blog.darkthread.net/photos/darkthread/images/6084/500x375.aspx" class="PopBoxImageSmall" alt="" /&gt;&lt;/p&gt;  &lt;p&gt;如果沒有意外，此時在模擬器裡開啟IE，就可以開連上平日常逛網站，看看它們在手機上變成什麼&lt;strike&gt;鬼樣子&lt;/strike&gt;德行囉! (密技提示: &lt;font color="#ff8000"&gt;發現無法連線時，記得用力拍一下電視機 &lt;/font&gt;XD)&lt;/p&gt;  &lt;p&gt;&lt;img src="http://blog.darkthread.net/photos/darkthread/images/6085/500x375.aspx" class="PopBoxImageSmall" alt="" /&gt;&lt;/p&gt;  &lt;p&gt;另外，在智慧手機界，使用Opera Mobile或Opera Mini的使用者很多，所以理論上也該裝一套來玩玩。安裝Opera最快的方法是用直接用模擬器開IE連上&lt;a href="http://m.opera.com/next"&gt;http://m.opera.com/next&lt;/a&gt;，下載Cab檔案回來安裝就搞定了。&lt;/p&gt;  &lt;p&gt;&lt;img src="http://blog.darkthread.net/photos/darkthread/images/6086/500x375.aspx" class="PopBoxImageSmall" alt="" /&gt;&amp;nbsp;&amp;nbsp; &lt;img src="http://blog.darkthread.net/photos/darkthread/images/6087/500x375.aspx" class="PopBoxImageSmall" alt="" /&gt;&lt;/p&gt;&lt;img src="http://blog.darkthread.net/aggbug.aspx?PostID=6089" width="1" height="1"&gt;</content><author><name>Jeffrey</name><uri>http://blog.darkthread.net/members/Jeffrey.aspx</uri></author><category term="Mobile" scheme="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/Mobile/default.aspx" /></entry><entry><title>Mini C# Lab 1.4 Release</title><link rel="alternate" type="text/html" href="http://blog.darkthread.net/blogs/darkthreadtw/archive/2010/03/05/mini-c-lab-1-4.aspx" /><id>http://blog.darkthread.net/blogs/darkthreadtw/archive/2010/03/05/mini-c-lab-1-4.aspx</id><published>2010-03-05T09:29:21Z</published><updated>2010-03-05T09:29:21Z</updated><content type="html">&lt;span id="PostName"&gt;&lt;/span&gt; &lt;p&gt;The primary new feature of Ver 1.4 is &lt;b&gt;batch mode&lt;/b&gt;!&lt;/p&gt; &lt;p&gt;Now you can run Mini C# Lab program as a scheduled task, no UI interactivity is needed. Here are some batch argument examples:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Load and execute x:\temp\test.cs, use the output to overwrie x:\temp\log.txt &lt;b&gt;&lt;br /&gt;MiniCSharpLab /batch /cs:x:\temp\test.cs /out:x:\temp\log.txt /overwrite&lt;/b&gt;  &lt;li&gt;Load and execute &amp;quot;c:\some path\test.cs&amp;quot;, append the output to LogyyyyMMdd.txt (the file name will be change according to System.DateTime.Now) &lt;br /&gt;&lt;b&gt;MiniCSharpLab /batch /cs:&amp;quot;&amp;quot;c:\some path\test.cs&amp;quot;&amp;quot; /out:Log{yyyyMMdd}.txt&lt;/b&gt;  &lt;li&gt;Load and execute x:\aa.cs, append the output to x:\aa.txt, if execution time is longer than 1200 seconds, program will be terminated. &lt;br /&gt;&lt;b&gt;MiniCSharpLab /batch /cs:x:\aa.cs /out:x:\aa.txt /timeout:1200&lt;/b&gt;  &lt;li&gt;Load and execute x:\aa.vb as .NET 3.5 program, append the output to x:\aa.txt &lt;br /&gt;&lt;b&gt;MiniCSharpLab /batch /vb:x:\aa.vb /out:x:\aa.txt /v35&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;There are also minor bug fix and improvement:  &lt;ol&gt; &lt;li&gt;Fix: Thread.Sleep for 0.5&amp;quot; after execution to avoid output loss (I hope it works)  &lt;li&gt;Add: Add execution duration display&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;&lt;font color="#ff8000"&gt;【中文說明】&lt;/font&gt;&lt;/p&gt; &lt;p&gt;其實1.4版已經寫出來蠻久了，上回的&lt;a href="http://blog.darkthread.net/blogs/darkthreadtw/archive/2008/09/02/coding-for-fun-contest-start.aspx"&gt;黑暗盃程式魔人賽&lt;/a&gt;裡就已經偷跑過了。今天剛好跟同事提到要寫簡單的Script跑排程，索性一不做二不休，把它Release到&lt;a href="http://minicsharplab.codeplex.com/releases/view/41445"&gt;CodePlex網站&lt;/a&gt;上，想參考程式的人也可以在CodePlex找到原始碼。&lt;/p&gt; &lt;p&gt;1.4版最大的特色是支援批次無UI的方式執行，這個之前網友Ammon也有提過，剛好也是我自己不少排程作業上的需求。執行參數如下:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;載入並執行x:\temp\test.cs, 輸出結果覆寫到x:\temp\log.txt&lt;br /&gt;&lt;b&gt;MiniCSharpLab /batch /cs:x:\temp\test.cs /out:x:\temp\log.txt /overwrite&lt;/b&gt;  &lt;li&gt;載入並執行&amp;quot;c:\some path\test.cs&amp;quot;, 輸入結果附加到LogyyyyMMdd.txt檔案後端(檔名會隨執行時間變化) &lt;br /&gt;&lt;b&gt;MiniCSharpLab /batch /cs:&amp;quot;&amp;quot;c:\some path\test.cs&amp;quot;&amp;quot; /out:Log{yyyyMMdd}.txt&lt;/b&gt;  &lt;li&gt;載入並執行x:\aa.cs, 輸出結果附加到x:\aa.txt。若執行時間超過1200秒，會被強制中止&lt;br /&gt;&lt;b&gt;MiniCSharpLab /batch /cs:x:\aa.cs /out:x:\aa.txt /timeout:1200&lt;/b&gt;  &lt;li&gt;載入x:\aa.vb，視為.NET 3.5程式執行，輸出結果附加到x:\aa.txt&lt;br /&gt;&lt;b&gt;MiniCSharpLab /batch /vb:x:\aa.vb /out:x:\aa.txt /v35&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;strong&gt;另外還有兩個小修改:&lt;/strong&gt;&lt;/p&gt; &lt;li&gt;修正: 加入0.5秒Thread.Sleep延遲，防止輸出結果遺失(希望有效)  &lt;li&gt;加入執行時間顯示功能&lt;/li&gt; &lt;p&gt;如發現Bug或有功能建議，歡迎在此留言回饋。(但不一定能即時修正或擴充，請見諒!)&lt;/p&gt;&lt;img src="http://blog.darkthread.net/aggbug.aspx?PostID=6078" width="1" height="1"&gt;</content><author><name>Jeffrey</name><uri>http://blog.darkthread.net/members/Jeffrey.aspx</uri></author><category term="Tools" scheme="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/Tools/default.aspx" /><category term=".NET" scheme="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/.NET/default.aspx" /><category term="English" scheme="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/English/default.aspx" /></entry><entry><title>CODE-鎖定有掛onchange事件的欄位停用自動完成</title><link rel="alternate" type="text/html" href="http://blog.darkthread.net/blogs/darkthreadtw/archive/2010/03/05/set-autocomp-off.aspx" /><id>http://blog.darkthread.net/blogs/darkthreadtw/archive/2010/03/05/set-autocomp-off.aspx</id><published>2010-03-05T05:56:00Z</published><updated>2010-03-05T05:56:00Z</updated><content type="html">&lt;span id="PostName"&gt;&lt;/span&gt; &lt;p&gt;上回提過因使用IE自動完成&lt;a href="http://blog.darkthread.net/blogs/darkthreadtw/archive/2010/01/26/change-event-not-fired.aspx"&gt;造成onchange事件不被觸發&lt;/a&gt;的問題，著實帶來一些困擾，不少User抱怨系統掛在onchange事件的欄位連動功能失效。雖然User漸漸都已學會在這些欄位使用手工輸入，不要依賴IE自動完成帶入結果就可以避開問題，抱怨日少。不過我想從網頁設定上去停用autocomplete還是比較根本的解決之道。&lt;/p&gt; &lt;p&gt;當然，我們可以抱著寧可錯殺一百，不可錯放一個的精神來個$(&amp;quot;input:text&amp;quot;).attr(&amp;quot;autocomplete&amp;quot;, &amp;quot;off&amp;quot;)，把網頁上所有&amp;lt;input type=&amp;#39;text&amp;#39;&amp;gt;的自動完成功能全都閹掉，一了百了。不過，我習慣處理得細膩一點，將這個不得已措施的範圍縮小到受影響的欄位上，換句話說，只有掛了onchange事件的&amp;lt;input type=&amp;#39;text&amp;#39;&amp;gt;才是要撲殺的對象。&lt;/p&gt; &lt;p&gt;要怎麼偵錯欄位是否有掛onchange事件? 想起上回剛好玩過&lt;a href="http://blog.darkthread.net/blogs/darkthreadtw/archive/2010/01/23/list-jquery-events.aspx"&gt;列舉元素已掛載的jQuery事件&lt;/a&gt;的小把戲，這回把它融合進來，就做出了這個&amp;quot;標靶治療式&amp;quot;的autocomplete屬性停用Plugin。&lt;/p&gt; &lt;p&gt;以下的程式範例可以讓大家拿去&lt;a href="http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/02/15/mini-jquery-lab-online.aspx"&gt;Mini jQuery Lab&lt;/a&gt;實地玩一下。&lt;/p&gt; &lt;div class="BlogCodeBlock"&gt; &lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;//針對有掛onchange的&amp;lt;input type=&amp;quot;text&amp;quot;&amp;gt;設定autocomplete=&amp;quot;off&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;//參考: http://tinyurl.com/yzwp3lt&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;//限制: 只對執行當下已經掛載onchange事件者有效(不包含.live()掛載者)&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;$.fn.disableAutoCompleteForChange = &lt;span class="kwrd"&gt;function&lt;/span&gt;(force) {&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="rem"&gt;//過濾只留下&amp;lt;input type=&amp;#39;text&amp;#39;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.filter(&lt;span class="str"&gt;&amp;quot;:text&amp;quot;&lt;/span&gt;).each(&lt;span class="kwrd"&gt;function&lt;/span&gt;() {&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="rem"&gt;//篩選有掛change事件者, 參考: http://tinyurl.com/yka6x8g&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;var&lt;/span&gt; evts = $.data(&lt;span class="kwrd"&gt;this&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;events&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (force || evts &amp;amp;&amp;amp; evts[&lt;span class="str"&gt;&amp;quot;change&amp;quot;&lt;/span&gt;] || &lt;span class="kwrd"&gt;this&lt;/span&gt;.onchange != undefined)&lt;/pre&gt;&lt;pre&gt;            $(&lt;span class="kwrd"&gt;this&lt;/span&gt;).attr(&lt;span class="str"&gt;&amp;quot;autocomplete&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;off&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="rem"&gt;//.val(&amp;quot;SET&amp;quot;); //可加上這段測試是否被設定&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    });&lt;/pre&gt;&lt;pre class="alt"&gt;}&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;//加入三個&amp;lt;input&amp;gt;進行測試, T2用jQuery掛onchange, T3直接宣告onchange&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;$(&lt;span class="str"&gt;&amp;quot;body&amp;quot;&lt;/span&gt;).append(&lt;span class="str"&gt;&amp;quot;&amp;lt;input id=&amp;#39;T1&amp;#39; /&amp;gt;&amp;lt;input id=&amp;#39;T2&amp;#39; /&amp;gt;&amp;quot;&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;.append(&lt;span class="str"&gt;&amp;quot;&amp;lt;input id=&amp;#39;T3&amp;#39; onchange=&amp;#39;alert(3);&amp;#39; /&amp;gt;&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre class="alt"&gt;$(&lt;span class="str"&gt;&amp;quot;#T2&amp;quot;&lt;/span&gt;).change(&lt;span class="kwrd"&gt;function&lt;/span&gt;() { alert(&lt;span class="str"&gt;&amp;quot;2&amp;quot;&lt;/span&gt;); });&lt;/pre&gt;&lt;pre&gt;$(&lt;span class="str"&gt;&amp;quot;input&amp;quot;&lt;/span&gt;).disableAutoCompleteForChange();&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;注意:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;.disableAutoCompleteForChange()的呼叫時機要在onchange掛上去後&lt;/li&gt;
&lt;li&gt;對使用.live()掛載的onchange無效&lt;/li&gt;
&lt;li&gt;另外多加對以&amp;lt;input onchange=&amp;quot;...&amp;quot; /&amp;gt;方式掛上事件的偵測&lt;/li&gt;
&lt;li&gt;.disableAutoCompleteForChange(true)時可不管有無onchange，一律停用&lt;/li&gt;&lt;/ol&gt;&lt;font color="#ff6600"&gt;[2010-03-08補充] &lt;/font&gt;測試發現使用jQuery 1.4+掛載change()事件即可&lt;a href="http://bit.ly/aLOD7j"&gt;解決此問題&lt;/a&gt;&lt;br /&gt;&lt;img src="http://blog.darkthread.net/aggbug.aspx?PostID=6075" width="1" height="1"&gt;</content><author><name>Jeffrey</name><uri>http://blog.darkthread.net/members/Jeffrey.aspx</uri></author><category term="IE" scheme="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/IE/default.aspx" /><category term="jQuery" scheme="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/jQuery/default.aspx" /><category term="CODE" scheme="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/CODE/default.aspx" /></entry><entry><title>獨立安裝Windows Mobile 6模擬器</title><link rel="alternate" type="text/html" href="http://blog.darkthread.net/blogs/darkthreadtw/archive/2010/03/04/dev-emu-mgr-standalone.aspx" /><id>http://blog.darkthread.net/blogs/darkthreadtw/archive/2010/03/04/dev-emu-mgr-standalone.aspx</id><published>2010-03-03T20:31:21Z</published><updated>2010-03-03T20:31:21Z</updated><content type="html">&lt;span id="PostName"&gt;&lt;/span&gt;  &lt;p&gt;Visual Studio 2005/2008提供了整合式的Windows Mobile程式開發環境，其中包含&lt;strong&gt;PocketPC及Windows Mobile平台模擬器&lt;/strong&gt;，可以在沒有實體手機/PDA的情況下執行、測試及偵錯程式。不過VS2008內附的模擬器只支援到Windows Mobile 5.0，如果想測試WM6，則需安裝&lt;a href="http://www.microsoft.com/downloads/info.aspx?na=47&amp;amp;p=1&amp;amp;SrcDisplayLang=en&amp;amp;SrcCategoryId=&amp;amp;SrcFamilyId=20686a1d-97a8-4f80-bc6a-ae010e085a6e&amp;amp;u=details.aspx%3ffamilyid%3d06111A3A-A651-4745-88EF-3D48091A390B%26displaylang%3den"&gt;Windows Mobile 6 Professional and Standard Software Development Kits Refresh&lt;/a&gt; (Standard / Profession分成兩包，視需要分別下載安裝) ，而要測試中文環境的話，則還要另外下載&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=38C46AA8-1DD7-426F-A913-4F370A65A582&amp;amp;displaylang=en"&gt;正體中文版的Windows Mobile 6 ROM Image&lt;/a&gt;，安裝完成後Device Emulator Manager就會自動多出WM6平台可供選擇，非常直覺簡單:&lt;/p&gt;  &lt;p&gt;&lt;img src="http://blog.darkthread.net/photos/darkthread/images/6053/original.aspx" alt="" /&gt;     &lt;br /&gt;圖1 從VS2008啟動Device Emulator Manager&lt;/p&gt;  &lt;p&gt;&lt;img src="http://blog.darkthread.net/photos/darkthread/images/6054/original.aspx" alt="" /&gt;&amp;#160; &lt;br /&gt;圖2 安裝WM6 SDK及正體中文WM6 Image後，會多出WM6平台選項&lt;/p&gt;  &lt;p&gt;手上有台跑Windows 7的ThinkPad T43，沒安裝VS2008(只有VS2010 RC)，但我想在上面跑WM6模擬器，用WM6的IE瀏覽器測試網頁在行動裝置上的呈現效果。少了VS2008一手包辦自動裝到好的貼心協助，獨立安裝需要較多的手工。以下是我試出來的步驟:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;下載安裝&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=a6f6adaf-12e3-4b2f-a394-356e2c2fb114&amp;amp;displaylang=en"&gt;Microsoft Device Emulator 3.0 -- Standalone Release&lt;/a&gt;， C:\Program Files\Microsoft Device Emulator\1.0\dvcemumanager.exe就是圖1 Device Emulator Manager的執行程式，建議在桌面做個捷徑方便啟動。 (註: 模擬器使用與Virtual PC相似的核心技術，所以不能裝在VM OS上) &lt;/li&gt;    &lt;li&gt;下載安裝&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=38C46AA8-1DD7-426F-A913-4F370A65A582&amp;amp;displaylang=en"&gt;正體中文版的Windows Mobile 6 ROM Image&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;此時執行Device Emulator Manager的結果可能會讓你失望，清單上空空如也，剛才新裝的WM6 Image並不會自動列出來(這種時候就會覺得Visual Studio就甘心A)。我們需要設法產生一個.decfg檔案，提供Emulator Manager足夠的資訊，才能順利啟動WM6模擬器。最簡單的方法是找台有裝VS2008的機器，在圖2介面上先選取模擬器，按右鍵用Save As產生.decfg檔再修改(多半只需調整檔案路徑)。 &lt;/li&gt;    &lt;li&gt;將上一步驟產生的.decfg檔案Copy到C:\Users\&lt;em&gt;使用者名稱&lt;/em&gt;\Documents\My Device Emulators目錄下，重新啟動一次Device Emulator Manager，就可以看見新增的模擬器，按右鍵選Connect…       &lt;br /&gt;&lt;img src="http://blog.darkthread.net/photos/darkthread/images/6055/original.aspx" alt="" /&gt;       &lt;br /&gt;薑! 薑! 薑! 薑~~~ WM6模擬器就跑起來囉! &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;檢附上述的WM6ProCHT.decfg供參:&lt;/p&gt;  &lt;div style="background-color:#000000;color:#00ff00;"&gt;   &lt;p&gt;&amp;lt;DeviceEmulator xmlns=&amp;quot;&lt;a href="http://schemas.microsoft.com/DeviceEmulator/2006/01/DeCfg&amp;quot;"&gt;http://schemas.microsoft.com/DeviceEmulator/2006/01/DeCfg&amp;quot;&lt;/a&gt;&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Board&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;CpuCore Reconfigurable=&amp;quot;false&amp;quot;&amp;gt;ARMv4&amp;lt;/CpuCore&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;CpuOptions Reconfigurable=&amp;quot;false&amp;quot;&amp;gt;TDI&amp;lt;/CpuOptions&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;VFP Reconfigurable=&amp;quot;false&amp;quot;&amp;gt;false&amp;lt;/VFP&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;OSImage Reconfigurable=&amp;quot;false&amp;quot; Address=&amp;quot;0&amp;quot;&amp;gt;C:\Program Files\Windows Mobile 6 SDK\PocketPC\DeviceEmulation\0404\PPC_CHT_GSM_VR.BIN&amp;lt;/OSImage&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;MemSize Reconfigurable=&amp;quot;false&amp;quot;&amp;gt;128&amp;lt;/MemSize&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/Board&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Emulator&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;DefaultSave Reconfigurable=&amp;quot;false&amp;quot;&amp;gt;true&amp;lt;/DefaultSave&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;FuncKey Reconfigurable=&amp;quot;true&amp;quot;&amp;gt;193&amp;lt;/FuncKey&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;HostKey Reconfigurable=&amp;quot;true&amp;quot;&amp;gt;Right-Alt&amp;lt;/HostKey&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Language Reconfigurable=&amp;quot;false&amp;quot;&amp;gt;1028&amp;lt;/Language&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Skin Reconfigurable=&amp;quot;true&amp;quot; EnableSkin=&amp;quot;true&amp;quot; ToolTips=&amp;quot;off&amp;quot;&amp;gt;C:\Program Files\Windows Mobile 6 SDK\PocketPC\DeviceEmulation\Pocket_PC_Phone\Pocket_PC_PE.xml&amp;lt;/Skin&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;VMID Reconfigurable=&amp;quot;false&amp;quot;&amp;gt;{984B347D-C615-4042-856D-EF567D2721C2}&amp;lt;/VMID&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/Emulator&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Peripherals&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;SerialPort Reconfigurable=&amp;quot;true&amp;quot; UARTNumber=&amp;quot;0&amp;quot;&amp;gt;none&amp;lt;/SerialPort&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;SerialPort Reconfigurable=&amp;quot;true&amp;quot; UARTNumber=&amp;quot;1&amp;quot;&amp;gt;none&amp;lt;/SerialPort&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;SerialPort Reconfigurable=&amp;quot;true&amp;quot; UARTNumber=&amp;quot;2&amp;quot;&amp;gt;none&amp;lt;/SerialPort&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/Peripherals&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Platform&amp;gt;Windows Mobile 6 Professional SDK&amp;lt;/Platform&amp;gt;       &lt;br /&gt;&amp;lt;/DeviceEmulator&amp;gt;&lt;/p&gt; &lt;/div&gt;&lt;img src="http://blog.darkthread.net/aggbug.aspx?PostID=6074" width="1" height="1"&gt;</content><author><name>Jeffrey</name><uri>http://blog.darkthread.net/members/Jeffrey.aspx</uri></author><category term="Mobile" scheme="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/Mobile/default.aspx" /></entry><entry><title>開啟RSClientPrint偵錯Log</title><link rel="alternate" type="text/html" href="http://blog.darkthread.net/blogs/darkthreadtw/archive/2010/03/02/rsclientprint-log.aspx" /><id>http://blog.darkthread.net/blogs/darkthreadtw/archive/2010/03/02/rsclientprint-log.aspx</id><published>2010-03-02T02:00:47Z</published><updated>2010-03-02T02:00:47Z</updated><content type="html">&lt;span id="PostName"&gt;&lt;/span&gt; &lt;p&gt;Reporting Service線上列印功能可以直接由網頁列印出美美的報表，是很酷的功能，不過實務應用也遇過不少小狀態就是了。&lt;/p&gt; &lt;p&gt;昨天無意中發現RSClientPrint元件支援寫Log檔的功能，這在射茶包時可是價值連城的情報。故特別PO文做個筆記以防年老失憶:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;開啟Log記錄的做法是用RegEdit加入一則機碼(Key)HKEY_CURRENT_USER\Software\Microsoft\Microsoft SQL Server\80\Reporting Services&lt;br /&gt;並新增LogRSClientPrintInfo REG_DWORD = 0x00000001(可參考&lt;a href="http://support.microsoft.com/kb/907010/en-us"&gt;這篇KB&lt;/a&gt;More Inforation一節的說明)&lt;/li&gt; &lt;li&gt;執行SSRS報表並使用線上列印&lt;/li&gt; &lt;li&gt;DIR %temp%\LOG*.tmp，便可看到剛才列印動作所產生的Log檔案(檔名格式為LOGnnnn.tmp，nnnn為16進位隨機數字)。&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;稍微看了一下，Log裡記載的資訊蠻詳細的，開啟報表路徑/名稱、使用語系、選擇的印表機、換頁、發出Request的過程都鉅細靡遺地被保留下來，很有Debug Log的味道，我想對於解決RSClientPrint疑難雜症應該很有幫忙。不過要看到這些Log，RSClientPrint元件至少要被順利載入並啟動才可以，RSClientPrint另一個常見的問題是因版本更新導致無法載入使用，這裡也順便提供一下參考資訊:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/07/24/rsclientprint-error-again.aspx"&gt;【茶包射手專欄】又見SSRS無法列印問題&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://blog.darkthread.net/blogs/darkthreadtw/archive/2008/10/30/rsclientprint-issue-again.aspx"&gt;KB-三探Windows Update後SSRS不能列印問題&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://blog.darkthread.net/blogs/darkthreadtw/archive/2008/10/24/ssrs-print-issue-final.aspx"&gt;KB-再探Windows Update後SSRS不能列印問題&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://blog.darkthread.net/blogs/darkthreadtw/archive/2008/10/16/ssrs-client-print-control-error.aspx"&gt;【茶包射手專欄】SSRS報表網頁列印失敗&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;img src="http://blog.darkthread.net/aggbug.aspx?PostID=6070" width="1" height="1"&gt;</content><author><name>Jeffrey</name><uri>http://blog.darkthread.net/members/Jeffrey.aspx</uri></author><category term="Reporting Service" scheme="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/Reporting+Service/default.aspx" /><category term="Trouble-Shooting" scheme="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/Trouble-Shooting/default.aspx" /></entry><entry><title>【茶包射手日記】不限條件選項之SQL組裝與資料庫OR運算特性驗證</title><link rel="alternate" type="text/html" href="http://blog.darkthread.net/blogs/darkthreadtw/archive/2010/03/02/or-operator-in-sql.aspx" /><id>http://blog.darkthread.net/blogs/darkthreadtw/archive/2010/03/02/or-operator-in-sql.aspx</id><published>2010-03-01T13:38:44Z</published><updated>2010-03-01T13:38:44Z</updated><content type="html">&lt;span id="PostName"&gt;&lt;/span&gt; &lt;p&gt;在設計查詢介面時，下拉式選單是很常見的條件選取方式，而往往我們都會再加上一個&amp;quot;不限條件&amp;quot;選項，允許使用者不限制條件，列出所有項頁。舉例來說: 在設定查詢地區的下拉選單(例如: ddlArea)，除了列出基隆市、台北市、台北縣、桃園縣...等各縣市Option外，常會再多一個&amp;quot;所有地區&amp;quot;選項，將Option Value設定=&amp;#39;*&amp;#39;，選取時表示不限定地區。在Server端，便要將這些篩選條件轉為SQL指令，如何將&amp;#39;*&amp;#39;視為不限地區? 我過去都用條件式動態組裝:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font color="#ff8000"&gt;if (ddlArea.Text != &amp;quot;*&amp;quot;) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cmd.CommandText += &amp;quot; AND AreaCol = @pArea&amp;quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cmd.Parameters.Add(&amp;quot;@pArea&amp;quot;, SqlDbType.NVarChar).Value = ddlArea.Text;&lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;後來有一天開了竅，想到更簡潔的寫法:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font color="#ff8000"&gt;cmd.CommandText = @&amp;quot;&lt;br /&gt;SELECT .... FROM ...&lt;br /&gt;WHER ...其他查詢條件...&lt;br /&gt;AND (@pArea = &amp;#39;*&amp;#39; OR AreaCol = @pArea)&lt;br /&gt;....&amp;quot;;&lt;br /&gt;cmd.Parameters.Add(&amp;quot;@pArea&amp;quot;, SqlDbType.NVarChar).Value = ddlArea.Text;&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;如此，整個查詢條件可以直接寫成靜態字串，便於閱讀修改，不必視狀況決定是否要傳入@pArea，而它一樣可達到傳入&amp;quot;*&amp;quot;就不設地區比對條件的效果。&lt;/p&gt; &lt;p&gt;今天在噗浪上與噗友討論到類似議題，看到一種新寫法: where p1 = case @p1 when &amp;#39;*&amp;#39; then p1 else @p1 end，噗友提到曾經聽某資料庫老師說過，這種寫法比上述OR法效能更好，理由是在SQL指令中，OR 的兩邊條件都會做運算比較，跟一般程式的認知不同。(不過噗友對此理論也抱持懷疑態度就是了)&lt;/p&gt; &lt;p&gt;基本上，我無法接受SQL指令中OR兩邊都會執行的主張。當今各家DB在效能優化上不遺餘力，每一個環節錙銖必較，怎麼可能留下這麼個大洞害人摔跤? 不過要怎麼驗證它倒是挺傷腦筋的。&lt;/p&gt; &lt;p&gt;想到一個好辦法，用Block機制來突顯差別!! 故意在OR後方條件式中SELECT一個被Lock住的Table，接著故意讓OR前方條件為True，若SQL傻不楞登硬要執行OR後方條件式就會被擋下來，直到Lock被釋放為止(ROLLBACK TRAN/COMMIT TRAN)；若SQL如我想的冰雪聰明，就會直接忽略OR後方條件立刻送回結果。由結果出現時機，便可判定OR後方的條件式是否被執行。&lt;/p&gt; &lt;p&gt;實驗結果如下: (SQL 2008 @ Windows 2008 x64)&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;img src="http://blog.darkthread.net/photos/darkthread/images/6064/original.aspx" alt="" /&gt;&lt;/p&gt; &lt;p&gt;在最下方的SQL指令區故意INSERT卻不COMMIT讓T2被Lock住，此時OR前方條件為1=1的SQL指令不受影響，OR前方為1=0的SQL指令才會執行到第二條件SELECT COUNT(ID) FROM T2而被Block住。由此可證: SQL Sever並不會像VB6一樣傻傻地檢查全部的AND/OR條件式，後方條件式執行與否會視前面的結果而定，故前述的OR法大家可安心服用。(這裡有&lt;a href="http://stackoverflow.com/questions/1649237/equivalent-to-vb-andalso-in-sql"&gt;另一篇討論&lt;/a&gt;也持相同看法: The query engine will take care of this for you. All operators will &amp;quot;short circuit&amp;quot; if they can.) &lt;/p&gt; &lt;p&gt;&lt;font color="#ff8000" size="4" face="Tahoma"&gt;MYTH BUSTED!!!&lt;/font&gt; &lt;a href="http://en.wikipedia.org/wiki/MythBusters"&gt;[註]&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blog.darkthread.net/aggbug.aspx?PostID=6065" width="1" height="1"&gt;</content><author><name>Jeffrey</name><uri>http://blog.darkthread.net/members/Jeffrey.aspx</uri></author><category term="ASP.NET" scheme="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/ASP.NET/default.aspx" /><category term="SQL 2005" scheme="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/SQL+2005/default.aspx" /><category term=".NET" scheme="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/.NET/default.aspx" /><category term="Trouble-Shooting" scheme="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/Trouble-Shooting/default.aspx" /><category term="SQL 2000" scheme="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/SQL+2000/default.aspx" /><category term="SQL 2008" scheme="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/SQL+2008/default.aspx" /></entry><entry><title>【黑暗水電工日記】假戲真做!</title><link rel="alternate" type="text/html" href="http://blog.darkthread.net/blogs/darkthreadtw/archive/2010/02/28/call-me-dark-plumber.aspx" /><id>http://blog.darkthread.net/blogs/darkthreadtw/archive/2010/02/28/call-me-dark-plumber.aspx</id><published>2010-02-28T04:41:00Z</published><updated>2010-02-28T04:41:00Z</updated><content type="html">&lt;span id="PostName"&gt;&lt;/span&gt;  &lt;p&gt;&lt;img src="http://blog.darkthread.net/photos/darkthread/images/6060/original.aspx" alt="" /&gt;&lt;/p&gt;  &lt;p&gt;樓梯間的天花板燈座年代久遠，塑膠逐漸脆化，前陣子更是開始座盤分離，接著就出現接觸不良的狀態。開燈後常得用雨傘尖輕推燈泡&amp;quot;喬&amp;quot;個幾下才能點亮，上週一，小燈座走到了生命盡頭，再也亮不起來。樓梯少了燈，晚上出入不便，身為&lt;a href="http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/04/05/dark-plumber.aspx"&gt;黑暗水電工&lt;/a&gt;，面對這種險惡情境，當然責無旁貸要扛起拯救世界的重責大任! (遠目)&lt;/p&gt;  &lt;p&gt;平日下班都己晚上，樓梯間昏暗難以施工，於是趁著週末，先去附近的&amp;quot;專業水電材料行&amp;quot;(不是一般水電行，是專做&amp;quot;專業水電工&amp;quot;生意的水電材料批發店家，也是上回買到&lt;a href="http://blog.darkthread.net/blogs/darkthreadtw/archive/2007/05/12/756.aspx"&gt;止水墊&lt;/a&gt;的地方)&lt;strike&gt;進貨&lt;/strike&gt;買材料。材料行內成天都有&amp;quot;專業水電工&amp;quot;進出，用行話直接跟老板下單，像&amp;quot;LP4來50個&amp;quot;、&amp;quot;有六分管嗎&amp;quot;之類的，我雖然跟水電工前輩們一樣穿著排汗衫牛仔褲，但只要一開口說找&amp;quot;樓梯間天花板用的那種燈泡座&amp;quot;，偽水電工的身份馬上穿幫。不過，水電材料行的所有商品都標了價，老板沒打算坑殺外行人(比起上回&lt;a href="http://blog.darkthread.net/blogs/darkthreadtw/archive/2010/01/25/life-twitter-201001.aspx"&gt;想賣我高檔汽車大燈燈泡&lt;/a&gt;的店家好多了)，讓我買起來很安心。以下這兩個燈座，大家猜猜看多少錢?&lt;/p&gt;  &lt;p&gt;&lt;img src="http://blog.darkthread.net/photos/darkthread/images/6056/original.aspx" alt="" /&gt;&lt;/p&gt;  &lt;p&gt;一個10元，很便宜吧! &lt;/p&gt;  &lt;p&gt;搬來木梯，抄起起子卸螺絲、拆舊燈座、裝新燈座、旋緊螺絲，三兩下便換裝完成。看來拆換燈座對我根本是小菜一碟，請叫我【黑暗水電工】!!&lt;/p&gt;  &lt;p&gt;&lt;img src="http://blog.darkthread.net/photos/darkthread/images/6057/original.aspx" alt="" /&gt;&lt;/p&gt;  &lt;p&gt;完工後站在梯子上，等黑暗女王開關燈檢測功能是否正常。此時發生了一件震憾我&lt;strike&gt;幼小&lt;/strike&gt;脆弱心靈的大事...&lt;/p&gt;  &lt;p&gt;樓下傳來鐵門開門聲，原來是住樓上的老先生回來了。木梯卡住狹小的樓梯轉角，要由梯子旁的狹小間隙側身穿過有點為難老人家，於是我趕緊將木梯收合讓出路來。老先生跟我點頭道謝繼續向上走，看到正在家門口控制電燈開關的黑暗女王，隨口說了一句:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font color="#ff8000"&gt;妳找水電來換燈哦~&lt;/font&gt;&lt;font color="#ff8000"&gt;妳&lt;/font&gt;&lt;font color="#ff8000"&gt;找水電來換燈哦~&lt;/font&gt;&lt;font color="#ff8000"&gt;妳&lt;/font&gt;&lt;font color="#ff8000"&gt;找水電來換燈哦~&lt;/font&gt;&lt;font color="#ff8000"&gt;妳&lt;/font&gt;&lt;font color="#ff8000"&gt;找水電來換燈哦~&lt;/font&gt;&lt;font color="#ff8000"&gt;妳&lt;/font&gt;&lt;font color="#ff8000"&gt;找水電來換燈哦~&lt;/font&gt;&lt;font color="#ff8000"&gt;妳&lt;/font&gt;&lt;font color="#ff8000"&gt;找水電來換燈哦~&lt;/font&gt;&lt;font color="#ff8000"&gt;妳&lt;/font&gt;&lt;font color="#ff8000"&gt;找水電來換燈哦~&lt;/font&gt;&lt;font color="#ff8000"&gt;妳&lt;/font&gt;&lt;font color="#ff8000"&gt;找水電來換燈哦~&lt;/font&gt;&lt;font color="#ff8000"&gt;妳&lt;/font&gt;&lt;font color="#ff8000"&gt;找水電來換燈哦~~~~~~&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;但見女王強忍笑意，努力克制不自主抖動的身體，回答老先生: &amp;quot;沒有啦，我先生看燈壞了，就想換一換...&amp;quot;&lt;/p&gt;  &lt;p&gt;老大爺，我說&amp;quot;叫我【黑暗水電工】&amp;quot;只是玩笑話，您怎麼當真啦!! 沒想到，我這個&amp;quot;偽．水電工&amp;quot;入戲太深，今天有排汗衫+牛仔褲的加持，全身已開始散放出濃濃的&amp;quot;水電工味&amp;quot;，竟順利騙倒鄰居。真不知該為練成&amp;quot;二轉水電工&amp;quot;高興，還是該擔心這會對我繼續從事&amp;quot;專業資訊工作&amp;quot;形成隱憂?&lt;/p&gt;  &lt;p&gt;一切都是幻覺，嚇不倒我的。&lt;/p&gt;  &lt;p&gt;平復好受驚的心情，在此向大家介紹前陣子在光華商場挖到的寶--八合一折疊起子! 比起過去買過的換頭起子優秀許多，最大的好處是不需額外空間收納起子頭，而且起子前端一體成形跟標準起子一樣細長，不像抽換式起子前端的突出六角套筒座常會卡住螺絲孔，伸不進去轉螺絲。&lt;/p&gt;  &lt;p&gt;&lt;img src="http://blog.darkthread.net/photos/darkthread/images/6059/original.aspx" alt="" /&gt;&lt;/p&gt;  &lt;p&gt;還有，起子前端的7顆LED燈在照明不足的場合超級好用，大推!!&lt;/p&gt;  &lt;p&gt;&lt;img src="http://blog.darkthread.net/photos/darkthread/images/6058/original.aspx" alt="" /&gt;&lt;/p&gt;  &lt;p&gt;這麼順手俐落的兵刃，絕對是水電工作人員居家旅遊，不可或缺的良伴，只要100塊大洋，有空要去光華敗家的捧油們可以考慮帶一把回家。&lt;/p&gt;&lt;img src="http://blog.darkthread.net/aggbug.aspx?PostID=6062" width="1" height="1"&gt;</content><author><name>Jeffrey</name><uri>http://blog.darkthread.net/members/Jeffrey.aspx</uri></author><category term="Life" scheme="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/Life/default.aspx" /></entry><entry><title>遲來一週的Acer P224W箱文</title><link rel="alternate" type="text/html" href="http://blog.darkthread.net/blogs/darkthreadtw/archive/2010/02/28/6061.aspx" /><id>http://blog.darkthread.net/blogs/darkthreadtw/archive/2010/02/28/6061.aspx</id><published>2010-02-28T04:32:39Z</published><updated>2010-02-28T04:32:39Z</updated><content type="html">&lt;p&gt;&lt;font color="#ff8000"&gt;【註: 文中有標明[p]的連結為噗浪訊息】&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;故事要從2008年11月說起，家裡有一台LKK的三鳥牌17&amp;quot; LCD，在&lt;a href="http://blog.darkthread.net/blogs/darkthreadtw/archive/2008/11/18/3799.aspx"&gt;添購新的22&amp;quot;內建電視盒LCD&lt;/a&gt;後，高齡8歲的它在我公司的辦公桌覓得第二春，轉任工作機的第二螢幕。&lt;/p&gt;  &lt;p&gt;時間來到半年後，7月的一天早上，17&amp;quot; LCD忽然出現&lt;a href="http://www.plurk.com/p/1k5nmj" target="_blank"&gt;一條血紅垂直線&lt;/a&gt;[p]。當時，全黑桌面背景配上紅線，還真有Canon L鏡的高級fu呢! 讓我心生莫名的&lt;a href="http://www.plurk.com/p/1kb3tk" target="_blank"&gt;虛榮感&lt;/a&gt;[p]~~~&lt;/p&gt;  &lt;p&gt;可惜，代誌嘸像憨人想A哈尼甘單~~~ 兩個月後，&lt;a href="http://www.plurk.com/p/2esd6t" target="_blank"&gt;第二條紅色線&lt;/a&gt;[p]冒出來了，噗友預言，線會愈來愈多，然後不久就會掛點。果不其然，&lt;a href="http://www.plurk.com/p/2h783d" target="_blank"&gt;第三條&lt;/a&gt;[p]、&lt;a href="http://www.plurk.com/p/2km8k9" target="_blank"&gt;第四條&lt;/a&gt;[p]、&lt;a href="http://www.plurk.com/p/35dyp6" target="_blank"&gt;第五條&lt;/a&gt;[p]陸續出現，還開始不定期出現消失加變色，我想這一定是傳說中稀有的隱藏版LCD--&lt;strong&gt;轉吧轉吧七彩霓虹線17&amp;quot;變色龍系列&lt;/strong&gt;!!&lt;/p&gt;  &lt;p&gt;經過一段時間磨合，螢幕線條開始穩定，固定顯示三條。AskaSu提醒我，三條槓意義非凡，這台螢幕肯定是萬中選一、全球僅有，唯一掛上尉階的LCD，從此它博得&amp;quot;&lt;a href="http://www.plurk.com/p/35yemp" target="_blank"&gt;上尉LCD&lt;/a&gt;[p]&amp;quot;的稱號。&lt;/p&gt;  &lt;p&gt;&lt;img src="http://blog.darkthread.net/photos/darkthread/images/6016/original.aspx" alt="" /&gt;&lt;/p&gt;  &lt;p&gt;雖然擁有一台掛階LCD挺酷的，但為了防止它無預警退役，我還是展開新LCD的Survey。一開始想衝1920*1080 FullHD解析度，一方面它是市場目前的主流，選擇多競爭大價格優，而超大的可使用桌面也有利於寫程式，只是有個問題--點距! &lt;/p&gt;  &lt;p&gt;點距指螢幕上點與點之間的距離。在解析度相同的前題下，用個比喻，就像一模一樣兩千字的文章，印成A4大小的點距會比縮小印成B5來得大，字看起來較大，閱讀較不費力。粗略的點距算法是 吋數 / (水平線數^2+垂直線數^2) ^ 0.5 / 2.54。[&lt;a href="http://www.pcdvd.com.tw/showthread.php?t=808123" target="_blank"&gt;參考&lt;/a&gt;]&lt;/p&gt;  &lt;p&gt;以我原來的工作機螢幕組合來說，19&amp;quot; + 17&amp;quot;，兩台都設成1280*1024解析度，而二者的點距就有段距離，以髮蒼蒼視茫茫中年人的標準，19&amp;quot;的點距(0.0294)看起來比17&amp;quot;(0.0263)舒適不少。若同樣是1920*1080 FullHD，22&amp;quot;的點距是0.0253，23&amp;quot;是0.0265，24&amp;quot;是0.0276，26&amp;quot;是0.0299，換句話說，要到我偏愛的1280*1024 19&amp;quot;點距水準，FullHD得買到26&amp;quot;才會符合，再不然至少也要24&amp;quot;。這會有兩個問題，1) 我的辦公桌硬要擠下24&amp;quot; or 26&amp;quot; + 19&amp;quot;的組合會猶如阿婆生子--很拼 2) 有點擔心24&amp;quot;/26&amp;quot;大尺寸LCD對近距離長期使用有點太大(一直從左到右轉頭，讀完長篇大論Word文件時不知會不會扭傷脖子 XD) &lt;/p&gt;  &lt;p&gt;最後我決定退而求其次選1680，尺寸也退到22&amp;quot;。有兩個選擇: 16:9 (1680*945)或16:10 (1680*1050)? 在辦公室裡鮮少會有看16:9寬螢幕電影的需求，而垂直多出105個pixel高度，足足可以放下三條狀態列，對總是擠滿各式工具小視窗的IDE開發環境來說彌足珍貴。&lt;/p&gt;  &lt;p&gt;確定22&amp;quot; 1680*1050的規格後，趁著年假逛了PCHome，發現&lt;a href="http://shopping.pchome.com.tw/?mod=store&amp;amp;func=style_show&amp;amp;SR_NO=DSAB11" target="_blank"&gt;22&amp;quot; 16:10的選擇&lt;/a&gt;並不多，不用在幾十台符合規格中猶豫不決，反而是好事一椿。篩選條件很簡單，一定要有DVI，有HDMI更好，一堆便宜的純D-Sub款式立刻出局，很快地就決定了&lt;a href="http://shopping.pchome.com.tw/?mod=item&amp;amp;func=exhibit&amp;amp;IT_NO=DSAB02-A45215205&amp;amp;SR_NO=DSAB11&amp;amp;ROWNO=1" target="_blank"&gt;Acer P224W&lt;/a&gt;(剛才發現現在標價比上週調高三百元，頓時又多了賺到的感覺，XD)，這台螢幕有24h到貨服務，順便也讓我第一次體驗到&amp;quot;敗家於無形&amp;quot;的奧義--一時意亂情迷，頭腦還來不及清醒，小黑貓就已經叼著東西在門口等您...&lt;/p&gt;  &lt;p&gt;敗了家還沒圖沒真相是不被允許的，所以:&lt;/p&gt;  &lt;p&gt;&lt;img src="http://blog.darkthread.net/photos/darkthread/images/6015/original.aspx" alt="" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;img src="http://blog.darkthread.net/photos/darkthread/images/6014/original.aspx" alt="" /&gt;&lt;/p&gt;  &lt;p&gt;講完了。&lt;/p&gt;  &lt;p&gt;什麼? 住在&lt;u&gt;開封&lt;/u&gt;的&lt;u&gt;艾凱香&lt;/u&gt;小姐Call In提問，為什麼只有這樣，根本就沒開箱? &lt;/p&gt;  &lt;p&gt;咳，請大家仔細看標題，本來就說是&amp;quot;P224W箱文&amp;quot;，並不是&amp;quot;P224W開箱文&amp;quot;，到此為止也是合情合理。&lt;/p&gt;  &lt;p&gt;使用心得還是得提一下: 經一週工作使用實測，各方面感覺良好，這是台好螢幕!&lt;/p&gt;&lt;img src="http://blog.darkthread.net/aggbug.aspx?PostID=6061" width="1" height="1"&gt;</content><author><name>Jeffrey</name><uri>http://blog.darkthread.net/members/Jeffrey.aspx</uri></author><category term="Life" scheme="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/Life/default.aspx" /></entry><entry><title>TIPS-Windows 7便利貼(自黏便箋)快速鍵</title><link rel="alternate" type="text/html" href="http://blog.darkthread.net/blogs/darkthreadtw/archive/2010/02/26/win7-sticky-notes-key.aspx" /><id>http://blog.darkthread.net/blogs/darkthreadtw/archive/2010/02/26/win7-sticky-notes-key.aspx</id><published>2010-02-26T08:21:00Z</published><updated>2010-02-26T08:21:00Z</updated><content type="html">&lt;span id="PostName"&gt;&lt;/span&gt;
&lt;p&gt;Windows 7內建了桌面便利貼軟體，或許基於商標專利或其他考慮，名字有些繞口--&lt;a href="http://windows.microsoft.com/zh-TW/windows7/products/features/sticky-notes"&gt;自黏便箋&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blog.darkthread.net/photos/darkthread/images/6051/original.aspx" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;相較於市場上其他便利貼軟體，它的功能有點陽春，介面也不怎麼順手。例如: 右鍵選單除了Copy/Paste跟換紙條底色外，找不到任何編輯文字內容的操作，也沒有工具列，一度讓我以為它只能當NotePad用。不過貼上去的內容倒是可以保留字型顏色，表示它的確支援RichText。爬了一下文，發現原來有密技! 雖然沒有按鈕工具列，但有一些快速鍵可以進行&amp;quot;簡單&amp;quot;的文字編輯操作。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Ctrl + Shift + &amp;gt; : 字型變大 
&lt;li&gt;Ctrl + Shift + &amp;lt; : 字型變小 
&lt;li&gt;Ctrl + B : 粗體 
&lt;li&gt;Ctrl + I : 斜體 
&lt;li&gt;Ctrl + T : 刪字線 
&lt;li&gt;Ctrl + U : 底線 
&lt;li&gt;Ctrl + Shift + L : 按一次項目符號(Bulleted) 
&lt;li&gt;Ctrl + Shift + L : 按兩次自動編號(Numbered) 
&lt;li&gt;Ctrl + L : 靠左對齊 
&lt;li&gt;Ctrl + C : 靠中對齊 
&lt;li&gt;Ctrl + R : 靠右對齊&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;很可惜，想改字型跟顏色，還是門都沒有。&lt;/p&gt;
&lt;p&gt;如果不介意它的功能過於陽春、介面過於簡陋，Windows 7 User倒可試試這個不用安裝的內建便利貼。不過，我個人把它定位成免費奉送的小菜，針對這類需求，微軟真正的大餐是--&lt;a href="http://zh.wikipedia.org/zh-tw/Microsoft_OneNote"&gt;OneNote&lt;/a&gt;(OneNote是Office 2003/2007的家族成員之一，不過好像知名度並不高)，操作順手、功能華麗，用過的人評價都蠻高的，有興趣的人可以試試。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;font color="#ff8000"&gt;【不小心找到的其他技巧】&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.groovypost.com/howto/geek-stuff/effectively-use-windows-7-sticky-notes/"&gt;便利貼&lt;a href="http://www.groovypost.com/howto/geek-stuff/effectively-use-windows-7-sticky-notes/"&gt;過&lt;/a&gt;多時的快速排序法&lt;/li&gt;&lt;/ul&gt;&lt;img src="http://blog.darkthread.net/aggbug.aspx?PostID=6052" width="1" height="1"&gt;</content><author><name>Jeffrey</name><uri>http://blog.darkthread.net/members/Jeffrey.aspx</uri></author><category term="Tips" scheme="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/Tips/default.aspx" /></entry><entry><title>POC-以jQuery實作會議室登記狀況顯示</title><link rel="alternate" type="text/html" href="http://blog.darkthread.net/blogs/darkthreadtw/archive/2010/02/25/jquery-booking-timeline.aspx" /><id>http://blog.darkthread.net/blogs/darkthreadtw/archive/2010/02/25/jquery-booking-timeline.aspx</id><published>2010-02-25T07:56:00Z</published><updated>2010-02-25T07:56:00Z</updated><content type="html">&lt;span id="PostName"&gt;&lt;/span&gt; &lt;p&gt;&lt;img src="http://blog.darkthread.net/photos/darkthread/images/6044/500x375.aspx" class="PopBoxImageSmall" alt="" /&gt;&lt;/p&gt; &lt;p&gt;專案有個需求，要在網頁上呈現多間會議室一天的使用登記狀況。&amp;#39;傳統思維&amp;quot;可能會傾向用Table &amp;lt;td&amp;gt;模擬出時段區塊，然後將預約起迄時間範圍內的&amp;lt;td&amp;gt;用colspan併成一塊。不過如果要做到登記時間以10分鐘為單位，意味著每個小時要切割成6個&amp;lt;td&amp;gt;，即便沒有任何預約也是，讓Table充滿一堆無用又囉嗦的廢物Tag。加上計算哪幾個&amp;lt;td&amp;gt;要併在一起，得找出第一個&amp;lt;td&amp;gt;加colspan，並將後面&amp;lt;td&amp;gt;省略，演算法不怎麼單純。分析起來，這就是該用CSS取代Table做法實作Layout的經典情境。&lt;/p&gt; &lt;p&gt;寫了一段jQuery程式做出POC(Proof of Concept)供同事參考，示範使用DIV+CSS達成上述效果，並並盡可能簡化為呼叫函數就可以完成。一魚兩吃，PO出來供大家參考，順便蒐集諸位先進達人們的回饋指教。&lt;/p&gt; &lt;div class="BlogCodeBlock"&gt; &lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;//輸入起/迄整點、寬、高及是否顯示時間標題列，傳回顯示全日時段狀態的&amp;lt;div&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;function&lt;/span&gt; genTimeline(startHour, endHour, width, height, incHeader) {&lt;/pre&gt;&lt;pre class="alt"&gt;    $.Darkthread.tools.addDefaultStyles(&lt;span class="str"&gt;&amp;quot;.dttl_BookingBlock&amp;quot;&lt;/span&gt;, {&lt;/pre&gt;&lt;pre&gt;        &lt;span class="str"&gt;&amp;quot;.dttl_BookingBlock&amp;quot;&lt;/span&gt;: {&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;float&lt;/span&gt;: &lt;span class="str"&gt;&amp;quot;left&amp;quot;&lt;/span&gt;, position: &lt;span class="str"&gt;&amp;quot;absolute&amp;quot;&lt;/span&gt;,&lt;/pre&gt;&lt;pre&gt;            margin: &lt;span class="str"&gt;&amp;quot;0px&amp;quot;&lt;/span&gt;, padding: &lt;span class="str"&gt;&amp;quot;0px&amp;quot;&lt;/span&gt;, height: &lt;span class="str"&gt;&amp;quot;100%&amp;quot;&lt;/span&gt;,&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="str"&gt;&amp;quot;font-size&amp;quot;&lt;/span&gt;: &lt;span class="str"&gt;&amp;quot;9pt&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;background-color&amp;quot;&lt;/span&gt;: &lt;span class="str"&gt;&amp;quot;#dddddd&amp;quot;&lt;/span&gt;,&lt;/pre&gt;&lt;pre&gt;            &lt;span class="str"&gt;&amp;quot;border-left&amp;quot;&lt;/span&gt;: &lt;span class="str"&gt;&amp;quot;solid #444444 1px&amp;quot;&lt;/span&gt;,&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="str"&gt;&amp;quot;border-right&amp;quot;&lt;/span&gt;: &lt;span class="str"&gt;&amp;quot;solid #444444 1px&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        },&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="str"&gt;&amp;quot;.dttl_Timeline&amp;quot;&lt;/span&gt;: {&lt;/pre&gt;&lt;pre&gt;            border: &lt;span class="str"&gt;&amp;quot;solid black 1px&amp;quot;&lt;/span&gt;, position: &lt;span class="str"&gt;&amp;quot;relative&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        },&lt;/pre&gt;&lt;pre&gt;        &lt;span class="str"&gt;&amp;quot;.dttl_TimelineHeader&amp;quot;&lt;/span&gt;: {&lt;/pre&gt;&lt;pre class="alt"&gt;            border: &lt;span class="str"&gt;&amp;quot;solid black 1px&amp;quot;&lt;/span&gt;,&lt;/pre&gt;&lt;pre&gt;            backgroundColor: &lt;span class="str"&gt;&amp;quot;#dddddd&amp;quot;&lt;/span&gt;,&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="str"&gt;&amp;quot;font-size&amp;quot;&lt;/span&gt;: &lt;span class="str"&gt;&amp;quot;8pt&amp;quot;&lt;/span&gt;, position: &lt;span class="str"&gt;&amp;quot;relative&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        },&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="str"&gt;&amp;quot;.dttl_SplitLine&amp;quot;&lt;/span&gt;: {&lt;/pre&gt;&lt;pre&gt;            &lt;span class="kwrd"&gt;float&lt;/span&gt;: &lt;span class="str"&gt;&amp;quot;left&amp;quot;&lt;/span&gt;, position: &lt;span class="str"&gt;&amp;quot;absolute&amp;quot;&lt;/span&gt;,&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="str"&gt;&amp;quot;border-left&amp;quot;&lt;/span&gt;: &lt;span class="str"&gt;&amp;quot;solid gray 1px&amp;quot;&lt;/span&gt;, &lt;/pre&gt;&lt;pre&gt;            width: &lt;span class="str"&gt;&amp;quot;1px&amp;quot;&lt;/span&gt;, height: &lt;span class="str"&gt;&amp;quot;100%&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        }&lt;/pre&gt;&lt;pre&gt;    });&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;var&lt;/span&gt; $tl = $(&lt;span class="str"&gt;&amp;quot;&amp;lt;div class=&amp;#39;dttl_Timeline&amp;#39; /&amp;gt;&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre class="alt"&gt;    $tl.height(height).width(width);&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;var&lt;/span&gt; hourWidth = width / (endHour - startHour);&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;var&lt;/span&gt; $h = $(&lt;span class="str"&gt;&amp;quot;&amp;lt;div /&amp;gt;&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt; (incHeader)&lt;/pre&gt;&lt;pre class="alt"&gt;        $h.width(width).height(15).addClass(&lt;span class="str"&gt;&amp;quot;dttl_TimelineHeader&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;var&lt;/span&gt; i = startHour; i &amp;lt; endHour; i++) {&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;var&lt;/span&gt; vLine =&lt;/pre&gt;&lt;pre&gt;            &lt;span class="str"&gt;&amp;quot;&amp;lt;div class=&amp;#39;dttl_SplitLine&amp;#39; style=&amp;#39;left:&amp;quot;&lt;/span&gt; +&lt;/pre&gt;&lt;pre class="alt"&gt;            hourWidth * (i - startHour) + &lt;span class="str"&gt;&amp;quot;px;&amp;#39; /&amp;gt;&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;        $tl.append(vLine);&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (incHeader)&lt;/pre&gt;&lt;pre&gt;            $h.append(&lt;span class="str"&gt;&amp;quot;&amp;lt;div&amp;gt;&amp;quot;&lt;/span&gt; + i + &lt;span class="str"&gt;&amp;quot;&amp;lt;/div&amp;gt;&amp;quot;&lt;/span&gt;).append(vLine);&lt;/pre&gt;&lt;pre class="alt"&gt;    }&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt; (incHeader) {&lt;/pre&gt;&lt;pre class="alt"&gt;        $h.find(&lt;span class="str"&gt;&amp;quot;div&amp;quot;&lt;/span&gt;).css({&lt;/pre&gt;&lt;pre&gt;            &lt;span class="kwrd"&gt;float&lt;/span&gt;: &lt;span class="str"&gt;&amp;quot;left&amp;quot;&lt;/span&gt;, margin: &lt;span class="str"&gt;&amp;quot;0px&amp;quot;&lt;/span&gt;, width: hourWidth + &lt;span class="str"&gt;&amp;quot;px&amp;quot;&lt;/span&gt;, &lt;/pre&gt;&lt;pre class="alt"&gt;            textAlign: &lt;span class="str"&gt;&amp;quot;center&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        });&lt;/pre&gt;&lt;pre class="alt"&gt;    }&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;var&lt;/span&gt; $container = $(&lt;span class="str"&gt;&amp;quot;&amp;lt;div class=&amp;#39;dttl_Container&amp;#39; /&amp;gt;&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre class="alt"&gt;    $container.append($h).append($tl)&lt;/pre&gt;&lt;pre&gt;    .data(&lt;span class="str"&gt;&amp;quot;hourWidth&amp;quot;&lt;/span&gt;, hourWidth)&lt;/pre&gt;&lt;pre class="alt"&gt;    .data(&lt;span class="str"&gt;&amp;quot;startHour&amp;quot;&lt;/span&gt;, startHour)&lt;/pre&gt;&lt;pre&gt;    .data(&lt;span class="str"&gt;&amp;quot;endHour&amp;quot;&lt;/span&gt;, endHour);&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; $container;&lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;//display會直接顯示在方格中，可支援HTML語法&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;//detail以title=&amp;quot;...&amp;quot;方式處理，請給純文字&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;//cssOption可為css屬性物件，例如: { border:&amp;quot;...&amp;quot;, color:&amp;quot;...&amp;quot; }或是className&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;//會傳回&amp;lt;div&amp;gt; jQuery物件供後續應用&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;function&lt;/span&gt; addBooking(timeline, startTime, endTime, display, detail, cssOption) {&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt; (cssOption == undefined || &lt;span class="kwrd"&gt;typeof&lt;/span&gt; cssOption == &lt;span class="str"&gt;&amp;quot;string&amp;quot;&lt;/span&gt;) &lt;/pre&gt;&lt;pre class="alt"&gt;        cssOption = { };&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;var&lt;/span&gt; $tl = $(timeline);&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;var&lt;/span&gt; sh = $tl.data(&lt;span class="str"&gt;&amp;quot;startHour&amp;quot;&lt;/span&gt;), eh = $tl.data(&lt;span class="str"&gt;&amp;quot;endHour&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="rem"&gt;//將時間先轉成小數&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;var&lt;/span&gt; p = startTime.split(&lt;span class="str"&gt;&amp;#39;:&amp;#39;&lt;/span&gt;);&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;var&lt;/span&gt; st = parseInt(p[0]) + (parseFloat(p[1]) / 60);&lt;/pre&gt;&lt;pre&gt;    &lt;span class="rem"&gt;//小於startHour, 以startHour為準&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt; (st &amp;lt; sh) st = sh;&lt;/pre&gt;&lt;pre&gt;    &lt;/pre&gt;&lt;pre class="alt"&gt;    p = endTime.split(&lt;span class="str"&gt;&amp;#39;:&amp;#39;&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;var&lt;/span&gt; et = parseInt(p[0]) + (parseFloat(p[1]) / 60);&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="rem"&gt;//大於endHour, 以endHour為準&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt; (et &amp;gt; eh) et = eh;&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="rem"&gt;//算出起始位置及寬度&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;var&lt;/span&gt; hw = $tl.data(&lt;span class="str"&gt;&amp;quot;hourWidth&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;var&lt;/span&gt; w = (et - st) * hw;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;var&lt;/span&gt; x = (st - sh) * hw;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="rem"&gt;//加入顯示元素&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;var&lt;/span&gt; $container = $tl.children(&lt;span class="str"&gt;&amp;quot;div:last&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;var&lt;/span&gt; $dv = $(&lt;span class="str"&gt;&amp;quot;&amp;lt;div class=\&amp;quot;dttl_BookingBlock\&amp;quot;/&amp;gt;&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre class="alt"&gt;    $dv.css(cssOption).css({ &lt;/pre&gt;&lt;pre&gt;        left: x + &lt;span class="str"&gt;&amp;quot;px&amp;quot;&lt;/span&gt;, width: w + &lt;span class="str"&gt;&amp;quot;px&amp;quot;&lt;/span&gt;,&lt;/pre&gt;&lt;pre class="alt"&gt;        opacity: 0.7&lt;/pre&gt;&lt;pre&gt;    });&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;    $dv.html(&lt;span class="str"&gt;&amp;quot;&amp;lt;span style=&amp;#39;padding: 2px;&amp;#39;&amp;gt;&amp;quot;&lt;/span&gt; + display + &lt;span class="str"&gt;&amp;quot;&amp;lt;/span&amp;gt;&amp;quot;&lt;/span&gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;    .attr(&lt;span class="str"&gt;&amp;quot;title&amp;quot;&lt;/span&gt;, startTime + &lt;span class="str"&gt;&amp;quot;-&amp;quot;&lt;/span&gt; + endTime + &lt;span class="str"&gt;&amp;quot;\n&amp;quot;&lt;/span&gt; + detail);&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;typeof&lt;/span&gt; cssOption == &lt;span class="str"&gt;&amp;quot;string&amp;quot;&lt;/span&gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;        $dv.addClass(cssOption);&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;    $container.append($dv);&lt;/pre&gt;&lt;pre&gt;    &lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; $dv;&lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;以下是應用範例：&lt;/p&gt;
&lt;div class="BlogCodeBlock"&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt; &lt;span class="attr"&gt;src&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;jquery-1.4.2.js&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;text/javascript&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&amp;lt;script src=&lt;span class="str"&gt;&amp;quot;jquery.darkthread.tools.js&amp;quot;&lt;/span&gt; type=&lt;span class="str"&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;lt;script src=&lt;span class="str"&gt;&amp;quot;TimelineUtil.js&amp;quot;&lt;/span&gt; type=&lt;span class="str"&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;&lt;pre&gt;&amp;lt;script type=&lt;span class="str"&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt;&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    $(&lt;span class="kwrd"&gt;function&lt;/span&gt;() {&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;var&lt;/span&gt; $d = genTimeline(9, 21, 800, 30, &lt;span class="kwrd"&gt;true&lt;/span&gt;);&lt;/pre&gt;&lt;pre class="alt"&gt;        $(&lt;span class="str"&gt;&amp;quot;body&amp;quot;&lt;/span&gt;).append($d);&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;var&lt;/span&gt; $booking;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="rem"&gt;//truncText可幫忙取前10個字            &lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;var&lt;/span&gt; longText = &lt;span class="str"&gt;&amp;quot;超長文字測試，利用truncDetail()取前10個字元&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;        $booking = addBooking($d, &lt;span class="str"&gt;&amp;quot;14:30&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;17:00&amp;quot;&lt;/span&gt;,&lt;/pre&gt;&lt;pre class="alt"&gt;            $.Darkthread.tools.truncText(longText, 10), longText);&lt;/pre&gt;&lt;pre&gt;        &lt;span class="rem"&gt;//允許重疊顯示&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        $booking = addBooking($d, &lt;span class="str"&gt;&amp;quot;16:30&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;20:00&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;來亂的&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;咬我呀!&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;&amp;nbsp; &lt;span class="rem"&gt;//cssOption可指定CSS&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;var&lt;/span&gt; cssOption = { backgroundColor: &lt;span class="str"&gt;&amp;quot;green&amp;quot;&lt;/span&gt;, color: &lt;span class="str"&gt;&amp;quot;yellow&amp;quot;&lt;/span&gt; };&lt;/pre&gt;&lt;pre&gt;        $booking = addBooking($d, &lt;span class="str"&gt;&amp;quot;09:30&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;10:00&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;Jeffrey&amp;quot;&lt;/span&gt;, &lt;/pre&gt;&lt;pre class="alt"&gt;                              &lt;span class="str"&gt;&amp;quot;重要會議&amp;quot;&lt;/span&gt;, cssOption);&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="rem"&gt;//cssOption傳入字串時，視為className&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        $booking = addBooking($d, &lt;span class="str"&gt;&amp;quot;10:30&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;12:00&amp;quot;&lt;/span&gt;, &lt;/pre&gt;&lt;pre class="alt"&gt;                                &lt;span class="str"&gt;&amp;quot;Meeting&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;MouseOver特效&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;booking&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;        &lt;span class="rem"&gt;//addBooking會傳回&amp;lt;div&amp;gt;的jQuery物件，可進行加上hover/click事件等操作&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        $booking.hover(&lt;span class="kwrd"&gt;function&lt;/span&gt;() {&lt;/pre&gt;&lt;pre&gt;            $(&lt;span class="kwrd"&gt;this&lt;/span&gt;).addClass(&lt;span class="str"&gt;&amp;quot;inverse&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre class="alt"&gt;        }, &lt;span class="kwrd"&gt;function&lt;/span&gt;() {&lt;/pre&gt;&lt;pre&gt;            $(&lt;span class="kwrd"&gt;this&lt;/span&gt;).removeClass(&lt;span class="str"&gt;&amp;quot;inverse&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre class="alt"&gt;        }).css(&lt;span class="str"&gt;&amp;quot;cursor&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;pointer&amp;quot;&lt;/span&gt;).click(&lt;span class="kwrd"&gt;function&lt;/span&gt;() {&lt;/pre&gt;&lt;pre&gt;            alert(&lt;span class="str"&gt;&amp;quot;Hi!&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre class="alt"&gt;        });&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="rem"&gt;//產生100條時間軸各有12筆登錄，測試速度&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;var&lt;/span&gt; $tbl = $(&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="str"&gt;&amp;quot;&amp;lt;table cellspacing=&amp;#39;0&amp;#39; cellpadding=&amp;#39;0&amp;#39; style=&amp;#39;margin-top: 10px;&amp;#39; /&amp;gt;&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;var&lt;/span&gt; i = 0; i &amp;lt; 100; i++) {&lt;/pre&gt;&lt;pre class="alt"&gt;            $tr = $(&lt;span class="str"&gt;&amp;quot;&amp;lt;tr&amp;gt;&amp;lt;td width=&amp;#39;10%&amp;#39; /&amp;gt;&amp;lt;td width=&amp;#39;90%&amp;#39; /&amp;gt;&amp;lt;/tr&amp;gt;&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;            $tr.find(&lt;span class="str"&gt;&amp;quot;td:first&amp;quot;&lt;/span&gt;).text(&lt;span class="str"&gt;&amp;quot;Room&amp;quot;&lt;/span&gt; + i);&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;var&lt;/span&gt; $timeline = genTimeline(9, 21, 800, 30, i == 0);&lt;/pre&gt;&lt;pre&gt;            $tr.find(&lt;span class="str"&gt;&amp;quot;td:last&amp;quot;&lt;/span&gt;).append($timeline);&lt;/pre&gt;&lt;pre class="alt"&gt;            $tbl.append($tr);&lt;/pre&gt;&lt;pre&gt;            &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;var&lt;/span&gt; j = 9; j &amp;lt; 21; j++) {&lt;/pre&gt;&lt;pre class="alt"&gt;                $booking = addBooking($timeline, j + &lt;span class="str"&gt;&amp;quot;:00&amp;quot;&lt;/span&gt;, j + &lt;span class="str"&gt;&amp;quot;:30&amp;quot;&lt;/span&gt;, &lt;/pre&gt;&lt;pre&gt;                    &lt;span class="str"&gt;&amp;quot;Test-&amp;quot;&lt;/span&gt; + i + &lt;span class="str"&gt;&amp;quot;-&amp;quot;&lt;/span&gt; + j, &lt;span class="str"&gt;&amp;quot;Test&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre class="alt"&gt;            }&lt;/pre&gt;&lt;pre&gt;        }&lt;/pre&gt;&lt;pre class="alt"&gt;        $(&lt;span class="str"&gt;&amp;quot;body&amp;quot;&lt;/span&gt;).append($tbl);&lt;/pre&gt;&lt;pre&gt;    });&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;style&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;text/css&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    .booking&lt;/pre&gt;&lt;pre&gt;    {&lt;/pre&gt;&lt;pre class="alt"&gt;        background-color: Green;&lt;/pre&gt;&lt;pre&gt;        color: Yellow;&lt;/pre&gt;&lt;pre class="alt"&gt;    }&lt;/pre&gt;&lt;pre&gt;    div.inverse &lt;/pre&gt;&lt;pre class="alt"&gt;    {&lt;/pre&gt;&lt;pre&gt;        background-color: black;&lt;/pre&gt;&lt;pre class="alt"&gt;        color: White;&lt;/pre&gt;&lt;pre&gt;    }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;style&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;【註】只是POC，防呆、檢核及彈性都很薄弱，不足處請自理!&lt;/p&gt;&lt;img src="http://blog.darkthread.net/aggbug.aspx?PostID=6045" width="1" height="1"&gt;</content><author><name>Jeffrey</name><uri>http://blog.darkthread.net/members/Jeffrey.aspx</uri></author><category term="jQuery" scheme="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/jQuery/default.aspx" /><category term="CODE" scheme="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/CODE/default.aspx" /></entry><entry><title>黑暗jQuery工具包1-動態加入預設Style設定</title><link rel="alternate" type="text/html" href="http://blog.darkthread.net/blogs/darkthreadtw/archive/2010/02/25/jquery-tools-addstyles.aspx" /><id>http://blog.darkthread.net/blogs/darkthreadtw/archive/2010/02/25/jquery-tools-addstyles.aspx</id><published>2010-02-25T06:06:10Z</published><updated>2010-02-25T06:06:10Z</updated><content type="html">&lt;span id="PostName"&gt;&lt;/span&gt; &lt;p&gt;對我來說，Javascript在處理CSS上一直有一個小困擾...&lt;/p&gt; &lt;p&gt;一般在習慣上，為了方便開發人員修改，多半會將Style設定獨立放在.css檔案裡，應用者可視需要覆寫或修改之。但有蠻多時候，應用者根本不打算更動CSS內容，只想直接沿用預設CSS設定，但部署時還是少不了要Copy相對應的.css檔案，網頁也必須多加上&amp;lt;style src=&amp;quot;...&amp;quot;&amp;gt;宣告。&lt;/p&gt; &lt;p&gt;我總覺得，最理想的方式是將預設css與js融和在一個檔案裡。當開發者想自行定義CSS樣式，可將其寫在.css中加以引用，或在HTML中以&amp;lt;style&amp;gt;逕行宣告；若只想用預設內容，則只需參照.js就大功告成。&lt;/p&gt; &lt;p&gt;今天遇到類似需求，索性寫了幾個小函數，試著實現上述想法。&lt;/p&gt; &lt;p&gt;我的設計概念是這樣的: 先透過document.styleSheets.cssRules比對某個CSS Selector(例如: div.cCountryPicker)，若已被定義過，表示網頁已透過參照.css檔或直接宣告&amp;lt;style type=&amp;quot;text/css&amp;quot;&amp;gt;方式定義了div.cCounterPicker，此時就不需加入預設的div.cCountryPicker樣式規則；反之，若沒有定義該規則，則透過$(&amp;quot;head&amp;quot;).append(&amp;quot;&amp;lt;style type=\&amp;quot;text/css\&amp;quot;&amp;gt;....&amp;quot;)的方式加入Style宣告。&lt;/p&gt; &lt;p&gt;程式碼如下: &lt;br /&gt;(PS: 我規劃用jQuery.Darkthread.*蒐集我陸續開發出來的工具函數，最前面的$.extend用來將多個.js中宣告的jQuery.Darkthread.*函數彙整在一起)&lt;/p&gt; &lt;div class="BlogCodeBlock"&gt; &lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;/*&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;** Darkthread&amp;#39;s Tools for jQuery ver 1.0 **&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;by Jeffrey, 2010-02-25, http://blog.darkthread.net&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;=======================================================&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;checkStyle: to check if specific style selector is defined&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;addStyles: add &amp;lt;style type=&amp;quot;text/css&amp;quot;&amp;gt; dynamically&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;addDefaultStyles: if specific style selector isn&amp;#39;t defined, add style setting&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;*/&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;jQuery.extend(jQuery, { Darkthread: {} });&lt;/pre&gt;&lt;pre class="alt"&gt;jQuery.extend(jQuery.Darkthread, {&lt;/pre&gt;&lt;pre&gt;    tools: {&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="rem"&gt;//ruleSelector sample: a:hover, .myClass, #someId&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        checkStyle:&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;function&lt;/span&gt;(ruleSelector) {&lt;/pre&gt;&lt;pre&gt;            &lt;span class="rem"&gt;//REF: http://www.javascriptkit.com/dhtmltutors/externalcss3.shtml&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;var&lt;/span&gt; cssCol = document.styleSheets;&lt;/pre&gt;&lt;pre&gt;            ruleSelector = ruleSelector.toLowerCase();&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;var&lt;/span&gt; i = 0; i &amp;lt; cssCol.length; i++) {&lt;/pre&gt;&lt;pre&gt;                &lt;span class="kwrd"&gt;var&lt;/span&gt; rules = cssCol[i].cssRules || cssCol[i].rules;&lt;/pre&gt;&lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;for&lt;/span&gt; (j = 0; j &amp;lt; rules.length; j++)&lt;/pre&gt;&lt;pre&gt;                    &lt;span class="kwrd"&gt;if&lt;/span&gt; (rules[j].selectorText.toLowerCase() == ruleSelector)&lt;/pre&gt;&lt;pre class="alt"&gt;                    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;            }&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;        },&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="rem"&gt;/*styleDictionary sample:&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;        { &lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;        &amp;quot;a:hover&amp;quot;: { &amp;quot;background-color&amp;quot;: &amp;quot;red&amp;quot;, &amp;quot;color&amp;quot;:&amp;quot;yellow&amp;quot; },&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;        &amp;quot;#dvTest&amp;quot;: { &amp;quot;border&amp;quot;, &amp;quot;solid blue 1px&amp;quot; }&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;        }&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;        Note: it&amp;#39;s for &amp;lt;style&amp;gt; declaration, not for jQuery.css, so don&amp;#39;t use &lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;        backgourndColor instead of &amp;quot;background-color&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="rem"&gt;        */&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        addStyles:&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;function&lt;/span&gt;(styleDictionary) {&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;var&lt;/span&gt; sb = [];&lt;/pre&gt;&lt;pre&gt;            &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;var&lt;/span&gt; selector &lt;span class="kwrd"&gt;in&lt;/span&gt; styleDictionary) {&lt;/pre&gt;&lt;pre class="alt"&gt;                sb.push(selector + &lt;span class="str"&gt;&amp;quot; {&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;                &lt;span class="kwrd"&gt;var&lt;/span&gt; props = styleDictionary[selector];&lt;/pre&gt;&lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;var&lt;/span&gt; p &lt;span class="kwrd"&gt;in&lt;/span&gt; props) {&lt;/pre&gt;&lt;pre&gt;                    sb.push(p + &lt;span class="str"&gt;&amp;quot;:&amp;quot;&lt;/span&gt; + props[p] + &lt;span class="str"&gt;&amp;quot;;&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre class="alt"&gt;                }&lt;/pre&gt;&lt;pre&gt;                sb.push(&lt;span class="str"&gt;&amp;quot;}&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre class="alt"&gt;            }&lt;/pre&gt;&lt;pre&gt;            $(&lt;span class="str"&gt;&amp;quot;head&amp;quot;&lt;/span&gt;).append(&lt;span class="str"&gt;&amp;quot;&amp;lt;style type=\&amp;quot;text/css\&amp;quot;&amp;gt;\n&amp;quot;&lt;/span&gt; +&lt;/pre&gt;&lt;pre class="alt"&gt;                sb.join(&lt;span class="str"&gt;&amp;quot;\n&amp;quot;&lt;/span&gt;) + &lt;span class="str"&gt;&amp;quot;\n&amp;lt;/style&amp;gt;&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;        },&lt;/pre&gt;&lt;pre class="alt"&gt;        addDefaultStyles:&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;function&lt;/span&gt;(ruleSelector, styleDictionary) {&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (!$.Darkthread.tools.checkStyle(ruleSelector))&lt;/pre&gt;&lt;pre&gt;                $.Darkthread.tools.addStyles(styleDictionary);&lt;/pre&gt;&lt;pre class="alt"&gt;        }&lt;/pre&gt;&lt;pre&gt;    }&lt;/pre&gt;&lt;pre class="alt"&gt;});&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;應用方式挺簡單的，將以下的程式寫進.js，等於將預設的.css一起藏進.js裡，就不必再多搞出一個預設用途的.css檔案囉!&lt;/p&gt;
&lt;div class="BlogCodeBlock"&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;    $.Darkthread.tools.addDefaultStyles(&lt;span class="str"&gt;&amp;quot;.dttl_BookingBlock&amp;quot;&lt;/span&gt;, {&lt;/pre&gt;&lt;pre&gt;        &lt;span class="str"&gt;&amp;quot;.dttl_BookingBlock&amp;quot;&lt;/span&gt;: {&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;float&lt;/span&gt;: &lt;span class="str"&gt;&amp;quot;left&amp;quot;&lt;/span&gt;, position: &lt;span class="str"&gt;&amp;quot;absolute&amp;quot;&lt;/span&gt;,&lt;/pre&gt;&lt;pre&gt;            margin: &lt;span class="str"&gt;&amp;quot;0px&amp;quot;&lt;/span&gt;, padding: &lt;span class="str"&gt;&amp;quot;0px&amp;quot;&lt;/span&gt;, height: &lt;span class="str"&gt;&amp;quot;100%&amp;quot;&lt;/span&gt;,&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="str"&gt;&amp;quot;font-size&amp;quot;&lt;/span&gt;: &lt;span class="str"&gt;&amp;quot;9pt&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;background-color&amp;quot;&lt;/span&gt;: &lt;span class="str"&gt;&amp;quot;#dddddd&amp;quot;&lt;/span&gt;,&lt;/pre&gt;&lt;pre&gt;            &lt;span class="str"&gt;&amp;quot;border-left&amp;quot;&lt;/span&gt;: &lt;span class="str"&gt;&amp;quot;solid #444444 1px&amp;quot;&lt;/span&gt;,&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="str"&gt;&amp;quot;border-right&amp;quot;&lt;/span&gt;: &lt;span class="str"&gt;&amp;quot;solid #444444 1px&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        },&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="str"&gt;&amp;quot;.ddtl_Timeline&amp;quot;&lt;/span&gt;: { border: &lt;span class="str"&gt;&amp;quot;solid red 1px&amp;quot;&lt;/span&gt; }&lt;/pre&gt;&lt;pre&gt;    });&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;(以上的程式碼，會在網頁本身沒有宣告.dttl_BookingBlock且所有參照的.css中也沒有該宣告時，加入.dttl_BookingBlock及.dttl_Timeline兩條CSS規則，賦與預設Style設定。)&lt;/p&gt;&lt;img src="http://blog.darkthread.net/aggbug.aspx?PostID=6043" width="1" height="1"&gt;</content><author><name>Jeffrey</name><uri>http://blog.darkthread.net/members/Jeffrey.aspx</uri></author><category term="jQuery" scheme="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/jQuery/default.aspx" /><category term="CODE" scheme="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/CODE/default.aspx" /></entry><entry><title>Outlook 2007無法預覽PDF附件</title><link rel="alternate" type="text/html" href="http://blog.darkthread.net/blogs/darkthreadtw/archive/2010/02/23/pdf-preview-error-on-x64.aspx" /><id>http://blog.darkthread.net/blogs/darkthreadtw/archive/2010/02/23/pdf-preview-error-on-x64.aspx</id><published>2010-02-23T03:14:51Z</published><updated>2010-02-23T03:14:51Z</updated><content type="html">&lt;span id="PostName"&gt;&lt;/span&gt; &lt;p&gt;Outlook 2007在x64平台上無法預覽信件的PDF附件檔，會出現:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font color="#ff8040"&gt;無法預覽此檔案，因為下列預覽器發生錯誤:&lt;br /&gt;PDF Preview Handler for Vista&lt;br /&gt;若要在本身所屬的程式中開啟此檔案，請按兩下檔案。&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;找到&lt;a href="http://www.pretentiousname.com/adobe_pdf_x64_fix/"&gt;這篇文章&lt;/a&gt;，才知道這是Adobe PDF Preview Handler的Bug，網友們已經&lt;a href="http://forums.adobe.com/thread/303008"&gt;抱怨了兩年多&lt;/a&gt;，Adobe還是沒處理，於是該文章的作者就自力救濟寫出修補程式，修改Registry裡錯誤的AppID後，PDF預覽器馬上就可以使用囉~~&lt;/p&gt; &lt;p&gt;PS: 另外，該Fix還做了一個&amp;quot;32/64-bit thumbnail bridge&amp;quot;，一併修正了x64下檔案總管檢視時無法產生PDF內容縮圖的問題(Adobe沒出x64版的縮圖產生器)，真神人也!&lt;/p&gt;&lt;img src="http://blog.darkthread.net/aggbug.aspx?PostID=6034" width="1" height="1"&gt;</content><author><name>Jeffrey</name><uri>http://blog.darkthread.net/members/Jeffrey.aspx</uri></author><category term="Trouble-Shooting" scheme="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/Trouble-Shooting/default.aspx" /></entry><entry><title>升級Win2008R2後Hyper-V VM無法啟動</title><link rel="alternate" type="text/html" href="http://blog.darkthread.net/blogs/darkthreadtw/archive/2010/02/22/hyperv-vm-failure-after-r2.aspx" /><id>http://blog.darkthread.net/blogs/darkthreadtw/archive/2010/02/22/hyperv-vm-failure-after-r2.aspx</id><published>2010-02-22T00:27:34Z</published><updated>2010-02-22T00:27:34Z</updated><content type="html">&lt;span id="PostName"&gt;&lt;/span&gt; &lt;p&gt;年前將作業系統由Windows 2008&lt;a href="http://blog.darkthread.net/blogs/darkthreadtw/archive/2010/02/11/win2008r2.aspx"&gt;升級到Windows 2008 R2&lt;/a&gt;，已有年後要&amp;quot;打地鼠&amp;quot;的心理準備(每日一詞: 【打地鼠】意指針對疑難雜症或系統問題，採取見一個解一個，遇到再說的鄉愿策略)，而今天打了第一隻地鼠...&lt;/p&gt; &lt;p&gt;啟動Hyper-V VM時出現以Microsoft Emulated IDE Controller: Failed to Power on with Error &amp;#39;The system cannot find the file specified.&amp;#39;錯誤，導致VM無法開機。&lt;/p&gt; &lt;p&gt;&lt;img src="http://blog.darkthread.net/photos/darkthread/images/6022/original.aspx" alt="" /&gt;&lt;/p&gt; &lt;p&gt;本以為會很棘手，幸好在檢視VM設定時很快就發現可疑之處: Physical CD/DVD drive:選單出現Drive &amp;#39;Not found&amp;#39;，而下拉選單中另有一筆Drive &amp;#39;D:&amp;#39;應該才是正確的選項。&lt;/p&gt; &lt;p&gt;&lt;img src="http://blog.darkthread.net/photos/darkthread/images/6023/original.aspx" alt="" /&gt;&lt;/p&gt; &lt;p&gt;重設為Driver &amp;#39;D:&amp;#39;後，VM即可順利啟動，而之後再開啟VM Setting，Driver &amp;#39;Not found&amp;#39;選項也消失了，我的推測是升級R2後，DVD光碟機被賦與了新識別碼，而VM設定仍指向舊識別碼，導致上述問題，理論上重新設過就可解決囉。&lt;/p&gt;&lt;img src="http://blog.darkthread.net/aggbug.aspx?PostID=6024" width="1" height="1"&gt;</content><author><name>Jeffrey</name><uri>http://blog.darkthread.net/members/Jeffrey.aspx</uri></author><category term="Trouble-Shooting" scheme="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/Trouble-Shooting/default.aspx" /><category term="Windows 2008" scheme="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/Windows+2008/default.aspx" /></entry><entry><title>【茶包射手手札】比蝸牛還慢的HD</title><link rel="alternate" type="text/html" href="http://blog.darkthread.net/blogs/darkthreadtw/archive/2010/02/21/ahci-slow-hd.aspx" /><id>http://blog.darkthread.net/blogs/darkthreadtw/archive/2010/02/21/ahci-slow-hd.aspx</id><published>2010-02-20T15:40:09Z</published><updated>2010-02-20T15:40:09Z</updated><content type="html">&lt;span id="PostName"&gt;&lt;/span&gt;  &lt;p&gt;前一代工作機&lt;a href="http://www.oc.com.tw/readvarticle.asp?id=4316"&gt;XPC SB81P&lt;/a&gt;自從退休後，輾轉流落到客廳，擔任起&amp;quot;偽家電&amp;quot;兼娛樂PC的角色。(老讀者們可能己見過，它在&lt;a href="http://blog.darkthread.net/blogs/darkthreadtw/archive/2008/11/29/lcd-tv-seminar.aspx"&gt;這篇文章&lt;/a&gt;中曾露過臉，照片左側音箱上方，巴黎鐵塔下方，我想它能二次就業多少跟黑色鏡面長相脫不了關係，沒想到俊男美女較吃香的定律在硬體界也適用)&lt;/p&gt;  &lt;p&gt;前些時候，周遭的機器接連發生某廠牌HD集體暴斃的慘劇，它也在中鏢之列，便換了顆新硬碟WD 6400AAKS，順便把OS由XP換裝成Windows 7。這台機器我裝完機後幾乎未再碰過，平日多由黑暗女王及兩位王室小成員操作使用。在換HD升OS後，陸續接獲一些抱怨: 放YouTube影片聲音會斷斷續續、某些程式執行過程會停頓一下、跑大型遊戲程式時會當機... &lt;/p&gt;  &lt;p&gt;趁著年假時間較有空，便在客廳扮演一下茶包射手，著手修理這台不乖的電腦。&lt;/p&gt;  &lt;p&gt;實測播放YouTube影片，360p順暢，到480p起就偶有斷續雜音(感覺是CPU跟不上)，720p更是慘不忍睹。有點狐疑，同一台機器，之前裝XP用得還不錯，即便機器老了點(Pentium-D 935 3.2GHz + 2G RAM) ，Windows 7對硬體要求稍高，但直覺上應該不至於連YouTube影片都跑不動。&lt;/p&gt;  &lt;p&gt;Vista/Windows 7起有所謂的&lt;a href="http://windows.microsoft.com/zh-TW/windows-vista/Get-computer-speed-and-performance-information"&gt;效能分數檢測&lt;/a&gt;，是很不錯的初步評量。執行了一次，發現頗意外的結果，這顆新HD居然只有2.7分，是所有分數中最差的。啥? 最新買的裝置居然是整台機器的罩門，太不合理了! &lt;/p&gt;  &lt;p&gt;X光照出異常，接著就該做斷層掃瞄了。找來HD專屬的測速工具--&lt;a href="http://www.hdtune.com/"&gt;HD Tune&lt;/a&gt;，診斷報告一出，我&lt;strike&gt;花容失色&lt;/strike&gt;大吃一驚!!&lt;/p&gt;  &lt;p&gt;&lt;img class="PopBoxImageSmall" src="http://blog.darkthread.net/photos/darkthread/images/6012/500x375.aspx" alt="" /&gt;&lt;/p&gt;  &lt;p&gt;嚇! 3MB/s!! 大家評評理，SATA HD都在拼100MB/s的時代，這種速度能看嗎能看嗎?&lt;/p&gt;  &lt;p&gt;&lt;img class="PopBoxImageSmall" src="http://blog.darkthread.net/photos/darkthread/images/6013/500x375.aspx" alt="" /&gt;&lt;/p&gt;  &lt;p&gt;經過一番嘗試，發現如果我把BIOS裡的On-Chip Serial ATA Setting/SATA Mode設定由AHCI調回IDE，HD速度就會改善，一舉飆上86MB/s，才是WD 6400AAKS合理的效能表現。&lt;/p&gt;  &lt;p&gt;&lt;img class="PopBoxImageSmall" src="http://blog.darkthread.net/photos/darkthread/images/6011/500x375.aspx" alt="" /&gt;&lt;/p&gt;  &lt;p&gt;為何AHCI模式會導致如此不堪的HD效能數字，噗友&lt;a href="http://www.plurk.com/iwant_neo"&gt;鐵衛在噗浪&lt;/a&gt;提供了一些&lt;a href="http://www.pcdvd.com.tw/showthread.php?t=451161"&gt;情資&lt;/a&gt;，不過似乎於我的狀況不太相同，由HD Tune資訊顯示，HD狀態為UDMA Mode 5。但回想起來，因為XP要換AHCI工程很大，所以AHCI倒真是安裝Windows 7時才調過來的，跟遇到HD效能問題的時點相當，坐實HD問題與AHCI設定有關的推論。&lt;/p&gt;  &lt;p&gt;雖然未知AHCI模式導致HD效能低落的真實原因，但畢竟這是台高壽五年的老機器，若是追到最後，問題出在BIOS卻又不可能再有Update，將情何以堪? 於是我很果斷地決定&amp;quot;面對它、接受它、處理它(調成IDE不就好了)、放下它&amp;quot;，啦啦啦啦~~~ &lt;/p&gt;  &lt;p&gt;在福虎開春之際，茶包射手就用馬馬&lt;strong&gt;&lt;font color="#ff8000"&gt;虎虎&lt;/font&gt;&lt;/strong&gt;的結案態度應景一下(喂!)，順道給大家拜個晚年囉! &lt;/p&gt;&lt;img src="http://blog.darkthread.net/aggbug.aspx?PostID=6017" width="1" height="1"&gt;</content><author><name>Jeffrey</name><uri>http://blog.darkthread.net/members/Jeffrey.aspx</uri></author><category term="Trouble-Shooting" scheme="http://blog.darkthread.net/blogs/darkthreadtw/archive/tags/Trouble-Shooting/default.aspx" /></entry></feed>