Самозакрывающиеся всплывающие окна в IE - как правильно настроить поведение onBlur - PullRequest
1 голос
/ 10 апреля 2009

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

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

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

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

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

Ответы [ 3 ]

2 голосов
/ 10 апреля 2009

Я разобрался с альтернативой в 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 атрибут activeElement документа всегда отличается от предыдущего значения - , за исключением , когда само окно теряет фокус. Это сигнал для закрытия окна.
  • В IE документы в новом окне отправляют onfocusout при первом создании окна. Поэтому мы должны добавлять обработчик onfocusout только после того, как он был в фокусе.
  • В IE window.open не может надежно возвращать дескриптор окна при создании новых окон. Поэтому мы должны посмотреть в окне по имени, чтобы закрыть его.
1 голос
/ 10 апреля 2009

Попробуйте:

document.onfocusout = window.close();
0 голосов
/ 10 апреля 2009

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

w.onblur = function() { w.close();};
...