跨域将.net 工程嵌入别的系统页面中发生的js、ajax的拒绝访问的错误

来源:互联网 发布:图书馆软件 编辑:程序博客网 时间:2024/05/09 19:51
 

前一段时间有人问我一个Javascript. Error,他将.net adf开发的系统放在一个大系统的首页的一个Frame里面,更要命的是首页与新网页位于不同的server上,于是只要在新网页的任何地方按下鼠标左键,都会弹出“拒绝访问”的js错误。追了一下发现问题出现在

switch(Sys.Browser.agent) {
case Sys.Browser.InternetExplorer:
Sys.UI.DomElement.getLocation = function Sys$UI$DomElement$getLocation(element)
var ffsetL = w.screenLeft - top.screenLeft - top.document.documentElement.scrollLeft + 2;
,起初我们也不知道到底这里出了什么问题,全部装在一台上么是可以的,如果两个系统部署在不同的server上么就报这个错,关键还是用fire fox也是可以的,而用IE就出错。到底什么原因,想破头啊!弄到半夜还么有进展,后来找到一个台湾人写的一篇文章,才算弄明白。

大家看代码,js程序中它不管三七二十一就去读top物件,当网页被嵌在不同的Domain的Frame或Iframe时,肯定就要出错了。这就能解释网页入口网站在同一台主机,没有有跨Domain的问题的时候,能够幸免,从Sys.Browser.InternetExplorer我们也可以理解为什么用fire fox可以正常使用。还好,不仅网上有人指出了这个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 wnerDocument = element.document.documentElement;
    var ffsetX = clientRect.left - 2 + ownerDocument.scrollLeft,
        ffsetY = clientRect.top - 2 + ownerDocument.scrollTop;
   
    try {
        var f = element.ownerDocument.parentWindow.frameElement || null;
        if (f) {
            var ffset = 2 - (f.frameBorder || 1) * 2;
            offsetX += offset;
            offsetY += offset;
        }
    }
    catch(ex) {
    }   
   
    return new Sys.UI.Point(offsetX, offsetY);
}
break;

修改完成后,地图就可以正常操作了。
真的要感谢前人的分享,期望ASP.NET AJAX以后的版本或Service Pack能修正这一bug。


原创粉丝点击