Это браузеры, специфичные для WebKit (это означает, что мне нужно, чтобы он работал только в WebKit, то есть в браузерах iOS / Android, но я тестирую в Chrome).
У меня есть страница.Страница загружает один или несколько фреймов с содержимым из другого домена.Мне нужно получать сообщения (используя postMessage ()) от этих iframes, и я должен быть в состоянии определить, из какого iframe пришло конкретное сообщение.
Я не могу найти способ сделать это, что невключает в себя передачу чего-то URL-адреса iframe, чтобы содержимое iframe затем могло быть передано мне.Я не хотел бы вмешиваться в URL, так как нет гарантии, что я смогу это сделать безопасно (например, перенаправления могут выбрасывать параметры).
Я попробовал что-то, что мне показалось разумным.Когда я создаю элемент iframe (это сделано из J / S), я связал свойство с элементом, скажем, «shared_secret».Когда я получаю событие сообщения обратно из фрейма, я попытался найти элемент, с которым был создан вызывающий фрейм, и прочитать это свойство.
function onMessage(evt) {
var callerId = evt.source.frameElement.shared_secret;
// ....
}
window.addEventListener(message, onMessage);
var frameEl = document.createElement('iframe');
frameEl.shared_secret = 'sommething blue';
frameEl.src = 'http://aliens.com/my.html';
somewhereInMyDoc.appendChild(frameEl);
Когда фрейм загрузится, он запустится:
window.parent.postMessage('do you know who I am?', '*');
Однако, frameElement оказывается неопределенным в вышеупомянутом onMessage ().Я полагаю, по соображениям безопасности, он отлично работает, когда родитель / ребенок находятся в одном домене.
И на самом деле это иронично.Родительское окно не может получить доступ к event.source.frameElement, потому что event.source является чужим окном.Окно iFrame не может вызвать window.frameElement, потому что frameElement находится в чужом окне.Так что никто не может получить к нему доступ.
Итак, есть ли что-то, что я могу использовать в качестве токена, который я могу установить для недавно загруженного фрейма и каким-то образом получить обратно?