在Chrome中使用iframe与本地文件

我很难搞清楚如何从外部页面访问加载到iframe中的页面。 这两个页面都是本地文件,我正在使用Chrome。

我有一个外部页面和许多内部页面。 外部页面应该始终显示内部页面的页面标题(这在我的应用程序中是有意义的,在这个精简的例子中可能不那么明显)。 这在AppJS中没有任何问题,但我已经被要求直接在浏览器中使这个应用程序工作。 我得到错误“ 阻止与起源的框架”null“访问与起源”空“的框架。协议,域和端口必须匹配。

我认为这是由于Chrome的本地文件相同的来源政策,但这并没有帮助我直接解决问题。 我可以通过使用每种方法的window.postMessage方法绕过同源策略来解决这个问题。 但是,除了这个例子之外,我还想从外部页面操作内部页面的DOM,因为这会使我的代码变得更干净 – 所以发布消息不会完成这项工作。

外部页面

<!DOCTYPE html> <html> <head> <meta name="viewport"> </head> <body> This text is in the outer page <iframe src="html/Home.html" seamless id="PageContent_Iframe"></iframe> <script src="./js/LoadNewPage.js"></script> </body> </html> 

内页

 <!DOCTYPE html> <html> <head> <title id="Page_Title">Home</title> <meta name="viewport"> </head> <body> This text is in the inner page </body> </html> 

JavaScript的

 var iFrameWindow = document.getElementById("PageContent_Iframe").contentWindow; var pageTitleElement = iFrameWindow.$("#Page_Title"); 

每当iFrame从本地html文件加载本地html文件时,未来版本的Chrome可能是否支持contentWindow / contentDocument? ,我试着用国旗启动Chrome

 --allow-file-access-from-files 

但结果没有变化。

每个在Chrome中禁用相同的原始策略 ,我试图用标志启动Chrome

 --disable-web-security 

但是结果再一次没有变化。

什么document.domain = document.domain做什么? ,我有两个页面运行命令

 document.domain = document.domain; 

这将导致错误“ 阻止一个带有原点的帧”null“访问一个原点为”null“的帧,请求访问设置”document.domain“为”“的帧,但是被访问的帧没有设置” document.domain“改为相同的值以允许访问。

为了好玩,我有两个页面运行命令

 document.domain = "foo.com"; 

这导致错误“ 未捕获的错误:SecurityError:DOMexception18 ”。

我很挣扎。 任何更有知识的人的帮助将是太棒了! 谢谢!

根据我们刚刚在我的立方体讨论:)

我也遇到了同样的问题( 来自express js的Ajax post响应不断抛出错误 )试图让AJAX post请求正常工作。

是什么使我无法直接从文件系统运行文件,而是从本地服务器运行文件。 我用节点运行express.js。 你可以用以下命令安装express: npm install -g express

一旦完成,您可以使用以下命令创build一个快速项目: express -s -e expressTestApp

现在,在该文件夹中,您应该看到一个名为app.js的文件和一个名为public的文件夹。 把你想要使用的HTML文件放在公用文件夹中。 我用下面的代码replace了文件app.js:

 var express = require('/usr/lib/node_modules/express'); var app = express(); app.use(function(err, req, res, next){ console.error(err.stack); res.send(500, 'Something broke!'); }); app.use(express.bodyParser()); app.use(express.static('public')); app.listen(5555, function() { console.log("Server is up and running"); }); 

请注意,需求线可能不同。 你必须find你的系统实际放置的地方。 你可以用下面的命令来做到这一点: sudo find / -name express

现在,使用以下命令启动快速Web服务器: node app.js

这时,networking服务器已经启动并正在运行。 继续并打开一个浏览器,导航到你的IP地址(或者如果你在与服务器相同的机器上,127.0.0.1)。 使用ip address:portnumber \ filename.html,其中端口号是我们创build的app.js文件中的5555。

现在在那个浏览器中,你不应该(也不是在我们testing的时候)有这些相同的问题了。

我很抱歉地说,我已经在几个星期内尝试过解决这个问题(我需要一个项目),我的结论是,这是不可能的。

本地访问通过与Chrome的javascript通过本地访问有很多问题,其中一些问题可以通过--allow-file-access-from-files--disable-web-security ,包括一些HTML5离线function,但是我绝对认为没有办法访问本地文件。

我build议你不要浪费时间试图循环播放这些内容,并试图发布消息,这些内容可以翻译成内部页面,因此可以在那里进行DOM修改。

file:// protocol和http://协议使事情在iframe方面performance得非常不同。 我使用PhoneGap上的应用程序描述了相同的问题,该应用程序使用文件协议访问本地assets / www文件夹中的所有本地文件。

如果看起来现代浏览器出于安全原因阻止在iframe中使用文件协议显示“本地”文件。

我们最终倾销内嵌框架,并使用div作为“视口”。 幸运的是,我们的应用程序的整体规模并不大,所以我们设法将所有内容加载到一个页面中。