Окно Javascript onblur срабатывает при нажатии кнопки Facebook Like

У меня есть всплывающее окно, которое отображает некоторый контент и кнопку facebook. Всплывающее окно закрывается на window.onblur. Однако, когда я нажимаю кнопку facebook, она обрабатывает это как событие размытия и закрывает всплывающее окно, даже не любя его. Что я могу сделать?

Вот мой код кнопки facebook в соответствии с инструкциями facebook (также есть метаданные в заголовке):

<div id="fb-root"></div>
<script>
(function(d, s, id) {
      var js, fjs = d.getElementsByTagName(s)[0];
      if (d.getElementById(id)) return;

      js = d.createElement(s); js.id = id;
      js.src = "http://connect.facebook.net/en_US/all.js#xfbml=1";

      fjs.parentNode.insertBefore(js, fjs);
    }

(document, 'script', 'facebook-jssdk'));

</script>
<div class="fb-like" data-href="http://www.google.com" data-send="false" data-width="450" data-show-faces="true" data-font="arial"></div>

и мое первоначальное размытие:

    <script> 
         setTimeout(setOnBlur,500);  
          function setOnBlur(){window.onblur = closeWin;}  
          function closeWin(e){window.close();}  
</script>

Либо что я делаю неправильно, что нажатие на тег div facebook вызывает событие размытия, либо как я могу сделать так, чтобы этого не происходило?


person Nick    schedule 06.03.2012    source источник


Ответы (2)


Кнопка Facebook like обычно заключена в iframe. Фокусировка другого iframe приводит к размытию текущего окна. AFAIR, есть способ включить кнопку «Мне нравится» в Facebook, а не iframe. Однако не мог вспомнить, как это сделать.

Чтобы игнорировать фокус, потерянный для какого-то iframe (не уверен, что это сработает)

window.onblur = function(e) {
    var t = e.target;
    if ((t.window == t) // this is a window
     && (t != window)) // but some other window
        return true;
    closeWin();
}
person kirilloid    schedule 06.03.2012
comment
Что ж, facebook дает вам варианты для html5 и iframe, а приведенный выше код — это версия html5. Я полагал, что версия iframe определенно попадет в onblur, хотя - person Nick; 07.03.2012
comment
Хм. А что такое arguments[0].target в обратном вызове onblur? - person kirilloid; 07.03.2012
comment
При снабжении онблура функцией (closeWin) и размещении в нем этого кода: function closeWin(e){alert(arguments[0].target); } Я получаю объект DomWindow - person Nick; 07.03.2012
comment
А что такое e.location.href? - person kirilloid; 07.03.2012
comment
Мои извинения, e.location.href ничего не возвращает. Он даже не отправляет пустое предупреждение - person Nick; 07.03.2012
comment
Скорее всего, это связано с ограничением безопасности. Обычно ничего нельзя прочитать из окна другого URL. Похоже это кадр) - person kirilloid; 07.03.2012
comment
Да, я подтвердил это, предупредив document.activeElement.nodeName, и он вернулся в IFRAME в chrome. Интересно, что в firefox он возвращается как BODY, что означает, что я не могу просто использовать оператор if, определяющий, является ли он iframe, и не закрывать его... есть ли у меня какие-либо варианты? - person Nick; 07.03.2012
comment
Вы можете сравнить это Object DomWindow с текущим окном. Если не равно, это iframe, и просто игнорируйте это событие (return true;) - person kirilloid; 07.03.2012
comment
Через простое сравнение? (если (аргументы [0]. цель == окно))? Это всегда равно, когда я проверяю это' - person Nick; 07.03.2012
comment
да. Но вам нужно проверить, на самом деле это тоже окно в коде - person kirilloid; 07.03.2012
comment
давайте продолжим это обсуждение в чате - person kirilloid; 07.03.2012

Вам нужно это проверить - event.stopPropogation()

Происходит всплытие событий, и вам нужно с этим справиться.

person Vivek Chandra    schedule 06.03.2012
comment
Где это нужно обрабатывать...? Если я вызову его перед window.close(), всплывающее окно не закроется. Если я вызову его после, то он закроется до того, как перестанет пузыриться. И я не вижу очень много других мест, чтобы справиться с этим. - person Nick; 07.03.2012