-
Notifications
You must be signed in to change notification settings - Fork 1
/
content.js
59 lines (49 loc) · 2.04 KB
/
content.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
document.addEventListener('keydown', function(event) {
const searchBox = document.querySelector('input[name="q"]'); // 検索ボックスの要素を取得
const isInSearchBox = document.activeElement === searchBox; // 現在のフォーカスが検索ボックスにあるか確認
if (isInSearchBox) {
// 検索ボックスにフォーカスがある場合、エンターキーのイベントを無視
if (event.key === 'Enter') {
return;
}
}
const items = document.querySelectorAll('.js-issue-row'); // GitHubのIssue/PRのリストを選択
if (!items.length) return;
let currentIndex = Array.from(items).findIndex(item => item.classList.contains('selected'));
// 初期選択
if (currentIndex === -1) {
currentIndex = 0;
items[currentIndex].classList.add('selected');
} else {
items[currentIndex].classList.remove('selected');
}
// 上キー
if (event.key === 'ArrowUp') {
event.preventDefault(); // デフォルト動作をキャンセル
currentIndex = Math.max(0, currentIndex - 1);
}
// 下キー
if (event.key === 'ArrowDown') {
event.preventDefault(); // デフォルト動作をキャンセル
currentIndex = Math.min(items.length - 1, currentIndex + 1);
}
// Enterキーが検索ボックスにフォーカスがないときだけ詳細画面に遷移する
if (event.key === 'Enter' && !isInSearchBox) {
event.preventDefault(); // デフォルト動作をキャンセル
const selectedItem = items[currentIndex];
const link = selectedItem.querySelector('a.js-navigation-open');
if (link) {
window.location.href = link.href;
}
}
// 新しい選択を追加
items[currentIndex].classList.add('selected');
});
// ページ遷移後に選択状態をリセットするためのリスナーを追加
window.addEventListener('load', function() {
const items = document.querySelectorAll('.js-issue-row');
items.forEach(item => item.classList.remove('selected'));
if (items.length > 0) {
items[0].classList.add('selected'); // 初期選択
}
});