2011-04-29 44 views
3

uppity类型开始之前的免责声明:这不会被“野外”部署。这仅适用于Chrome附加组件本地和个人使用。我是而不是尝试欺骗访问者到我的网站或做任何其他不愉快的事。我已经看到了一些对那些想要挂钩的人进行惩罚。防止Gmail关闭/保持可见

一些背景

远远地我最大的Chrome浏览器(至少在Mac OS)的抱怨是,当我有几个选项卡中打开(我通常做)的标签关闭按钮,结果在我由于标签本身变得相当小,因此无意中关闭标签,因此标签关闭按钮未覆盖的点击目标区域非常小。在某些包含新闻报道,博客文章,文档等的标签上,这很烦人,但并不是很大的不便。我只是CMD + T重新打开标签,并没有真正的伤害。不过,某些标签,特别是Gmail,有被封闭的缺点。我经常会与同事打开一个或多个聊天对话框,并重新打开选项卡不会恢复聊天对话框,并且启动新聊天会使我失去当前聊天记录(是的,已保存,但通过在上下文中向后滚动不方便进行访问) 。有几个要求谷歌添加选项来简单地删除标签关闭按钮(我更喜欢使用CMD + W本人),但我并没有屏住呼吸。

部分解决

前阵子一个朋友指出我朝着dotJS Chrome的插件,它允许每个域定制JavaScript执行,类似的GreaseMonkey,但略有不同。无论如何,它给了我一种方法来在我定期访问的许多网站上“解决”问题/想法,而且我发现它迄今为止非常有帮助。有一天,我想我可以通过一些JavaScript来打开我的Gmail等标签页。我将一个基于正则表达式的小脚本放在一起会在关闭标签之前提示您。代码的要点如下:

var unloadHandler = function(e) { 
    if (/(mail.google.com|google.com\/reader|gmail.com)/.test(location)) { 
     return 'Are you sure you want to close: ' + location.host; 
    } 
}; 

window.onbeforeunload = unloadHandler; 

你瞧,这并获得成功的大多数网站我试了一下;除了一个:Gmail。让我纠正一下:它的工作,因为它促使我​​确认关闭Gmail选项卡,如果我选择不关闭它,它会保持选项卡打开,但在对话框提示我之前,页面已完全消失白色。元素检查器显示标记仍然存在(据我所知),并且元素上的样式不应该隐藏东西(即display:none; visibility:hidden;等等),并且元素的位置仍然是正确(例如,它们在可视区域内)。我逐个删除了一些元素,以查看是否有任何内容模糊了Gmail界面,但无法在屏幕上显示它。我不能为了我的生活而弄清楚发生了什么事。我不确定Gmail是否陷入了一些我不知道的事件(在* beforeunload之前开启*),或者如果Google的浏览器在他们的Gmail页面上做了一些特殊的事情,或者是什么导致了奇怪的行为。谷歌阅读器不受这种怪异影响(我可以防止关闭并保留页面内容),就像我测试过的所有其他网站一样。

有谁知道什么可能会导致此问题?

为了记录,我运行以下内容:Mac OS X 10.6.5,Google Chrome 10.0.648.205和dotJS 1.3。我很欣赏任何反馈,但我不在寻找涉及以下方面的解决方案:固定选项卡,更改我的工作流程/使用情况(例如,不用鼠标选择选项卡)等。我真的想弄清楚具体的Gmail (或者可能是Chrome?)这样做是在破坏我在这里的努力。提前致谢。

+0

gmail可能钩入onbeforeunload。即使你钩入相同的事件,gmail的处理程序仍然会被调用,特别是如果它是第一个在列表中。我不确定是否有可能保证您的处理程序将首先被调用,如果可以,您是否可以停止该事件。 onbeforeunload往往被处理与其他事件不同。不知道您是否可以尝试删除页面上现有的onbeforeunload处理程序,以便只执行您的。 – ewh 2011-04-30 16:58:07

回答

2

我认为Gmail自己的代码会导致此行为。我可以使用此功能从控制台订阅此事件重现您的问题(Linux机器上)

window.onbeforeunload = function(e) { 
    return "Hey what\'s wrong with you?!"; 
}; 

它后,我已经开始开发工具探查,关闭窗口后最后一次通话(与选择'留在这个页面上'回答这个问题)是一个removeChild函数调用,它从< iframe id =“canvas_frame”/ >中删除一些内容。所以内容元素不再存在。

function Fc(b) { 
    return b && b.parentNode ? b.parentNode.removeChild(b) : m 
} 

我发现在混淆代码的一些“痕迹”订阅的beforeunload事件,但它很难确定:)

function It(b, a) { 
    this.Qc = jCa++; 
    this.ea = b; 
    this.ka = new J(this); 
    this.Qa = a; 
    this.Ka = []; 
    this.Za = !1; 
    this.ka.ya(this.ea, "unload", this.Da); 
    this.ka.ya(this.ea, "beforeunload", this.ab); 
    Ypa(Zd(a), this); 
    this.ia() 
} 

我试图复制在Firefox此行为,但我认为谷歌为不同的浏览器提供不同的JavaScript代码,所以我不能复制它。