2011-02-23 51 views
45

我有一个使用jQuery 1.4.2脚本的iframe。将同一个iframe注入httphttps网站。 jQuery脚本作为相对路径包含在主HTML文件中(例如,/scripts/jquery-1.4.2.min.js)。访问被拒绝jQuery脚本在IE上

当进行AJAX调用时,Internet Explorer拒绝访问。 AJAX正在调用另一个子域,但它使用正确的协议。所有其他浏览器,但Internet Explorer中提供了以下错误:

SCRIPT5: Access is denied.
jquery-1.4.2.min.js, line 127 character 344

听说这个错误是跨域AJAX调用。但为什么IE是唯一让我废话的人?有没有IE解决方案?

此外,这是我的AJAX:

$.ajax({ 
    url: thisURL, 
    dataType: "json", 
    data: {cmd : 'getMessage', uurl: urlVar, t: Math.random()}, 
    success: function(ret){ 
     callback(ret) 
    } 
}); 
+6

对于跨域请求,您应该更喜欢'dataType:“jsonp”'。 – 2012-09-12 09:16:52

+0

@PippoFranco为什么呢? – johni 2016-09-19 12:17:59

回答

44

IE要求您使用XDomainRequest而不是XHR跨站点,您可以尝试像...

if ($.browser.msie && window.XDomainRequest) { 
      // Use Microsoft XDR 
      var xdr = new XDomainRequest(); 
      xdr.open("get", url); 
      xdr.onload = function() { 
       // XDomainRequest doesn't provide responseXml, so if you need it: 
       var dom = new ActiveXObject("Microsoft.XMLDOM"); 
       dom.async = false; 
       dom.loadXML(xdr.responseText); 
      }; 
      xdr.send(); 
     } else { 
      // your ajax request here 
      $$.ajax({ 
        url: thisURL, 
        dataType: "json", 
        data: {cmd : 'getMessage', uurl: urlVar, t: Math.random()}, 
        success: function(ret){ 
           callback(ret) 
        } 
      }); 

     } 

参考

http://forum.jquery.com/topic/cross-domain-ajax-and-ie

不能确定它是否适合您的方案

xdr = new XDomainRequest(); 
xdr.onload=function() 
{ 
    alert(xdr.responseText); 
} 
xdr.open("GET", thisUrl); //thisURl ->your cross domain request URL 
//pass your data here 
xdr.send([data]); 

你可以找到一些指导here

+1

感谢您的解决方案和链接!不幸的是,我不知道如何适合您的代码以达到我的目的。你能帮忙吗?我发布了上面的ajax代码。具体来说,我想知道在browser.msie条件下,我如何传入我的json参数,以及如何在完成时用返回数据调用回调。万分感谢! – Kyle 2011-02-23 06:25:34

+0

感谢您的巨大帮助! – Kyle 2011-02-23 07:42:43

+0

很高兴帮助... – Rafay 2011-02-23 08:01:20

1

检查您正在访问的域名,下面的响应头应该有

"Access-Control-Allow-Methods" : "POST, GET, OPTIONS" 
"Access-Control-Allow-Origin" : "http://www.mydomain.com" or "*" 
其他

域应该允许你的脚本请求。 P3P标题将添加到您的回复中。

"p3p" : "CP=IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT" 

它应该帮助你。

+1

具有相同的问题,我激活我的网络捕获在IE9中,它doesn甚至不向服务器发出请求,所以这可能无法解决问题。 – 2013-06-04 15:59:26

1

我有一个类似的问题,我的解决方案是使用jsonp而不是json。这样我就不必为IE打出一个客户版本。

只有当json服务器主机支持回调请求变量或者您有权访问服务器并可以添加支持时,才能执行此操作。这是一个帮助我理解过程的页面。它的.net mvc集中,但它提供了一个很好的json和jsonp之间的区别。

http://blogorama.nerdworks.in/entry-EnablingJSONPcallsonASPNETMVC.aspx

1

我正面临类似的问题。 我正在使用文件上传控制,但它被隐藏,我有另一个元素试图控制文件上传和事件以ajax方式上传文件

尝试直接使用文件上传控制。这个问题在我的应用程序中解决

8

这解决了这个问题优雅对我来说:

https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest

只要安装/ jQuery的之后,你的脚本之前编译和正常使用$阿贾克斯方法,你会,其余的都是自动处理的。

+4

我想为任何阅读此文的人添加:确保使用与始发呼叫相同的协议,即HTTP或HTTPS。 – 2014-01-10 02:19:15

1

我得到这个错误(因此谷歌在这里),但原因是非常不同的。所以,如果你不具备跨站点,仍然可以得到这个拒绝访问的错误:仔细检查发送
让我们说,你影响你一用不好下面的表达式变量:

urlVar = $("theID").val // without() this was the error! 

[。 ..]阿贾克斯电话:

data: {cmd : 'getMessage', uurl: urlVar, t: Math.random()}, 

谷歌/法官没有问题,这(检查什么是接收服务器端...)但IE拒绝发送这个!

1

我改变了我的JQuery从1.10.1版本1.10.2,它似乎已经解决了这个问题对我来说。

+0

它解决了我的问题.... – Mahendran 2016-03-28 07:26:58