javascript - dojo/request/iframe 是如何工作的?

标签 javascript iframe dojo

我在整个 Javascript/Dojo 世界中都在慢慢变得更好。但是,我对整个 dojo/request/iframe 业务感到困惑。 我知道在 Javascript 中,出于安全原因,您只能连接到原始服务器。这是一个给定的。然而,当人们开始考虑“使用 iframe 来解决这个问题”时,我感到很迷茫。

道场/资源/空白.html:

  • 包含<html><head><script>isLoaded = true;</script></head><body></body></html>
  • 需要由与您的应用程序相同的服务器托管。因此,如果您从 CDN 使用 dojo,则需要将此 blank.html 文件保存在应用程序所在的同一台服务器上

页面http://livedocs.dojotoolkit.org/dojo/request/iframe解释,关于 iframe:

  • 在发起调用页面的服务器以外的服务器上调用服务(跨域请求)。请注意,在这种情况下,无法读取响应主体:您可以发送数据,但不会收到任何回复。如果您需要访问返回数据,请参阅 dojo/request/script。

  • 从表单上传文件(例如文件输入控件)。作为安全措施,普通的 XHR 机制无法访问文件选择标签引用的文件数据。 dojo/request/iframe 可以通过 IFrame 代理这些调用,从而仍然可以以异步方式进行文件上传。

一个空的 HTML 页面如何帮助我解决这个问题? (好吧,一个设置全局变量“isLoaded”的...?)

此外,在上面两点中解释了您无法检索响应之后,文档继续:

  • 发出请求以检索某些 XML 的示例如下所示:

那么...您可以取回?

我想我需要退后一步,真正理解整个“使用 iframe 绕过跨域请求”以及真正理解“正常 XHR 机制”(什么机制?)无法访问数据的问题选择标签的引用(什么选择标签?请求主体中的数据不是吗?)可以通过 iFrame 代理这些调用(你的意思是设置 isLoaded 的单个空文件?!?)

我很困惑……迷路了。有人可以给我一些指导吗?

谢谢...

雇佣兵。

最佳答案

好吧,我不知道 blank.html 页面,但我理解你问题的第二部分。 据我所知,大多数(所有)浏览器都拒绝来自 XHR/JavaScript 的跨域请求,并且出于安全原因,它们也不能从文件上传表单元素发送数据。如果可能的话,黑客可以(通过注入(inject)一些 JavaScript)做一些可怕的事情,比如将数据发送到其他域或读取上传的文件。

要解决此问题,您可以使用 iframe。 iframe 可以加载跨域页面,但问题是如果是跨域请求,您不能简单地访问 iframe 的内容。但是,使用 JavaScript,您可以设置 iframe 的源,因此您可以通过 iframe 发送数据。

文件也一样,不能直接发送,但可以通过 iframe 发送,因为你可以操纵 iframe 的作用(和发送数据)。

所以 TL;DR:浏览器会阻止您可以使用 JavaScript 执行的某些操作,例如:

  • 通过XHR跨域发送数据
  • 通过XHR读取文件数据
  • 读取跨域的iframe数据

因此您可以执行以下操作:

  • 通过 iframe 发送跨域数据
  • 通过iframe读取文件数据
  • 读取不跨域的iframe

所以只要不是跨域请求,确实可以用iframe dojo模块读取文件。

我希望我解释得足够好,可以理解。

关于javascript - dojo/request/iframe 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15295964/

相关文章:

javascript - 在外部 iframe 内使用 ajax

iframe - 使用 phantom.js 切换到 iframe

javascript - 在 Liferay portlet 中放置一个 iframe

css - Dojo claro css 将绝对定位应用于 ContentPane 元素

javascript - 在 vue.js 中使用 props 在每个页面上设置不同的文本

javascript - 如何在输入的数字范围内查找质数

javascript - 使用 Closure Compiler 简单优化从函数内部删除调试代码

javascript - 如何删除 IndexedDB 中的所有记录

javascript - Dojo FilteringSelect 显示为纯文本框

javascript - 如何在 dojo 或 JavaScript 中检查多个 undefined?