Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/441.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在iframe中上载文件后从远程服务器检索响应_Javascript_Iframe_Cross Domain_Response_Jsonp - Fatal编程技术网

Javascript 在iframe中上载文件后从远程服务器检索响应

Javascript 在iframe中上载文件后从远程服务器检索响应,javascript,iframe,cross-domain,response,jsonp,Javascript,Iframe,Cross Domain,Response,Jsonp,我有一个表单,可以将firame中的文件上传到远程服务器。因此,在提交url时,服务器返回带有操作结果的json数据,我的iframe将捕获该数据 {'result': 'true' or 'false'} 现在,我想检索这个json作为iframe的回调。我知道我需要jsonp来实现这一点,因为这是一个跨站点调用。以下是我的函数及其示例代码: 但这里很少出现问题。首先-我上传的URL只是“http://something/" . 我需要它来支持带有$callback=后缀的调用吗? 其次,服

我有一个表单,可以将firame中的文件上传到远程服务器。因此,在提交url时,服务器返回带有操作结果的json数据,我的iframe将捕获该数据

{'result': 'true' or 'false'}
现在,我想检索这个json作为iframe的回调。我知道我需要jsonp来实现这一点,因为这是一个跨站点调用。以下是我的函数及其示例代码:

但这里很少出现问题。首先-我上传的URL只是“http://something/" . 我需要它来支持带有
$callback=
后缀的调用吗?
其次,服务器只作为文件上传的结果给出响应。因此,我需要得到存储在iframe中的结果,而不是存储在指定的url中。如何解决这个问题

这是链接。请注意表单中隐藏的iframe。服务器显示的结果如下所示:

http://ntt.vipserv.org/artifact/


编辑

我以前试过:

    $('#upload_target').load(function () {
        var ret = frames['upload_target'].document.getElementsByTagName("body")[0].innerHTML;
        var data = eval("("+ret+")");
    });

但它会引发“权限被拒绝”错误。

一个可能的解决方案是使用纯js设置iframe的名称。此名称可以从包装父页面中读取。

我认为您的代码将请求
上载URL
两次:首先,
.submit()
执行POST请求以上载文件,结果将作为网页显示在iframe中;其次,
.getJSON()
执行一个GET请求,结果在
中作为javascript执行。如果您在测试应用程序时打开Firebug,您就会意识到这一点

由于其中两个请求是独立的,我不知道
.getJSON()
将如何向您提供有关您刚才使用
.submit()
上载的文件的任何信息

对于这种跨域通信,我建议使用
postMessage
;否则,您将需要更改您的应用程序工作流,以便在文件上载后在iframe中执行所有操作;e、 g.发出警告(接受提交)

用户成功上传文件后,您将尝试执行什么操作

这很容易做到,而且实际上有一篇关于这个确切用例的博客文章

本质上,它所做的是使用跨域消息传递将响应传递给调用文档

更新:对于正在运行的这个,可以在找到源代码,文件的前缀是“upload”

肖恩的建议是一个很好的选择(&应该标记为正确),但我想建议另一个我没有见过任何人使用的轻量级解决方案

如果您正在另一个域上发布一个隐藏的iframe&只需要一个响应(而不是双向通信),您可以使用一个中断的url将消息从iframe传递给父级。下面是一个例子:

  • 父级在不同的域上加载iframe

  • 父项轮询
    myframe.contentWindow.location.href
    (由于帧位于另一个域上,因此不断获得
    权限被拒绝
    错误)

  • 如果帧处理,然后重定向到

    http://parentdomain.com/pagethatdoesnotexist?{'result':'ok'}
    
  • iframe获得了404,但现在该位置可供父对象使用

  • 父对象从iframe的URL读取消息
  • 完全不要使用.html()

    我曾经

    jQuery('.someElement')
    
    这对我很有效。您可以将结果保存在变量中并将其插入新元素中

    e、 g


    然后呢?这有什么帮助?db是连接到
    上传URL的域(A)还是用户所在的域(B)?考虑将记录直接添加到(A)到DB的服务器端,因为有一个改变,用户可能向B添加开机记录请求,而不需要实际上传文件到(A)。DB是在本地域(B)上上传的(A)。这就是为什么我在成功上传后收到服务器的响应。响应显示在iframe中。所以我想读出它,如果'response'='true'将一个新实例添加到我的数据库中。那么您应该使用
    postMessage
    将iframe中上传的结果中的信息传递给其父级。您可能希望在(a)和(b)之间建立一些共享秘密,以确保添加记录请求是真正合法的。因此,我应该将带有pm的脚本放在哪里,在iframe内部,在本地的上载服务器上?是的。从域(b)上的iframe发送消息,在域(a)上的父页面上侦听消息,将db数据与消息一起发送到(a);使用(a)和(b)之间的共享机密检查消息。因此,如果不在服务器端引入一些js,我无法实现这一点?不是在服务器端,而是在位于“接收”域的文档上。但是没有,你要么需要这个,要么使用flash/activex代理等等-easyXDM更容易。你用过它吗?我不确定我是否做对了。我在那里至少能看到4份文件。一个-使用者-执行上载并存储在本地。在远程服务器上第二次上载_rpc.html。我不确定它是如何与实际上传地址连接的。然后是本地的'name.html'和远程的'name.html',我不确定它们的用途。我是开发人员。您可以跳过name.html,除非您需要支持一些非常旧的浏览器。upload_rpc.html是XDM端点,负责将响应中继回,并“承载”作为上载表单目标的iframe。表单post操作然后使用
    parent.foo
    将响应传递回原始文档。因此,让我检查是否正确-我的消费者的表单发布到
    upload url
    ,指定的目标iframe位于
    upload\u rpc.html
    中。上传后,我将返回我的结果。我还有两个问题-
    upload\u rpc
    中的代码如何知道上传的结果?其次,我是得到返回的iframe还是仅仅得到rpc响应?我特别感兴趣的是我需要采取的远程服务器方面的步骤,因为我在那里的访问非常有限,如果我一次尝试就可以做到最好
    jQuery('.someElement')
    
    var = jQuery('.someElement');
    jQuery('.newElement').html(var);