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, упомянутой несколько раз в сообщениях.