JS: "Вызов (сервер [не серверное приложение]) недоступен и исчез". доступ к окну .opener

В нашем (довольно большом и старом) приложении ASP.NET мы используем много страниц, загружаемых в фреймы, iframe и модальные диалоги (используя window.showModalDialog). Мы начинаем видеть ошибку выше совсем немного, и я не могу найти ни единого рационального объяснения для нее где-нибудь.

  • Блокировщики всплывающих окон. Неа. Мы не запускаем их. Даже встроенный блокатор.

  • Доверенная зона. Неа. Приложение работает на LocalHost прямо сейчас, и оно находится в списке доверенных сайтов.

  • Бродячие космические лучи. Возможно, но не вероятно. Это слишком непротиворечиво.

В конце концов я нашел сообщение об ошибке, заложенное на веб-сайте Microsoft в несколько пыльных томов о получении информации об ошибках автоматизации автоматизации. В нем говорилось о Excel, и они сказали: "В этом примере Microsoft Excel является серверным приложением. Ссылка на объект рабочей книги после его уничтожения (или закрытия) создает ошибку."

Это, вероятно, так близко, что я когда-либо объяснял причину ошибки, без реального, конкретного объяснения. Кто-то пытался что-то использовать после того, как их ссылка на него была удалена. Как ни странно, вы все равно можете видеть окна на экране. Любопытно, однако, что это подозрительно относится ко мне с принятым ответом на this.

Итак, вот что происходит.

  • Страница A - главная страница.
  • PageA отображает PageB в кадре. PageB - это панель инструментов.
  • PageA отображает страницу C в другом кадре. Это содержимое.
  • PageC отображает PageDD в немодальном диалоге.
  • PageDD, по неизвестным мне причинам, хочет изменить элементы управления в PageB. Он пытается использовать window.opener для этого и терпеть неудачу.

Если бы кто-нибудь мог рассказать мне, почему это так (код работает в FF), я был бы признателен.

Ответы

Ответ 1

Я должен был обновить этот вопрос раньше, и прошу прощения за задержку. Я узнал немного с тех пор, как я разместил его, и вот что я узнал.

Для окон, открытых с помощью window.showModalDialog, метод window.opener возвращает null, а не ссылку на открывающее окно. Чтобы получить ссылку на открытое окно, вы должны передать его в качестве аргумента диалога.

Мне непонятно, в данный момент, является ли это предполагаемым поведением; это, видимо, недокументированное поведение. Кроме того, согласно MSDN, window.opener действует только для страниц, загружаемых в фреймы и фреймы.

Ответ 2

Хотя мой ответ напрямую не применим к этому конкретному вопросу, если вы получаете эту ошибку (Вызов (сервер [не серверное приложение]) недоступен и не исчезает;) при общении между всплывающим окном и открывающимся окном, потому что всплывающее окно создало объект, который затем передал в открывающееся окно. Когда всплывающее окно закрыто, Internet Explorer убивает все объекты, созданные всплывающим окном. И поскольку объект передается по ссылке, объект, к которому ссылается окно открывающего окна, теперь исчез. Легким обходным путем является передача значения путем преобразования объекта в строку JSON с использованием JSON.stringify. Затем вы можете преобразовать строку обратно в объект в window.opener с помощью JSON.parse().

Пример:

Всплывающее окно:

window.opener.callback(JSON.stringify({
    id: 1,
    name: "foo"
}));

Окно открывателя:

window.callback = function (response) {
    var foo = JSON.parse(response);
};

Используя этот подход, открывающее окно больше не ссылается на объект, который был создан во всплывающем окне, поэтому объект в открывающемся окне сохранится после закрытия всплывающего окна.

Ответ 3

У меня было то же сообщение об ошибке в следующем сценарии: window Всплывает ветер B, пользователь что-то ищет, а ветер B называет ветер A, пропускающим некоторый параметр. Метод, называемый ветром. Предположим закрыть всплывающий ветер B после того, как он закончит делать то, что он делает. Я передавал параметр как объект: p = {a: 1, b: "c" } после того, как я переписал код для прохождения каждого параметра, отдельная ошибка исчезла. callingMethod (1, "с" );

Надеюсь, что кто-то поможет...

Ответ 4

вы можете получить эту ошибку в excel

Sub LoadParameterForm()

If frmParm Is Nothing Then
    Set frmParm = New frm_setParameters
End If

frmParm.Show
end sub 

Здесь frmParm - это переменная уровня модуля. Нажав кнопку "ОК", я намерен создать форму .HIDE(), чтобы пользовательские варианты были липкими. Если пользователь нажимает на блок управления X и закрывает форму, вы, по существу, имеете frmParm, указывающий на то, что больше не существует.

Я не нашел способ проверить условие, я ловушка для ошибки, не устанавливаю форму в ничто и повторю попытку.

Я понимаю, что это не совсем тот вопрос, который задают, но это конкретный пример связанной проблемы excel, упомянутой несколько раз в сообщениях.