JS: «Вызываемый (сервер [не серверное приложение]) недоступен и исчез». доступ к window.opener - PullRequest
14 голосов
/ 01 октября 2010

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

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

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

  3. Stray Cosmic Rays.Возможно, но не вероятно.Это слишком непротиворечиво.

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

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

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

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

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

Ответы [ 4 ]

11 голосов
/ 16 мая 2013

Хотя мой ответ не имеет прямого отношения к данному конкретному вопросу, если вы получаете эту ошибку ( Вызываемый (сервер [не серверное приложение]) недоступен и исчез; ) при обмене всплывающее окно и открывающее окно, потому что во всплывающем окне создан объект, который затем передается открывающему окну. Когда всплывающее окно закрыто, 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);
};

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

6 голосов
/ 07 октября 2010

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

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

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

2 голосов
/ 07 октября 2010

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

Надеюсь, это кому-нибудь поможет ...

0 голосов
/ 17 мая 2013

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

Sub LoadParameterForm()

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

frmParm.Show
end sub 

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...