3

uppity タイプが開始される前の免責事項: これは「実際に」展開されることはありません。これは、Chrome アドオンによるローカルでの個人的な使用のみを目的としています。私は自分のサイトへの訪問者をだまそうとしているわけではありません。onbeforeunload をフックしたい人たちへのちょっとした非難を見てきました。

いくつかの背景

Chrome に関する私の最大の不満 (少なくとも Mac OS では) は、タブを閉じるボタンです。これは、複数のタブを開いていると (私が通常行っているように)、タブ自体がかなり小さくなり、頻繁に意図せずにタブを閉じてしまいます。したがって、タブの閉じるボタンでカバーされないクリック ターゲット領域は非常に小さいです。ニュース ストーリー、ブログ投稿、ドキュメントなどを含む特定のタブでは、煩わしくはありますが、それほど不便ではありません。タブを再度開くにはCMD + Tを押すだけで、実際に害はありません。ただし、特定のタブ、特に Gmail には、閉じることによる明確な欠点があります。同僚との 1 つまたは複数のチャット ダイアログを頻繁に開いており、タブを再度開いてもチャット ダイアログが復元されず、新しいチャットを開始すると現在のチャット履歴が失われます (はい、保存されていますが、. コンテキストを逆方向にスクロールしても便利にアクセスできません)。タブを閉じるボタンを単純に削除するオプションを追加するように Google に求めるリクエストがいくつかあります (私は CMD+W を使用することを好みます) が、私はそれについて息を止めていません。

部分的な解決策

少し前に友人が、ドメインごとのカスタム JavaScript 実行を可能にするdotJS Chrome アドオンを教えてくれました。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;

見よ、これは私が試したほとんどのサイトでうまくいった。1 つを除いて: Gmail。それを訂正させてください:Gmailタブを閉じることを確認するように促す限り、それは機能し、それを閉じないことを選択した場合、タブを開いたままにしますが、ダイアログが私に促す前に、ページは完全に消えてしまいました白い。要素インスペクターは、マークアップがすべて残っていることを示し (私が知る限り)、要素のスタイルは何かを隠してはならず (つまり、表示: なし、可視性: 非表示など)、要素の配置はまだです。正しい (例: 可視領域内にある)。要素を 1 つずつ削除して、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) が何であるかを知りたいです?) ここでの私の努力を妨害しています。前もって感謝します。

4

1 に答える 1

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 コードを出荷していると思われるため、再現できません。

于 2011-04-30T19:37:53.150 に答える