$(window).focus()在Chrome中无法正常执行

时间:2016-07-18 13:25:40

标签: javascript jquery events focus onblur

我想跟踪页面上AdSense元素的点击次数。为了达到这个目的,我把重点放在了窗口对象上,如果失去焦点,我会检查鼠标是否在AdSense iFrame区域。然后我再次把焦点放回窗口。

这很有效。但在Chrome中它只能运行一次。因此,如果我点击adSense广告(在新标签页中打开)然后点击另一个广告,则该事件不会再触发。

如果我在控制台中执行$(window).focus(),onBlur事件会再次触发 - 但是从我的代码中执行的$(window).focus()没有显示任何效果。我也尝试了Timeout,没有成功。

有什么想法吗?

trackElements("#contentAdSense, #fallbackAdSense, #sidebarAdSense");

function trackElements (elementsToTrack) 
{
  var isOverElement = false;

  $(window).focus();

  $(elementsToTrack).mouseenter(function(e){
      isOverElement = e.currentTarget.id;
  });

  $(elementsToTrack).mouseleave(function(e){
       isOverElement = false;
  });

  $(window).blur(function(e){
      windowLostBlur();
  });

  function windowLostBlur () 
  {
      if (isOverElement) 
      {
          console.log(isOverElement);
          $(window).focus();
      }
  };

};

简化版:https://jsfiddle.net/327skdns/2/

1 个答案:

答案 0 :(得分:1)

这是一个记录在案的Chrome错误:jQuery focus not working in Chrome

您需要使用setTimeout包装focus()来电:

trackElements("#contentAdSense, #fallbackAdSense, #sidebarAdSense");

function trackElements (elementsToTrack) 
{
    var isOverElement = false;

    $(window).focus();

    $(elementsToTrack).mouseenter(function(e){
      isOverElement = e.currentTarget.id;
    });

    $(elementsToTrack).mouseleave(function(e){
       isOverElement = false;
    });

    $(window).blur(function(e){
      windowLostBlur();
    });

    function windowLostBlur () 
    {
      if (isOverElement) 
      {
          console.log(isOverElement);
          setTimeout( function(){ $(window).focus(); }, 50 );
      }
    };
}