描述的第一部分在Unsafe JavaScript attempt to access frame, when try to upload file with ajax问题是当尝试使用ajax-way上传文件时,我得到访问被拒绝错误。
经过长时间的调试后,如果我不加载ape客户端,我发现一切正常。猿是彗星服务器http://www.ape-project.org/
Ape创建了一个iframe,其中src =“http://8.ape.readbox.cz:6969/?...”。如果我禁用了ape并且没有创建iframe,那么访问为ajax-upload创建的iframe文档没有问题。
他们看起来像是
<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>
拜托,有人可以帮帮我吗?我很困惑。
答案 0 :(得分:2)
不幸的是,我不能给你一个具体的解决方案。问题的要点如下:
为了让APE进行跨域(实际上是子域)的POST调用,ape需要重置document.domain(一个全局的,窗口变量),去掉域前缀(www。,beta。等等)。 ..)。虽然0.ape.YOURDOMAIN.com受到www.YOURDOMAIN.com的跨域限制,但允许来自YOURDOMAIN.com的同域权限。遗憾的是,为了让您的上传者iframe访问父窗口,它也需要来自同一个域。重置document.domain会更改。
一种解决方案是将APE的默认XHR方法从“POST”更改为“GET”。显然,您可以从外部域获取请求,但您可以发送的数据量有限。此外,您还必须注释掉在您的网页上重置document.domain的javascript行。
这不是您可能正在寻找的伟大,可靠的解决方案,但我希望它能够解决问题的根源。
答案 1 :(得分:0)
我使用jQuery Form Plugin和APE彗星服务器,并且使用iframe上传文件时遇到了同样的问题。 这是我的解决方案(使用静态iframe而不是动态iframe):
将以下代码添加到页面,在启动APE之前加载:
<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);
(这只是移动第二个大括号)