Javascript 防止Gmail关闭/保持可见

Javascript 防止Gmail关闭/保持可见,javascript,google-chrome,gmail,onbeforeunload,dotjs,Javascript,Google Chrome,Gmail,Onbeforeunload,Dotjs,在中开始使用傲慢类型之前的免责声明:这不能“在野外”部署。这只供Chrome插件在本地和个人使用。我不是试图欺骗我网站的访问者或做任何其他令人讨厌的事情。我看到过一些对那些想在卸货前上钩的人的惩罚 一些背景 毫无疑问,我对Chrome(至少在Mac OS上)最大的不满是它的tab close按钮,当我打开几个选项卡时(就像我通常做的那样),这会导致我经常无意中关闭选项卡,因为选项卡本身变得相当小,因此tab close按钮没有覆盖的点击目标区域非常小。在某些标签页上显示新闻故事、博客文章、文档等

在中开始使用傲慢类型之前的免责声明:这不能“在野外”部署。这只供Chrome插件在本地和个人使用。我不是试图欺骗我网站的访问者或做任何其他令人讨厌的事情。我看到过一些对那些想在卸货前上钩的人的惩罚

一些背景

毫无疑问,我对Chrome(至少在Mac OS上)最大的不满是它的tab close按钮,当我打开几个选项卡时(就像我通常做的那样),这会导致我经常无意中关闭选项卡,因为选项卡本身变得相当小,因此tab close按钮没有覆盖的点击目标区域非常小。在某些标签页上显示新闻故事、博客文章、文档等。这很烦人,但不是一个巨大的不便。我只是用CMD+T重新打开标签,没有造成任何实际伤害。然而,某些标签,尤其是Gmail,关闭后会有明显的负面影响。我经常与同事打开一个或多个聊天对话框,重新打开选项卡不会恢复聊天对话框,启动新聊天会丢失当前聊天历史记录(是的,它已保存,但无法通过在上下文中向后滚动方便地访问)。有少数人要求谷歌添加选项,只需删除选项卡关闭按钮(我自己更喜欢使用CMD+W),但我不会对此屏息以待

部分解决方案

不久前,一位朋友向我介绍了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标签,如果我选择不关闭它,它会保持标签打开,但在对话框提示我之前,页面已经完全变白了。Element inspector显示标记仍然存在(据我所知),元素上的样式不应该隐藏内容(即显示:无;可见性:隐藏等),元素的位置仍然正确(例如,它们位于可视区域内)。我一个接一个地删除元素,看看是否有什么东西模糊了Gmail界面,但始终无法在屏幕上显示出来。我一辈子都搞不清楚发生了什么事。我不确定Gmail是否与我不知道的某个事件有关(on*before*beforeunload?),或者谷歌浏览器是否对他们的Gmail页面做了一些特殊的操作,或者是什么导致了这种奇怪的行为。谷歌阅读器不受这种奇怪现象的影响(我可以阻止关闭并保留页面内容),我测试过的所有其他网站也是如此

有人知道是什么导致了这个问题吗

为了记录在案,我正在运行以下操作系统:MacOSX10.6.5、GoogleChrome10.0.648.205和DotJS1.3


我很感激任何反馈,但我不想寻找涉及以下内容的解决方案:固定标签、更改我的工作流程/使用情况(例如,不使用鼠标选择标签)等等。我真的想弄清楚Gmail(或者Chrome?)正在做什么,这会破坏我在这里的努力。提前感谢。

我认为Gmail自己的代码导致了这种行为。通过使用此函数从控制台订阅此事件,我可以重现您的问题(在linux计算机上)

window.onbeforeunload = function(e) {
    return "Hey what\'s wrong with you?!";
};
在我启动开发人员工具档案器之后,关闭窗口(并选择问题的“停留在此页面”答案)后的最后一个调用是removeChild函数调用,它从中删除一些内容。因此,内容元素不再存在

function Fc(b) {
    return b && b.parentNode ? b.parentNode.removeChild(b) : m
}
在订阅beforeunload事件的模糊代码中,我发现了一些“痕迹”,但很难确定:)


我曾试图在Firefox中重现这种行为,但我认为谷歌为不同的浏览器提供了不同的javascript代码,因此我无法重现这种行为。

gmail可能会在卸载之前挂接到onbeforeunload。即使你钩住同一个事件,gmail的处理程序仍然会被调用,特别是如果它是列表中的第一个。我不确定是否可以保证首先调用处理程序,如果可以,是否可以停止事件。onbeforeunload的处理方式往往不同于其他事件。不确定是否可以尝试删除页面上现有的onbeforeunload处理程序,以便只执行您的处理程序。
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()
}