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>

搞定收工!


Comments

# by

我也遇到相同的问题,我使用了jquery,但是即使我把js文件分离出来,错误依然存在 $(document).ready(function() { alert("hello"); }); 就要报错误。。

# by Jeffrey

to 罗, 我遇到的狀況是因為沒有將Code包在onload事件中,所以才會迫使Visual Studio在無網頁的情況下存取DOM元素。在你的例子用了$(doument).ready()而且也沒存取DOM,還是報錯? 我想會不會是另外有其他Javascript Error存在?

Post a comment