4

我在 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');
  }
});

编辑3

其实并没有解决。这个技巧在 IE 中不起作用,甚至来自 javascript:void(0) 链接的触发器也不起作用......

4

3 回答 3

3

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

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

jsfiddle。正如评论者所提到的,这将提醒用于选择的元素的 ID,我只是将其用作示例,因为您没有完全说明您想要检索的内容?

于 2012-09-05T21:53:45.677 回答
2

用于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

于 2012-09-05T21:58:46.127 回答
0

使用target="_blank"也解决了这个问题:

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

它相当难看,但就我而言,它是唯一可以在所有浏览器中完美运行的解决方案。

于 2014-07-24T15:54:09.013 回答