在IE9中使用XMLHttpRequest时出现SCRIPT5: Access is denied错误

47
var xhttp=new XMLHttpRequest();
xhttp.open('GET', 'foo.xml', false);

F12弹回:SCRIPT5:Access is denied。位于第95行的xhttp.open行。

我的JavaScript代码似乎没有问题,而且Firefox也按照我想要的方式运作。

我已经阅读了很多与这个问题非常相似的问题,所以我查看了同源策略,但我无法看出它如何适用于foo.xml与HTML文件在同一个目录中的情况。我已经在我的本地 Intranet 上打开了脚本权限,并告诉 McAfee 休息五分钟,只是为了确认一下。我甚至尝试以管理员身份运行IE,所以这不可能是权限问题,对吗?除此之外,为什么IE会被拒绝访问本地文件呢?

11个回答


5

这个例子演示了如何使用AJAX从任何网站获取资源。它可以跨浏览器运行。我已在IE8-IE10、Safari、Chrome、Firefox和Opera上进行了测试。

if (window.XDomainRequest) xmlhttp = new XDomainRequest();
else if (window.XMLHttpRequest) xmlhttp = new XMLHttpRequest();
else xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");

xmlhttp.open("GET", "http://api.hostip.info/get_html.php", false);
xmlhttp.send();

hostipInfo = xmlhttp.responseText.split("\n");
var IP = false;
for (i = 0; hostipInfo.length >= i; i++) {
    if (hostipInfo[i]) {

        ipAddress = hostipInfo[i].split(":");
        if (ipAddress[0] == "IP") {
            IP = ipAddress[1];
        }
    }
}
return IP;

5

1
谢谢您对 MOTW 的解释。我的 XML 文件没有,我甚至添加了一个来看是否能够更改错误消息。但很遗憾并未成功。 - Eric L

4

在IE7、IE8和IE9中,只需转到“设置”->“Internet选项”->“安全”->“自定义级别”,并在“杂项”下更改安全设置,将“跨域访问数据源”设置为“启用”。


6
@Skurpi同意,那就是使用IE的代价。在我们的应用程序中,我们说明只支持Firefox和Chrome。如果我们的客户想使用IE,则需要确保启用此设置,我们的IE客户自愿更改了他们的设置。 - Walid Ibrahim
当我尝试从书签运行XMLHTTPRequest时,我一直收到访问被拒绝的错误。当我在页面上运行脚本时,它可以正常运行。这是唯一有效的解决方案。Win 7 IE 9. - thefoyer

3
这个错误信息(SCRIPT5:拒绝访问)还可能出现在.replace方法的目标页面未找到时(我输入了错误的页面名称)。我知道这是因为它刚刚发生在我身上,所以我搜索了更多有关此错误消息含义的信息。

1
“replace method”是什么意思?我收到了这个错误信息,但是我无法确定是什么导致了它。 - Cat Chen

1

0

我曾经在IE10上遇到过类似的问题。但是我通过使用jQuery ajax请求检索数据进行了一些解决工作:

$.ajax({
    url: YOUR_XML_FILE
    aync: false,
    success: function (data) {   
        // Store data into a variable
    },
    dataType: YOUR_DATA_TYPE,
    complete: ON_COMPLETE_FUNCTION_CALL
});

0

可能您正在请求外部资源,这种情况下IE需要使用XDomain对象。请参考以下示例代码,了解如何在所有浏览器中进行跨域的ajax请求:

Tork.post = function (url,data,callBack,callBackParameter){
    if (url.indexOf("?")>0){
        data = url.substring(url.indexOf("?")+1)+"&"+ data;
        url = url.substring(0,url.indexOf("?"));
    }
    data += "&randomNumberG=" + Math.random() + (Tork.debug?"&debug=1":"");
    var xmlhttp;
    if (window.XDomainRequest)
    {
        xmlhttp=new XDomainRequest();
        xmlhttp.onload = function(){callBack(xmlhttp.responseText)};
    }
    else if (window.XMLHttpRequest)
        xmlhttp=new XMLHttpRequest();
    else
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    xmlhttp.onreadystatechange=function()
    {
        if (xmlhttp.readyState==4 && xmlhttp.status==200){
            Tork.msg("Response:"+xmlhttp.responseText);
            callBack(xmlhttp.responseText,callBackParameter);
            Tork.showLoadingScreen(false);
        }
    }
    xmlhttp.open("POST",Tork.baseURL+url,true);
    xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
    xmlhttp.send(data);
}

0
我认为问题在于文件位于您的本地计算机上,而IE正在拒绝访问,因为如果让脚本访问运行浏览器的计算机上的文件,那将是一个巨大的安全漏洞。
如果您可以访问服务器或另一台计算机并将文件放在那里,然后像从网站上运行脚本一样运行脚本,也许可以尝试这样做。

奇怪的是,如果这是真的,IE就有一个很大的安全漏洞——我发现我可以通过声明XML数据岛并使用datafld内联来加载和操作此文件。虽然我不喜欢这个想法,但这是我目前能想到的最好的方法。 - Eric L

-1
  $.ajax({
        url: '//freegeoip.net/json/',
        type: 'POST',
        dataType: 'jsonp',
        success: function(location) {
            alert(location.ip);
        }
    });

这段代码也适用于https网站


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接