zoukankan      html  css  js  c++  java
  • AJAX ERROR TOP

    KB-Cross-domain access denied issue of ASP.NET AJAX page

    高高興興地將網頁改版成ASP.NET AJAX,在測試台上驗證無誤,今天程式才剛上線,我臉上也出現三條線。

    新網頁放在首頁下的一個Frame裡,要命的是首頁與新網頁位於不同的Server,於是只要在新網頁的任何地方按下滑鼠左鍵,都會彈出"Access is denied"的Javascript Error。追了一下,發現問題出在MicrosoftAjax.js上,裡面有一段Code... (問題出在5959列)

    switch(Sys.Browser.agent) {
    case Sys.Browser.InternetExplorer:
    Sys.UI.DomElement.getLocation = function Sys$UI$DomElement$getLocation(element)
    ...省略...
    var offsetL = w.screenLeft - top.screenLeft - top.document.documentElement.scrollLeft + 2;
    ...省略...

    看到沒有,不分青紅皂白就去讀top物件,當網頁被嵌在不同Domain的Frame或IFrame時,不出問題才有鬼! 這也難怪之前在測試台時,網頁與入口網站在同一台主機,沒有跨Domain的問題,能無憂無慮地通過測試。

    幸好,我不是這個臭Bug唯一的受害者,網路上已經有先賢先烈找到解決方法。 主要的關鍵是將有問題的MicrosoftAjax.js換掉,改成我們自己修改的版本。AJAX的js檔都已經是用Embedded Resource的方式藏在DLL中,而用ScriptResource.axd將它取回。所幸,ScriptManager提供了方法可以改用靜態檔 案,方法是先去下載Microsoft AJAX Library ,將解壓縮在你的Web Application目錄後,接著修改ScriptManager的宣告:

    <asp:ScriptManager ID="ScriptManager1" runat="server"><Scripts>
    <
    asp:ScriptReference
        Name="MicrosoftAjax.js" ScriptMode="Auto"
       
    Path="~/[WebAppPath]/System.Web.Extensions/1.0.61025.0/MicrosoftAjax.js"/>
    </Scripts></asp:ScriptManager>

    如此,ScriptManager會以WebAppPath/System.Web.Extensions/1.0.61025.0/MicrosoftAjax.debug.js取代Embedded在DLL中的版本。下一步是修改程式,將case Sys.Browser.InternetExplorer:到case Sys.Browser.Safari:間的程式碼換成以下的寫法:

    Sys.UI.DomElement.getLocation = function(element) {
    if (element.self || element.nodeType === 9) return new Sys.UI.Point(0,0);
    var clientRect = element.getBoundingClientRect();
    if (!clientRect) {
    return new Sys.UI.Point(0,0);
    }
    var ownerDocument = element.document.documentElement;
    var offsetX = clientRect.left - 2 + ownerDocument.scrollLeft,
    offsetY = clientRect.top - 2 + ownerDocument.scrollTop;

    try {
    var f = element.ownerDocument.parentWindow.frameElement || null;
    if (f) {
    var offset = 2 - (f.frameBorder || 1) * 2;
    offsetX += offset;
    offsetY += offset;
    }
    }
    catch(ex) {
    }

    return new Sys.UI.Point(offsetX, offsetY);
    }
    break;

    修改完成,果然就沒有錯誤訊息了! Case Closed.

    謝謝前人的血汗與分享,並期待ASP.NET AJAX快點出Service Pack。

    Published 13 April 2007 02:04 AM 由 Jeffrey Filed under: ASP.NET, KB, AJAX
  • 相关阅读:
    Leetcode665.Non-decreasing Array非递减数组
    在MyEclipse中把多行代码用一快捷键注释掉
    struts2中addFieldError()方法
    [bzoj2588][Spoj10628]Count on a tree_主席树
    [bzoj3123][Sdoi2013]森林_主席树_启发式合并
    [bzoj1500][NOI2005]维修数列_非旋转Treap
    [bzoj1452][JSOI2009]Count_树状数组
    [bzoj1369][Baltic2003]Gem_树形dp_结论题
    [bzoj1195][HNOI2006]最短母串_动态规划_状压dp
    [bzoj2242][Sdoi2011]计算器_exgcd_BSGS
  • 原文地址:https://www.cnblogs.com/tianminghan/p/1532864.html
Copyright © 2011-2022 走看看