Чтение window.location после установки document.domain в IE(6)

У меня возникла ситуация, когда скрипт на 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; не проверял.


person gustafc    schedule 30.09.2009    source источник


Ответы (2)


Вы можете использовать jQuery? Есть хороший плагин, который позволяет вам делать window.postMessage через iframe в IE 6-8: http://benalman.com/code/test/js-jquery-postmessage/

Вы можете открыть свое всплывающее окно из iframe и передать свой объект между iframe и родителем с помощью postMessage.

person Will Peavy    schedule 04.10.2009
comment
Это, наверное, мой лучший удар. Спасибо. - person gustafc; 07.10.2009

Я не могу прочитать свойство window.location.protocol перед установкой document.domain, а затем использовать это значение в условном присвоении; для этого мне потребуется перестроить библиотеки веб-фреймворков, а не то, что я хочу делать.

вы не можете прочитать window.location.protocol до установки document.domain и установить window.location.protocol, как только он станет доступным только для записи? Потребуется ли для этого также перестройка фреймворка? это хак, но и IE тоже.

person Mohammad    schedule 30.09.2009
comment
К сожалению, это не работает. Он остается только для записи даже после того, как я пишу на него. - person gustafc; 01.10.2009