2011-04-29 77 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代碼,所以我不能複製它。