У меня есть корневая html-страница A (скажем, A.html на foo.com), которая содержит iframe B (скажем B.html на bar.com). iframe B содержит другой iframe C (C.html на foobarfoo.com).window.postmessage для вложенного iframe в кросс-домене
Я пытаюсь уведомить IFrame C, когда пользователь щелкает что-то в родительской странице A.
Так как ребенок плавающих фреймы (B и C) находятся в разных доменах, чем родитель, доступ к свойству Iframe или вызов сценария не является вариантом.
У меня есть контроль над кодом в A.html и C.html и вы можете использовать функцию postmessaging html5 для отправки сообщений. Я попытался отправить postmessage из A в B, который отлично работает, но отправка его непосредственно из A в C - это то, с чем я борюсь.
Если я пытаюсь получить доступ к вложенному iframe C, используя document.parentWindow.frames, я просто получаю только iframe B, а не iframe C. Ожидается ли это?
Если я впервые получил iframe B из DOM, а затем попытаюсь получить iframe C с помощью getElementByID, я получаю доступ к отрицательной ошибке, что очевидно, учитывая, что iframe B находится в другом домене, и запрос его DOM не будет разрешен.
Вот код для обоих вариантов, которые я пробовал ...
Option1
function postMessage1()
{
var message = new Object;
message["MessageId"] = "NewPage";
var messageData = JSON.stringify(message);
var domain = 'http://localhost';
var allFrames = document.parentWindow.frames;
var iframe = allFrames['frameC'];
iframe.postMessage(messageData, domain); -----> iframe is null here as it cannot find any frame with the ID - frameC.
}
Option2
function postMessage2()
{
var message = new Object;
message["MessageId"] = "NewPage";
var messageData = JSON.stringify(message);
var domain = 'http://localhost';
var proxyFrame = document.getElementById("frameB");
var targetFrame = proxyFrame.getElementById("frameC"); ----> Access denied to getElementByID in frame B as it is from a different domain and accessing its DOM is not allowed.
targetFrame.contentWindow.postMessage(messageData, domain);
}
Я пытаюсь найти, если есть это решение, использующее window.postMessage. Любая помощь оценивается.
Я сижу на том же самом. Хотя ваш код верен в том, что он возвращает элемент внешнего окна, я не могу использовать 'postMessage'. Вероятно, потому что я могу получить доступ только к 'window.frames [" local "]. ContentWindow.frames [" foreign "]', когда мне понадобится внешний 'contentWindow' для postMessage. Любая идея, если это доступно вообще? – frequent
@frequent Когда вы говорите, что не можете использовать postmessage в окне - что именно вы подразумеваете под этим? Вызывает ли метод ошибку (и если да - какая ошибка) или метод недоступен? В любом случае вызов метода в iframe «внука» должен быть возможен, поскольку не имеет значения, где в иерархии находится iframe, только для того, чтобы вы могли перейти к нему с использованием свойства 'frames'. + Возможно, у вас есть примерная страница, которую вы используете, чтобы продемонстрировать ошибку? Было бы легче отлаживать. –