描述的第一部分是在不安全的JavaScript尝试访问框架,当尝试上传与阿贾克斯文件问题是,我得到拒绝访问的错误,当尝试使用Ajax的方式上传文件。
长时间的调试后,我发现,一切正常,如果我不加载猿客户端。 APE是彗星服务器http://www.ape-project.org/
猿创建与SRC = “iframe中http://8.ape.readbox.cz:6969/ ?...”。 如果我禁用猿,这IFRAME不产生了以后我没有问题,访问的iframe,为Ajax上传创建的文档。
Togather它们看起来像
<iframe src="http://8.ape.readbox.cz:6969/?..." style="display: none; position: absolute; left: -300px; top: -300px;" id="ape_undefined"></iframe>
<iframe style="display: none;" id="ValumsAjaxUpload0" src="javascript:false;" name="ValumsAjaxUpload0"></iframe>
请任何人可以帮助我吗? 我糊涂了。
不幸的是,我不能给你一个具体的解决方案。 问题的要点如下:
为了APE进行跨域(实际上,子域)POST调用,猿需要重置document.domain的(一个全球性的,窗口变量),摆脱域前缀的网站(www。,β,等...) 。 虽然0.ape.YOURDOMAIN.com是www.YOURDOMAIN.com限制跨域,它允许从YOURDOMAIN.com同域的权利。 可悲的是,为了让您的上传IFRAME访问父窗口,它需要来自同一个域名为好。 重置document.domain的改变了。
一个解决方案是从“POST”到“GET”更改APE的默认XHR方法。 可以很明显的让外国域的GET请求,但你的数据,你可以发送量是有限的。 此外,你必须注释掉的JavaScript的一个重置document.domain的您的网页就行了。
这不是你可能在寻找伟大的,可靠的解决方案,但我希望它揭示了问题的根源上一盏小灯。
我使用的jQuery插件格式和APE彗星服务器,并坚持使用iframe中上传文件同样的问题。 这里是我的解决方案(使用静态的iframe,而不是动态的):
添加以下代码到网页中,加载开始APE BEFORE:
<iframe id="file_upload_iframe" name="file_upload_iframe" src="iframe_src.html" style="position: absolute;left: -300px;top:-300px; width:0px;height:0px;"></iframe>
加入该网站的页面iframe_src.html(静态IFRAME的初始源):
<html>
<head>
</head>
<body>
<script type="text/javascript">
document.domain = document.domain; <!-- this is the main line -->
</script>
</body>
</html>
本页面的目的是为了让这个插件进行初始形式提交,避免权限错误。
应用程序应返回下列方式响应:
<html>
<head></head>
<body>
<script type="text/javascript">document.domain = document.domain;</script>
<textarea>' + YOUR_DATA_TO_RETURN + '</textarea>
</body>
</html>
这是为了避免权限被拒绝错误在第二和进一步的表单提交。
代码在客户端表单提交:
$('#image_add_commit').click(function(){
$('#file_upload_iframe').unbind();//may be it is unnecessary
$('#image_add_form').ajaxSubmit(
{success: image_add_complete,
iframe: true,
iframeTarget: $('#file_upload_iframe').get(0),
dataType: 'html',
textarea: true});
});
function image_add_complete(data){
//data variable contains YOUR_DATA_TO_RETURN that was wrapped in HTML code
}
在修改文件jquery.form.js:
查找块
if (!s.iframeTarget) {
// add iframe to doc and submit the form
$io.appendTo('body');
if (io.attachEvent)
io.attachEvent('onload', cb);
else
io.addEventListener('load', cb, false);
}
并将其更改为
if (!s.iframeTarget) {
// add iframe to doc and submit the form
$io.appendTo('body');
}
if (io.attachEvent)
io.attachEvent('onload', cb);
else
io.addEventListener('load', cb, false);
(这只是移动第二大括号向上)