Через iframe с локальными файлами в Chrome

мне трудно понять, как получить доступ к странице, загруженной в iframe с внешней страницы. Обе страницы являются локальными файлами, и я использую Chrome.

у меня есть внешняя страница, и много внутренних страниц. На внешней странице всегда должен отображаться заголовок страницы для внутренней страницы (это имеет смысл в моем приложении, возможно, меньше в этом урезанном примере). Это работает без каких-либо проблем в AppJS, но мне было предложено сделать это приложение работать непосредственно в браузере. Я получение ошибки"заблокировал кадр с исходным " null "от доступа к кадру с исходным"null". Протоколы, домены и порты должны совпадать.".

Я думаю, что это связано с той же политикой происхождения Chrome в отношении локальных файлов, но это не помогло мне решить проблему напрямую. Я могу обойти проблему в этом урезанном примере, используя окно.метод postMessage per способы обойти того же происхождения политики. Однако, выходя за рамки этого например, я также хочу манипулировать 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 вероятно ли, что будущие выпуски Chrome поддерживают contentWindow / contentDocument, когда iFrame загружает локальный html-файл из локального html-файла?, я попытался запустить Chrome с помощью флаг

--allow-file-access-from-files

но никаких изменений в результатах.

Per отключить ту же политику происхождения в Chrome, я попытался запустить Chrome с флагом

--disable-web-security

но снова не было никаких изменений в результатах.

Per что же документа.домен = документ.домен делать?, у меня обе страницы выполните команду

document.domain = document.domain;

это привело к ошибке"заблокирован рамки с происхождения "null" в обращении кадр с началом "null". Фрейм, запрашивающий набор доступа " документ.домен" на "", но доступа не. Оба должны установить " документ.домен " к тому же значению, чтобы разрешить доступ."

для удовольствия, у меня были обе страницы запустить команду

document.domain = "foo.com";

это привело к ошибке"Неперехваченная ошибка: SecurityError: исключение DOM 18".

Я барахты. Любая помощь от более знающих людей была бы фантастической! Спасибо!

3 ответов


за наше обсуждение в моем Кубе всего минуту назад:)

Я попал в эту же проблему (Ajax post response от express js продолжает бросать ошибку) попытка получить запрос AJAX post для правильной работы.

то, что заставило меня обойти это, не запускает файл непосредственно из файловой системы, а вместо этого запускает его с локального сервера. Я использовал node для запуска express.js. Вы можете установить express со следующей командой:npm install -g express

после этого выполнив, вы можете создать экспресс-проект со следующей командой:express-S-e expressTestApp

теперь, в этой папке, вы должны увидеть файл с именем 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");  });

Примечание, строка require может отличаться. Вы должны найти, где ваша система на самом деле положить express. Вы можете сделать это с следующая команда:sudo найти / - имя экспресс

теперь запустите веб-сервер express со следующей командой:узел app.js

На данный момент сервер запущен и работает. Откройте браузер и перейдите на свой ip-адрес (или если вы находитесь на той же машине, что и ваш сервер, 127.0.0.1). Используйте ip-адрес: portnumber\filename.html, где номер порта 5555 в приложении.JS файл, который мы создали.

теперь в этом браузер, вы не должны (и не когда мы его тестировали) иметь какие-либо из этих же проблем больше.


мне жаль говорить вам, что я пытался в течение нескольких недель решить эту проблему (мне это было нужно для проекта), и мой вывод заключается в том, что это невозможно.

есть много проблем вокруг локального доступа через javascript с chrome, и некоторые из них могут быть решены с помощью --allow-file-access-from-files и --disable-web-security, включая некоторые автономные функции HTML5, но я определенно думаю, что нет способа получить доступ к локальным файлам.

, Я рекомендую вам не терять свое время, пытаясь circunvend и попробуйте опубликовать сообщения, которые вы можете интерпретировать на внутренних страницах, чтобы вы могли делать модификации DOM там.


file:// protocol и http: / / protocol заставляют вещи вести себя очень по-разному в отношении iframes. У меня были те же проблемы, которые вы описываете с приложением на PhoneGap, которое использует файловый протокол для доступа ко всем локальным файлам в папке local assets/www.

Если кажется, что современные браузеры предотвращают отображение "локальных" файлов с использованием файлового протокола в iframes по соображениям безопасности.

мы закончили сбрасывать iframes и просто использовать divs в качестве "viewports". К счастью общий размер нашего приложения был не таким большим, поэтому нам удалось загрузить все на одной странице.