2009-04-09 5 views
1

Я хочу переходное окно, чтобы закрыть себя, когда пользователь нажимает на него. Это работает для Firefox:Самозакрывающиеся всплывающие окна в IE - как получить правильное поведение onBlur?

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

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

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

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

+0

Вы можете настроить событие во всплывающем окне, когда всплывающее окно получает начальный фокус? – scunliffe

+0

Я пробовал это и не мог заставить его работать. Я могу попробовать еще раз. :) –

+0

Настоящая проблема - это событие не работает в IE. –

ответ

2

Я выяснял альтернативу в 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, похоже, не надежно возвращает дескриптор окна при создании новых окон. Поэтому мы должны искать окно по имени, чтобы закрыть его.
0

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

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

Это по существу то, что у меня есть. Он работает для Firefox, но не для IE. IE не запускает событие в соответствующее время. –

1

Try:

document.onfocusout = window.close(); 
+0

Это неправильный документ AFAICT (документ родительского окна). Думаю, я тоже пробовал w.document, и это не сработало. У меня нет IE дома, поэтому я буду проверять завтра. –

+0

Извините. Я предполагал, что у вас есть доступ к странице, которая загружается во всплывающем окне. Этот код пойдет туда. – w4g3n3r