У меня возникла ситуация, когда скрипт на www.example.com/index.html открывает home.example.com/foo.html во всплывающем окне. . Когда пользователь закрывает всплывающее окно, я хочу уведомить открывающую страницу, вызвав на ней функцию Javascript (которая делает несколько вещей с DOM). Я использую unbeforeunload
вот так:
// In index.html on www.example.com:
window.fn = function () { /* Perform stuff after foo.html has closed */ }
// In foo.html on home.example.com:
window.onbeforeunload = function () {
if (window.opener && window.opener.fn)
window.opener.fn();
};
Это не работает, потому что веб-страницы находятся в разных доменах. Я могу установить свойство document.domain
, чтобы преодолеть это:
document.domain = "example.com";
К сожалению, это не очень хорошо сочетается с фреймворком веб-приложений, который я использую на стороне foo.html (Apache Wicket), поскольку он включает скрипт, который делает что-то вроде этого:
var src = (window.location.protocol == 'https:') ? something : other;
По-видимому, в IE6*, когда вы устанавливаете домен документа, объект location
становится доступным только для записи, и поэтому попытка чтения window.location.protocol
выдает "Отказано в доступе".
Итак, мой вопрос: Как мне разрешить междоменные вызовы функций Javascript, в то же время позволяя моим сценариям читать содержимое объекта location
?
- Не могу зайти через сервер. (Работа, выполняемая функцией, которую я хочу вызвать, на самом деле не играет такой роли.)
- Я не могу прочитать свойство
window.location.protocol
перед установкойdocument.domain
, а затем использовать это значение в условном присваивании; для этого мне потребуется перестроить библиотеки веб-фреймворков, а не то, что я хочу делать.
* Возможно и в других версиях IE; не проверял.