Я хочу відкрити діалогове вікно JQuery UI з iframe, але я не хочу, щоб діалогове вікно було дитиною iframe. Я хочу, щоб вона була дитиною у верхньому вікні.
Це питання було запитав раніше, але я не можу знайти два відповідізадовільний для моєї ситуації. Що робить мою ситуацію іншою є те, що мій iframe знаходиться з іншого домену, ніж у верхньому вікні. Вони використовують один і той же хост, але різні протоколи. Iframe подано за протоколом https, а верхнє вікно - за адресою http.
The відповісти з більшістю голосів (від @Dmitry) каже, що використовувати jQuery
об'єкт з верхнього вікна, щоб відкрити діалогове вікно. подобається це:
window.top.jQuery.dialog(...);
Це працює, коли iframe та верхнє вікно знаходяться з одного домену, але коли вони не є, виникає наступна помилка:
Error: Permission denied to access property "jQuery"
The вибрана відповідь (за @CalebD) пропонує наступне:
Перемістіть ваш JavaScript таким чином, щоб він виконувався в контексті батьківський документ
Але це не роз'яснює, як це можна досягти. Єдиний спосіб, яким я бачу це, полягає в тому, щоб iframe викликав подія на document
об'єкт верхнього вікна, але це знову викликає помилку, коли в iframe використовується інший домен, ніж верхнє вікно.
Тепер мій компроміс - використовувати такий код, щоб отримати найвищий вікно, яке можна використовувати.
var topWindow = (function() {
var topW = window;
while (topW.parent != topW.self) {
try {
var document = topW.parent.document; // Test
topW = topW.parent;
} catch(e) {
return topW.self;
}
}
return topW.self;
})(),
Тоді я можу використовувати:
topWindow.jQuery.dialog(...);
Звичайно, якщо в iframe використовується інший домен, діалогове вікно є дитиною iframe, але принаймні, він працює так, як я хочу, коли iframe знаходиться з одного домену.
Чи є спосіб відкрити діалогове вікно з iframe, щоб він був дитиною у верхньому вікні, коли IFRAME і верхнє вікно знаходяться з різних доменів? Чи є щось я можу зробити краще, ніж я?
Відповіді:
1 для відповіді № 1Одна політика щодо походження не дозволяє вам взаємодіяти з цією сторінкою.
Вам потрібно буде керувати обома доменами та використовувати їх window.postMessage () щоб передавати деталі з однієї сторінки в іншу на що робити. На батьківській сторінці слід прослухати повідомлення та знати, як відкрити діалогове вікно.
1 для відповіді № 2
Використовуйте postMessage()
. Він схожий на події, але працює поперемінно. Це майже єдиний спосіб дозволити двом фреймам з різних доменів спілкуватися, оскільки це повинно бути узгодженою (треба знати, що приходить повідомлення, можна було б завідомо послати повідомлення).