Предотвращение закрытия Gmail / сохранение его видимым

Отказ от ответственности перед тем, как начнутся наглые типы: это не должно быть развернуто «в дикой природе». Это предназначено только для локального личного использования надстройкой Chrome. Я не пытаюсь обмануть посетителей своих сайтов или делать что-то еще сомнительное. Я видел немного наказаний тех, кто хотел зацепиться перед разгрузкой.

Небольшая предыстория

Безусловно, моя самая большая претензия к Chrome (по крайней мере, в Mac OS) — это его кнопки закрытия вкладок, которые, когда у меня открыто несколько вкладок (как я обычно делаю), приводят к тому, что я часто непреднамеренно закрываю вкладки, поскольку сами вкладки становятся довольно маленькими и таким образом, целевая область клика, не закрытая кнопкой закрытия вкладки, очень мала. На некоторых вкладках с новостями, сообщениями в блогах, документацией и т. д. это раздражает, но не доставляет больших неудобств. Я просто CMD + T, чтобы снова открыть вкладку, и никакого реального вреда не нанесено. Однако некоторые вкладки, в частности Gmail, имеют определенные недостатки при закрытии. У меня часто открывается один или несколько диалогов чата с коллегами, и повторное открытие вкладки не восстанавливает диалог чата, а при запуске нового чата я теряю текущую историю чата (да, она сохраняется, но к ней неудобно обращаться, прокручивая контекст назад) . Есть несколько запросов к Google, чтобы добавить возможность просто удалить кнопки закрытия вкладок (сам я предпочитаю использовать CMD + W), но я не задерживаю дыхание на этом.

Частичное решение

Некоторое время назад друг указал мне на надстройку dotJS для Chrome, которая позволяет выполнять пользовательский JavaScript для каждого домена, похож на GreaseMonkey, но немного отличается. В любом случае, это дало мне возможность «исправить» проблемы/желания на ряде сайтов, которые я регулярно посещаю, и до сих пор я находил это очень полезным. На днях мне пришло в голову, что я, вероятно, мог бы держать свои вкладки Gmail и др. открытыми с небольшим количеством JavaScript. Я собрал небольшой скрипт, который на основе регулярного выражения предлагал вам закрыть вкладку. Суть кода в следующем:

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 связан с каким-то событием, о котором я не знаю (on*before*beforeunload?), или браузер Google делает что-то особенное со своей страницей Gmail, или что вызывает странное поведение. На Google Reader эта странность не влияет (я могу предотвратить закрытие и сохранить содержимое страницы), как и все другие сайты, с которыми я тестировал.

Кто-нибудь знает, что может быть причиной этой проблемы?

Для справки, я использую следующее: Mac OS X 10.6.5, Google Chrome 10.0.648.205 и dotJS 1.3.

Я ценю любые отзывы, но я не ищу решения, которые включают в себя: закрепление вкладок, изменение моего рабочего процесса/использования (например, отказ от выбора вкладок с помощью мыши) и т. д. Я действительно хочу выяснить, что именно Gmail (или, возможно, Chrome ?) делает то, что саботирует мои усилия здесь. Заранее спасибо.


person theraccoonbear    schedule 29.04.2011    source источник
comment
Возможно, gmail цепляется за onbeforeunload. Даже если вы подключитесь к тому же событию, обработчик gmail все равно будет вызываться, особенно если он находится первым в списке. Я не уверен, можно ли гарантировать, что ваш обработчик будет вызван первым, и если да, то сможете ли вы остановить событие. onbeforeunload обычно обрабатывается иначе, чем другие события. Не уверен, что вы можете попытаться удалить существующие обработчики onbeforeunload на странице, чтобы выполнялись только ваши.   -  person ewh    schedule 30.04.2011


Ответы (1)


Я думаю, что собственный код Gmail вызывает такое поведение. Я могу воспроизвести вашу проблему (на Linux-машине) с подпиской на это событие с консоли с помощью этой функции.

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

После этого я запустил профилировщик инструмента разработчика, последний вызов после закрытия окна (и выбора ответа «оставаться на этой странице» для вопроса) — это вызов функции removeChild, который удаляет некоторый контент из ‹iframe id=" холст_кадр" /›. Таким образом, элементы контента больше не существуют.

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 для разных браузеров, поэтому я не могу его воспроизвести.

person szaboat    schedule 30.04.2011