Самозакрывающиеся всплывающие окна в IE — как добиться правильного поведения onBlur?

StackOverflow https://stackoverflow.com/questions/735992

Вопрос

Я хочу, чтобы временное окно закрывалось, когда пользователь от него отходит.Это работает для Firefox:

var w = window.open(...);
dojo.connect(w, "onblur", w, "close");

но, похоже, он не работает в Internet Explorer.Некоторые другие сайты ссылались на событие onfocusout, специфичное для IE, но я не смог найти внятного рабочего примера того, что мне нужно.

Что говорит Stack Overflow о лучшем способе закрытия окон браузера IE, когда они теряют фокус?

Я использую Dojo, поэтому, если в этой библиотеке есть какой-нибудь ярлык, буду приветствоваться.В противном случае лучшим ответом будут стандартные вызовы IE.

Это было полезно?

Решение

Я нашел альтернативу в IE.

Этот:

        that.previewWindowAction = function () {
            var pw =
                window.open(this.link, "preview",
                            "height=600,width=1024,resizable=yes,"
                            + "scrollbars=yes,dependent=yes");
            dojo.connect(pw, "onblur", pw, "close");
        };

для работы в IE следует написать так:

        that.previewWindowAction = function () {
            var pw =
                window.open(this.link, "preview",
                            "height=600,width=1024,resizable=yes,"
                            + "scrollbars=yes,dependent=yes");
            if (dojo.isIE) {
                dojo.connect
                    (pw.document,
                     "onfocusin",
                     null,
                     function () {
                         var active = pw.document.activeElement;
                         dojo.connect
                             (pw.document,
                              "onfocusout",
                              null,
                              function () {
                                  if (active != pw.document.activeElement) {
                                      active = pw.document.activeElement;
                                  } else {
                                      window.open("", "preview").close();
                                  }
                              });
                     });

            }
            else {
                dojo.connect(pw, "onblur", pw, "close");
            }
        };

Причины?

  • В IE объекты окна не реагируют на события размытия.Поэтому мы должны использовать собственное событие onfocusout.
  • В IE onfocusout отправляется большинством HTML-элементов, поэтому мы должны добавить некоторую логику, чтобы определить, какой именно onfocusout вызван потерей фокуса окна.В onfocusout атрибут activeElement документа всегда отличается от предыдущего значения — кроме когда само окно теряет фокус.Это сигнал закрыть окно.
  • В IE документы в новом окне отправляют onfocusout при первом создании окна.Поэтому мы должны добавлять обработчик onfocusout только после того, как он оказался в фокусе.
  • В IE window.open, похоже, не возвращает дескриптор окна надежно при создании новых окон.Поэтому мы должны найти окно по имени, чтобы закрыть его.

Другие советы

Пытаться:

document.onfocusout = window.close();

Вы можете попробовать это как часть блока кода, специфичного для IE:

w.onblur = function() { w.close();};
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top