KB-About Error Updating JScript Intellisense
2 |
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功能。逼得我心不甘情不願地花了點時間反覆測試與追查,總算理出一些頭緒:
- 為了產生Javascript Intellisense的神奇效果,VS2008在你Coding的階段就會即時執行網頁與js檔裡的Javascript, 'Sys.Res.argumentDomElement' is null or not an object的錯誤便是VS2008呼叫$addHandler時抛出的參數無效例外。
- 當VS2008單獨執行inc.js裡的$get("btn"),當下沒有任何網頁DOM,想當然爾會傳回null, 接著null被當成$addHandler的第一個參數,觸發了前述的錯誤。
- 當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存在?