Friday, January 25, 2008 - 文章

【茶包射手專欄】超愛開新Tab的IE7

小問題一個! 換了IE7之後,我發現每次在Address Bar輸入新網址,IE7就會新增一個Tab開啟新的URL。我習慣用blah.asp?x=1, blah.aspx?x=2(x是隨便輸入且不具任何效用的參數,只是為了讓URL不完全相同)的手法來確保不會讀到Cache中的內容,在IE7上每換一次參數就生出一個新Tab,一番測試下來,就累積了數十個Tab,有點小煩... (謎之聲: 一個測試反覆跑這麼多次,看來你的程式能力也不過爾爾)

Google了一下,意外學到不少IE7 Tips,其中提到輸入URL後按Alt-Enter可以在新的Tab中開啟URL,而倒沒看到有人回報會被強迫開新Tab的困擾。只是有不少的Trouble-Shooting Tips都提及,IE有不少奇怪行常是IE Add-On引起的,所以我決定朝此方向偵辦。

講到這個,就要順道提一下IE7一個好用的新功能:

我們都知道Windows有所謂的安全模式,可以避開部分因驅動程式、應用軟體造成無法開機的情況,Add-On常是造成IE7發瘋的原因,所以IE7也有類似的"安全模式"。在"程式集/附屬應用程式/系統工具"裡有個"Internet Explorer(沒有附加元件)",可以讓IE7停用全部的Add-On再啟動。

試了一下,果然停用Add-On後,輸入新URL就不會開在新Tab中,所以現在可以確認這個行為是某個Add-On引起的。利用IE選單中的"工具/管理附加元件/啟用或停用附加元件"逐一關閉Add-On做測試,我找到了IE7Pro。再深入IE7Pro的選項,在Base Setting中看到"Open new Tab from address bar"被勾選了,宣告破案! 收隊!

KB-About Error Updating JScript Intellisense

Javascript Intellisense是吸引我改用VS2008編輯ASP.NET 2.0專案的重要原因之一,我卻被一個煩人的相關警告騷擾了好幾天。

只要一Build專案,Error List中就會出現Error updating JScript IntelliSense: MicrosoftAjax.debug.js:: 'Sys.Res.argumentDomElement' is null or not an object @ 201:8的警告訊息,發生地點在C:\WWW\MyWeb\Default.aspx,Double Click警告,會跳到Default.aspx的第一列,表面上看不出有任何關聯。

摸了好久才搞清楚是怎麼一回事,原來這與Javascript Intellisense的運作原理有關。狀況不太容易說明清楚,所以用一個簡單的實例示範,待我細細道來...

我原先寫了類似以下範例,用$addHandler掛載onclick事件的Javascript Code:

<input type="button" id="btn" value="Click Me!" />
<script type="text/javascript">
$addHandler($get("btn"), "click", btnClick);
function btnClick() {
    alert("Yo!");
}
</script>

後來,發現這段Code可以給多個網頁共用,所以很直覺地把它拆出來另存成inc.js:

$addHandler($get("btn"), "click", btnClick);
function btnClick() {
    alert("Yo!");
}

然後Default.aspx改用Inclue:

<input type="button" id="btn" value="Click Me!" />
<script type="text/javascript" src="js/inc.js"></script>

這種改法在過去ASP/ASP.NET時代玩過千百回,這次也不例外,實際執行沒發生任何差錯。只是從此以後,只要我一Build網站或企圖Debug,Error List就會跑出Error updating JScript Intellisense的警告,雖然並不影響網站運作,但一來這個警告對有潔癖的我來說頗為礙眼,二來出現這個警告後,VS2008就不會對inc.js裡的其他函數提供Javascript Intellisense功能。逼得我心不甘情不願地花了點時間反覆測試與追查,總算理出一些頭緒:

  1. 為了產生Javascript Intellisense的神奇效果,VS2008在你Coding的階段就會即時執行網頁與js檔裡的Javascript, 'Sys.Res.argumentDomElement' is null or not an object的錯誤便是VS2008呼叫$addHandler時抛出的參數無效例外。
  2. 當VS2008單獨執行inc.js裡的$get("btn"),當下沒有任何網頁DOM,想當然爾會傳回null, 接著null被當成$addHandler的第一個參數,觸發了前述的錯誤。
  3. 當VS2008無法執行、分析js,便會傳回Error updating JScript Intellisense警告,並喪失部分提示能力。

搞清楚原委,我們要進行的處理便是要確保inc.js可以被"獨立執行"而不出錯,$get("btn")的寫法必須跟網頁一起執行才有意義,單獨跑inc.js時便會出問題。因此我把$addHandler包進一個initJob()函數,再由網頁中呼叫initJob(),這樣便可確保在每次被呼叫的當下,$get("btn")都會傳回正確的物件。

所以,inc.js修改如下:

function initJob() 
{
    $addHandler($get("btn"), "click", btnClick);
}
function btnClick() {
    alert("Yo!");
}

Default.aspx則加上呼叫initJob()的Code:

<input type="button" id="btn" value="Click Me!" />
<script type="text/javascript" src="js/inc.js"></script>
<script type="text/javascript">
initJob();
</script>

搞定收工!

搜尋

Go

<January 2008>
SunMonTueWedThuFriSat
303112345
6789101112
13141516171819
20212223242526
272829303112
3456789
 
RSS
【工商服務】
最新回應

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


BlogLook Score and Rank

Syndication