繁体   English   中英

如何准确找出引发事件的原因?

[英]How to find out precisely what triggered the event?

我在jQuery中使用了一些功能,例如:

$(window).one('beforeunload', function() {
//my code
});

但我真的很想了解引发此事件的原因和方式。

我尝试了以下代码:

$(window).one('beforeunload', function(e) {
alert(JSON.stringify(e));
});

但是它提出了关于圆形结构的例外。 当然,必须有其他方法可以通过它进行区分和调试。

我要如何申请?

我想看看是什么触发了此事件,是链接,提交的表单,javascript,页面刷新还是来回按钮等等,在这种情况下一切都很好。 但是,如果它是由打开外部应用程序的调用触发的,我想放弃该事件并返回null。

外部应用程序启动的示例:

<a href="skype:your_skype_name?call" >

有任何想法吗?

解决了

这就是我解决的方法。

我只是先建立一些脚本链接,以获取对该事件的更多控制权:

<a href="javascript:void(0)" id="skype_click_ok"

然后,我创建一个全局变量来存储beforeunload的状态:

var dontunload=0;

然后,我手动处理链接,但是设置location.href并更改变量状态:

$('#skype_click_ok').click(function(){
dontunload=1;
location.href='skype:marilynbrusas?call';
});

现在我实际的beforeunload事件,请注意one()也更改为bind()

$(window).bind('beforeunload', function() {
  if (dontunload==1) dontunload=0;  //if triggered from our skype - do nothing, yet  cancel state for the next call
  else {  //Do the actual code
          // Fade out, before leaving the page.
      $('html#my_html').stop(true,false).css('overflow','hidden').animate({opacity:0},2000);
      // Lock content with invalid image hack
          $('body#my_body').prepend(
        $('<div>').attr({style:'position:fixed;height:100%;width:100%;left:0;top:0;z-index:900100;background-image:url(in-your-face)'})
      );
          // unbind the event
      $(this).unbind('beforeunload');
  }
});

EDIT3

其实还没有解决。 这个技巧在IE中不起作用,javascript:void(0)链接中的偶数触发器也无法使用...

您可以使用event.target.id选择器传递触发事件的元素,如下所示:

$(document).ready(function() {
    $("a").click(function(event) {
        alert(event.target.id);
    });
});

参见jsfiddle 正如评论员提到的那样,这将提醒用于选择的元素的ID,我只是以它为例,因为您没有完全说明要检索的内容?

使用alert来显示事件之类的对象是毫无用处的。

为什么不尝试将事件发送到控制台

function(event) {
    console.log(event);
}

这样,您可以展开事件对象并以树状结构查看它。

编辑根据您对事件触发器的位置的评论:我尚未对此进行测试,但这可能是停止卸载事件的一种方式。

  • 监听所有点击事件的a元素
  • 检查单击的元素是否指向外部应用程序(不是以http://开头)
  • 如果不是,请为beforeunload绑定事件处理程序,以立即取消事件
  • 否则,取消绑定先前的处理程序

     $("a").click(function(event) { if(event.target.href.indexOf("http://") != 0) { $(window).on("beforeunload.override", function(e) { // Stop the 'beforeunload' event. return false; } } else { $(window).off("beforeunload.override"); } } 

请注意,此示例使用的是所谓的Event Namespacing 通过指定我们要侦听beforeunload事件,但我们拥有自己的命名空间override ,我们可以安全地添加和删除事件处理程序,而无需删除beforeunload事件的所有其他侦听器。

如果您想了解有关活动的所有信息,可以按照@Aesthete的建议进行。

$('#id').click(function(e){
         console.log(e)
          });

然后,您可以查看控制台并检查输出事件。

使用target="_blank"可以解决此问题:

<a href="skype:your_skype_name?call" target="_blank">

这很丑陋,但就我而言,这是唯一可在所有浏览器上完美运行的解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM