2008年6月12日 星期四

當 .Net AJAX 遇上 Frame (6.12)

適用了 .Net 包裝的 AJAX 一些時間後,發現,真的是「水能載舟,亦能覆舟」。

在使用前,只知道 AJAX 的優點,衝著它的優點去使用它,
卻沒想到,它也是個會另人頭痛的東西呀~~


目前有個專案,由於必須即時更新資料,所以,想到用使用 AJAX 套件的 UpdatePanel ,
讓它局部更新就好,畫面就不會一直閃。有了這個前題,開始著手製作這簡單的功能。


沒錯,它的確很簡單,所以三兩下就可以完成,且也在本機測試正常,可以即時更新資料;
但是,當我把它放上「測試區環境」時,居然發現,只要滑鼠點了一下(不管左鍵,右鍵),
馬上跳出個 「JavaScript」的錯誤,錯誤上顯示著「存取失敗」

天吶 ~ 發生了什麼事,且是莫名奇妙的發生,對我這 AJAX 的初學者來說,可是個大問題。
明明在本機端不是正常嗎?怎麼到了測試區就壞了?

既然本機正常,測試區故障,那就即有可能是環境的問題。立即檢視了一下環境,
並且馬上再上 Google 尋找問題點,及解決方案,後來,總算是發現問題了。

看來這問題,並不是只有出現在我身上,已有許多前輩遇到,並也提出了解決方案。
真的太好了!現在,就來看看發生了什麼問題吧~

原來問題是出在「Frame」呀~若只是一般的框架,就還沒事,但若是遇到框架內,
左右(或是上下什麼的)網頁的來源路徑處於不同的主機時,
很抱歉,JavaScript 會出來跟您 聊個天,告訴您「存取失敗」。


那這是什麼原因呢?為什麼不同主機時,就會壞掉。經過網路前輩的分享,
得知原來問題就出在 .Net AJAX 的套件中,有個 MicrosoftAjax.debug.js 檔案,

裡面有部份語法是這樣寫的:

var offsetL = w.screenLeft - top.screenLeft - top.document.documentElement.scrollLeft + 2 ;

如果 Frame 的網頁路徑在不同主機上,使用了「top」當然會有問題(算是Bug吧),
但由於,這些程式,已經由 .Net 包起來了,無法直接去修改,
所以,我們便必須另外下載「Microsoft AJAX Library 」來用。

解壓縮後,將其,放在您的「虛擬目錄」底下,接著,
修改一下 ScriptManager 的內容:





再來,修改程式「MicrosoftAjax.debug.js 」中


case Sys.Browser.InternetExplorer: 到 case Sys.Browser.Safari:


修改成:





之後呢? ScriptManager 就會依照您給的路徑去執行該修改過的檔案。


參考來源:黑暗執行緒

沒有留言: