在Chrome中对本地文件使用iframe
Using iframe with local files in Chrome
我很难弄清楚如何从外部页面访问加载在iframe中的页面。这两个页面都是本地文件,我使用的是Chrome。
我有一个外页,还有许多内页。外部页面应该始终显示内部页面的页面标题(这在我的应用程序中是有意义的,在这个精简的示例中可能不那么有意义)。这在AppJS中没有任何问题,但我被要求让这个应用程序直接在浏览器中工作。我收到错误"阻止原点为"null"的帧访问原点为"null"的帧。协议、域和端口必须匹配。".
我认为这是由于Chrome对本地文件的同源政策,但这并没有直接帮助我解决问题。在这个精简的例子中,我可以通过使用window.postMessage方法per-Ways来绕过同源策略来解决这个问题。然而,除了这个例子之外,我还想从外部页面操作内部页面的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");
Per当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";
这导致了错误"未捕获错误:安全错误:DOM异常18"。
我在挣扎。任何来自知识渊博的人的帮助都将是美妙的!谢谢
很抱歉地告诉你,我已经尝试了几个星期来解决这个问题(我在一个项目中需要它),我的结论是这是不可能的。
使用chrome通过javascript进行本地访问有很多问题,其中一些问题可以使用--allow-file-access-from-files
和--disable-web-security
解决,包括一些HTML5离线功能,但我肯定认为无法访问本地文件。
我建议您不要浪费时间试图绕过这一点,并尝试将您可以解释的消息发布到内部页面中,这样您就可以在那里进行DOM修改。
根据我们一分钟前在我的多维数据集中的讨论:)
我遇到了同样的问题(express js的Ajax发布响应不断抛出错误),试图让Ajax发布请求正常工作。
让我绕过它的不是直接从文件系统运行文件,而是从本地服务器运行它。我使用node运行express.js。您可以使用以下命令安装express:npm install -g express
完成后,您可以使用以下命令创建一个express项目:express-s-eexpressTestApp
现在,在该文件夹中,您应该会看到一个名为app.js的文件和一个名称为public的文件夹。将要使用的html文件放在公用文件夹中。我用以下代码替换了文件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"); });
请注意,需求行可能不同。你必须找到你的系统真正把快递放在哪里。您可以使用以下命令执行此操作:sudo find/-name express
现在,使用以下命令启动express web服务器:node-app.js
此时,Web服务器已启动并正在运行。继续打开浏览器并导航到您的ip地址(或者如果您与服务器在同一台机器上,则为127.0.0.1)。使用ip地址:portnumber''filename.html,其中端口号是我们创建的app.js文件中的5555。
现在,在那个浏览器中,你不应该(在我们测试它时也没有)再遇到任何同样的问题了。
file://protocol和http://protocol使事情在iframe方面表现得非常不同。我在PhoneGap上的一个应用程序中遇到了与你描述的相同的问题,该应用程序使用文件协议访问本地资产/www文件夹中的所有本地文件。
如果现代浏览器出于安全原因,禁止在iframe中显示使用文件协议的"本地"文件。
我们最终抛弃了iframe,只使用div作为"视口"。幸运的是,我们的应用程序的总体大小没有那么大,所以我们设法在一个页面中加载了所有内容。
- 什么更好?使用iframe或jQuery之类的东西在外部网站中加载HTML文件
- parent和iframe中的Bootstrap.js文件
- CSS 和 JS 文件正在由 iframe 缓存
- 为什么我的 ajax 调用没有生成,因为我包含 ajax 的 js 文件包含在 iframe 中
- 在 iFrame 中注入 JS 文件,通过 Google chrome 扩展名中的 ContentScript 进行
- src为null的iframe中的Javascript文件的路径
- 如何将javascript文件插入到iframe中,然后调用插入的javascript中的函数
- 动态渲染 .mht 文件,无需加载/iframe/嵌入
- 将iFrame的内容保存到html文件中
- 加载一个html或JavaScript文件作为iframe源
- 如何知道向iframe提交表单和文件是否失败
- javascript浏览文件并在iframe中显示内容
- 如何将 iframe id/name 发送到 php 文件
- 使用 iFrame for IE9 上传文件
- 在通过 flask Web 服务器呈现的 html 页面中显示 iframe 中文本文件的内容
- 通过 IFrame 更新文件时的错误处理
- 使用 IFRAME 上传文件,文件不会到达服务器
- Cordova跨域文件://iframe contentwindow通信
- 使用jQuery下载大文件;iFrame -需要一个文件准备事件,所以我可以隐藏加载gif
- 使用"hidden"上传文件Iframe不能在资源管理器中工作