我正在使用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';
});
现在是我的实际前载事件,请注意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)链接...
中触发答案 0 :(得分:3)
您可以使用event.target.id
选择器传递触发事件的元素,如下所示:
$(document).ready(function() {
$("a").click(function(event) {
alert(event.target.id);
});
});
见jsfiddle。 正如评论员所提到的,这将提醒用于选择的元素的ID,我只是用它作为一个例子,因为你没有完全陈述你想要检索的内容?
答案 1 :(得分:2)
使用alert
显示事件之类的对象是相当无用的。
为什么不尝试将活动发送到控制台?
function(event) {
console.log(event);
}
通过这种方式,您可以扩展事件对象,并在树状结构中查看它。
编辑根据您对事件触发器位置的评论:我没有对此进行测试,但这可能是停止卸载事件的一种方法。
a
元素的点击事件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");
}
}
请注意,此示例使用的是调用事件命名空间的内容。通过指定我们想要监听beforeunload
事件,但我们有自己的名为override
的命名空间,我们可以安全地添加和删除事件处理程序,而无需删除beforeunload
的所有其他侦听器事件
答案 2 :(得分:0)
如果您想了解有关活动的所有信息,可以按照@Aesthete的建议
$('#id').click(function(e){
console.log(e)
});
然后,您可以查看控制台并检查输出事件。
答案 3 :(得分:0)
使用target="_blank"
也解决了这个问题:
<a href="skype:your_skype_name?call" target="_blank">
它相当难看,但就我而言,它是唯一能够在所有浏览器中完美运行的解决方案。