Этот вопрос очень похож на полностью обновленную версию вопроса, задаваемого здесь: Как вызвать функцию JavaScript из одного кадра в другой в Chrome / Webkit с файловым протоколом - к сожалению, этот вопрос былна самом деле никогда не отвечал.
У меня есть HTML-страница, которая содержит изображение SVG в iframe.SVG экспортирует API-интерфейс JavaScript, который позволяет ему выполнять полезные функции (сброс в увеличенном и центрированном виде, отображение в «реальном размере»).Под фреймом я поместил кнопки, по которым пользователь может щелкнуть по этому вызову, для функций, определенных в SVG.
Мой код выглядит следующим образом:
function reset() {
document.getElementByID('iframe').contentWindow.reset();
}
Он отлично работает в Safari, Firefox и даже IE 9 (который поддерживает SVG - ура!).Но в Chrome он не работает: отладчик сообщает мне, что:
Property 'reset' of object [object DOMWindow] is not a function
.
И действительно, кажется, в этом есть доля правды: хотя «contentWindow» имеет тип DOMWindow, у него нет методов или полей (по крайней мере, не то, что отладчик покажет мне).Даже запрос на его поле 'document' завершается неудачно (возвращает null).
Проблема заключается в использовании протокола file: // для передачи как содержащего HTML, так и содержащего SVG.Как отмечалось в вопросе, на который я ссылался выше, Chrome выдает следующую ошибку при попытке доступа к 'contentWindow':
Attempt to access frame with URL file://[...]/contained.svg from frame with URL file://[...]/container.html. Domains, protocols and ports must match.
В общем, я считаю, что безопасность велика;это похоже на ограничение безопасности.Но здесь, похоже, зашло слишком далеко: это файлы в файловой системе пользователя, в конце концов, а в моем случае даже в одном каталоге.
Размещение кода не является опцией - он должен находиться на компьютере пользователя.Я бы не хотел говорить людям «просто не пользуйтесь Chrome - у него глупые представления о безопасности».
Нет ли способа обойти это ограничение?