HTML, отображаемый с использованием Data URI, не может получить доступ к относительным путям
У меня есть строка HTML со мной, как это:
var str = "<html><head><link href='abc.css'/><script src='js/a.js'></script><title>hello</title></head><body><div><img src='images/abcd.png'></div></body></html>";
Теперь мне нужно показать этот HTML-код в iframe, поэтому я должен установить iframe src следующим образом:
document.getElementById('frameID').setAttribute('src', "data:text/html, " + str);
Теперь проблема в том, что приведенный выше html требует некоторых ресурсов с использованием относительных путей, к которым невозможно получить прямой доступ.
Хотя у меня все ресурсы, необходимые для строки / файла HTML, хранятся в индексированной БД в виде пар ключ-значение, причем ключ - это путь, а значение - данные файла.
Я пытался сделать это, установив onload
событие в моем iframe, а затем в обработчике я пытаюсь получить доступ к contentWindow
из iframe, но это имеет некоторые проблемы с безопасностью (поскольку источники не совпадают). Получив contentWindow, я мог бы манипулировать тегами img и script.
Есть ли способ получить доступ к этим ресурсам после настройки iframe src
как я показал выше?
Пожалуйста, помогите, я застрял в течение длительного времени.
2 ответа
Что вы ожидали -- какие [базовые URL-адреса] являются [относительными] URL-адресами, представленными в HTML-документе, который вы загружаете с URL-адресом, который, как ожидается, будет относительным к ?
Ресурс, загруженный с помощью пользовательского агента, не имеет «базы» для всех намерений и целей, а также отдельного органа (и , кстати, origin), который не сравнивается с любым другим.
В каком-то смысле это «эфемерный» документ — если документ использует URL-адреса (URL-адрес не является «путем» [файла], хотя, строго говоря, он может содержать имя пути), которые не имеют полномочий (т. е. они являются так называемыми «относительными» URL-адресами), их нельзя использовать на практике, потому что пользовательский агент не принимает на себя никаких полномочий (т. е. часть домена) или какой-либо префикс имени пути. Аналогией может быть название улицы и номер дома, но без кода города и страны.
Пользовательский агент не использует источник или URL-адрес документа, который включал сценарий, загружающий документ с использованием относительных URL-адресов, в качестве «базового» URL-адреса для документа, загруженного со схемой. Вместо этого предполагается, что исходный и базовый URL-адрес для последнего отличаются от любого другого URL-адреса, использующего схему, и это предусмотрено дизайном — два ресурса, загруженные каждым из них, не имеют одного и того же источника и, следовательно, не считаются «принадлежащими». на тот же домен». Это в немалой степени мотивировано соображениями безопасности — любой скрипт (загруженный из случайного домена) может создать URL-адрес и загрузить какой-либо документ, что не означает, что два таких документа имеют какое-либо отношение друг к другу или должны принадлежать одному и тому же. происхождение/домен.
Есть решение, хотя я бы сказал, что это проблема XY — используйтеbase
HTML-элемент в загружаемом документеdata:
-- чтобы пользовательский агент разрешал относительные URL-адреса, используя указанный «базовый» URL-адрес.
Я хотел бы прокомментировать тот же вопрос, но не могу комментировать. Я могу только сказать, что даже если вы добавите "./", "~/" или "../" к путям, например, создав "~/js/a.js", это не будет работать для data-uri, потому что похоже, что он не может ссылаться на базовый html, к которому вы хотите перейти.
Исследования продолжаются...