阻止Gmail关闭/保持可见性

时间:2011-04-29 16:17:04

标签: javascript google-chrome gmail onbeforeunload dotjs

在ppp类型开始之前的免责声明:这不是“在野外”部署。这仅供Chrome附加组件本地个人使用。我尝试欺骗访问我的网站或做任何其他令人讨厌的事情。我已经看到了那些想要挂钩onbeforeunload的人的惩罚。

一些背景

我对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标签,如果我选择不关闭它,它会保持标签打开,但在对话框提示我之前,页面已完全消失白色。元素检查器显示标记仍然存在(据我所知),元素上的样式不应该隐藏事物(即显示:无;可见性:隐藏;等),元素的定位仍然存在正确(例如,它们在可视区域内)。我经历了逐个删除元素,看看是否有什么东西遮挡了Gmail界面,但却无法在屏幕上显示它。我不能为我的生活找出正在发生的事情。我不确定Gmail是否会引发某些我不知道的事件(之前*之前*之前的载入?),或者谷歌的浏览器是否对其Gmail页面做了特别的事情,或者是什么导致了这种奇怪的行为。谷歌阅读器不受这种奇怪的影响(我可以阻止关闭并保留页面内容),就像我测试过的所有其他网站一样。

有谁知道可能导致此问题的原因?

为了记录,我运行以下内容:Mac OS X 10.6.5,Google Chrome 10.0.648.205和dotJS 1.3。

我感谢任何反馈,但我不是在寻找涉及以下方面的解决方案:固定标签,更改我的工作流程/使用情况(例如,不使用鼠标选择标签)等等。我真的想弄明白什么,特别是Gmail(或者Chrome?)这样做是为了破坏我的努力。提前谢谢。

1 个答案:

答案 0 :(得分: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中重现此行为但我认为google为不同的浏览器提供了不同的javascript代码,因此我无法重现它。