高レベルの問題
Google カレンダーで「その他のカレンダー」をすべて選択解除することはできません。私の会社には多くの従業員がいて、会議をスケジュールするときにユーザーを常に追加および削除しています。「時間を探す」機能があることはわかっていますが、その議論は別として、興味深いので、これを機能させたいと思っています。
解決
タブが Google カレンダー サイトにあるときに表示されるページ アクション クローム拡張機能を作成します。ページ アクション アイコンをクリックすると、マウスダウン イベントをシミュレートして、すべてのカレンダーの選択解除を自動化する必要があります。
実装
実際にカレンダーの選択を解除することを除いて、ページ アクションは正しく機能します。
Google 開発者ツールを使用して、手動で選択を解除したときにどのイベントが発生するかを確認し、どの要素がハンドラーを登録するかを確認しました。キーペアはdocument
要素とmousedown
イベントのようです。そのため、イベントのディスパッチを自動化して動作を複製したいと考えました。最初はバブルが発生すると仮定してdivに直接ディスパッチしましたが、機能せず、ドキュメントにイベントリスナーしかないことがわかったときに、そこで直接イベントを発生させようとしました。
次contentscript.js
のメソッドでは、ページ アクションがクリックされたときに実行されます。
chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
// Get the div containing other calendars
var otherCalendars = document.getElementById("calendars_fav");
// Get all divs representing a single selected calendar
var selectedOtherCalendars = otherCalendars.getElementsByClassName("calListLabel-sel");
for (var i=0 ; i < selectedOtherCalendars.length; i++) {
// Get the span which contains the name of the calendar e.g. Contact's birthdays
var c = selectedOtherCalendars[i].children[1];
var name = c.innerHTML;
// Find the location of this element relative to the document
var x = getOffsetLeft(c) + (c.offsetWidth / 2);
var y = getOffsetTop(c) + (c.offsetHeight / 2);
console.log('mousedown on document targeting ' + name + ' x:' + x + ', y:' + y);
// See http://goo.gl/WtlWpv
simulate(document, "mousedown", { pointerX: x, pointerY: y });
}
});
SO: Javascript を使用してマウス クリックをシミュレートする方法は? - ここからシミュレートの実装を持ち上げました
問題
ログは正しいようで、エラーはありませんが、何も起こらず、シミュレーションは失敗しているようです。
- プログラムでイベントをディスパッチすると、Chrome 開発者ツールのタイムラインにイベントが表示されない
- ディスパッチの結果、Google カレンダーの JavaScript は実行されません。
サンプル ログ エントリ:
mousedown on body targeting Ipswich Town x:85.5, y:494
タイトルの説明
dispatchEvent が他の場所からの Google カレンダーで機能するかどうかはわかりませんが、Chrome 拡張機能からのみ試しましたcontentscript.js
。