触发一次后关闭事件监听器

Jas*_*son 2 javascript jquery

我有一个脚本触发弹出框提供免费下载.它会在用户的鼠标离开页面时触发(显然不适用于移动设备 - 我已经有了一个可行的解决方案).在我的脚本中,我设置了一个cookie来停用脚本30分钟,那部分有效; 如果我刷新页面,弹出窗口不再显示.

问题是,如果有人关闭了弹出框,并且没有刷新页面(或导航到网站上的另一个页面),则每次鼠标移出页面时都会发生弹出框.

我正在使用一个设置事件的函数,但我不能只激活一次.(我正在使用的Wordpress网站使用的是jquery ver = 1.10.2.)

我的Javascript:

if (document.cookie.indexOf('somecookiename') != -1) {
  function addEvent(obj, evt, fn) {
    if (obj.addEventListener) {
      obj.addEventListener(evt, fn, false);
    } else if (obj.attachEvent) {
      obj.attachEvent("on" + evt, fn);
    }
  }
};
jQuery(document).ready(function($) {
  if (document.cookie.indexOf('somecookiename') == -1) {
    //var thirtyminutes = 1000*60*30;
    var thirtyminutes = 1000 * 60;
    var expires = new Date((new Date()).valueOf() + thirtyminutes);
    document.cookie = "somecookiename;expires=" + expires.toUTCString();

    addEvent(document, "mouseout", function(e) {
      e = e ? e : window.event;
      var from = e.relatedTarget || e.toElement;
      if (!from || from.nodeName == "HTML") {
        document.getElementById("preview-download").style.display = "block";
        document.getElementById("back-shader").style.display = "block";
      }
    });
  }
});

function showhide(id) {
  if (document.getElementById) {
    obj = document.getElementById(id);
    if (obj.style.display == "none") {
      obj.style.display = "";
    } else {
      obj.style.display = "none";
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

HTML:

<div id="back-shader" class="popover2">
  <div id="preview-download" class="popover2">
    <h4>BEFORE YOU GO:</h4>
    <h5>Download A Free Preview....</h5>
    <a href="http://website.com/document.pdf" id="preview-pdf">Download Now</a>
    <a href="#" id="closer" onclick="showhide('back-shader'); return(false);"></a>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

CSS:

#back-shader,
#preview-download {
  display: none;
}
Run Code Online (Sandbox Code Playgroud)

它可能很简单,但我不是一个JavaScript专家.一如既往,感谢您的帮助.

Ori*_*iol 11

最简单的方法是使用removeEventListener以下方法删除事件侦听器:

document.addEventListener("mouseout", function handler(e) {
    e.currentTarget.removeEventListener(e.type, handler);
    /* whatever */
});
Run Code Online (Sandbox Code Playgroud)

document.addEventListener("click", function handler(e) {
  e.currentTarget.removeEventListener(e.type, handler);
  alert('Only once');
});
Run Code Online (Sandbox Code Playgroud)
Click somewhere
Run Code Online (Sandbox Code Playgroud)

  • 我同意这是要走的路,请注意您需要为函数命名。如果你声明一个匿名处理程序,它将不起作用:`element.addEventListener('click', function(){})` (2认同)