◆ イベント監視で押した時と離した時にフラグ更新
◆ 特殊な感じでタブやウィンドウ切り替えると「押した」か「離した」のどちらかのイベントだけが起きる ことがある
◆ 離してるのに押した状態が続いてると次にフォーカスしたときに変な動きするのでフォーカス外れた時にも離した扱いする

キーが押されたり離された時に何かする というのじゃなくて今キー押されてるかを知りたいってことありますよね

ですが JavaScript では押したときや離したときのイベントを設定して自分で管理しておくしかありません
Windows アプリケーションみたいな今押されてるキーを取得する機能はないです

押した時と離したときに単純な処理だけで一応はできるのですが 完璧とはいかないです
簡単にやるならこんなのです
var n = 0
window.onmousedown = eve => ++n
window.onmouseup = eve => --n

function isMouseButtonDown(){
    return !!n
}

たいていはこれでうまくいくのですが マウスを途中からブラウザの外に持って行ったり クリック中にタブやウィンドウを切り替えたりするとおかしくなります
mousedown だけが起きてカウントが増え続けたり mouseup だけが起きてカウントが減り続けたり とすることができます
(クリック中に Ctrl-Tab や Alt-Tab を押してアクティブなものを切り替えると簡単に片方だけ起こせます)

数値じゃなくて true/false で管理するようにすれば 特殊なことをしたときだけ変になってても一度そのおかしくなったキーやマウスを操作すれば正しい状態に戻るのでイベント時に true/false を切り替えるのが一般的かと思います
var n = false
window.onmousedown = eve => n = true
window.onmouseup = eve => n = false

function isMouseButtonDown(){
    return n
}

でも できればウィンドウやタブが変わったことを検知して一度フォーカスが外れたら false にしてリセットされるようにしたいです

mousedown が起きてないのに いきなり mouseup だけが起きても何もないことがほとんどですが mousedown が起きて mouseup が起きずにマウスを離してしまうと 次にフォーカスが当たった時にマウス押したまま扱いされて気持ち悪い動きになります
一度押して離せば元通り と言ってもフォーカス離したときに mouseup 起きたことにしてリセットするのが一番だと思います


タブやウィンドウが切り替えられたことってどう判断しようかと調べてみても Page Visibility API は 非表示と表示の切り替えなのでタブ変わって完全に見えなくなった時は使えますけど アクティブウィンドウを切り替えて 画面上には表示(別ウィンドウの裏に隠れて見えてなくても)されていればイベントはおきないです

document.hasFocus という昔からありそうな関数は ちゃんとフォーカスあたってるときだけ true を返してくれてよかったのですが 変更時にイベントが起きません
setInterval で 500ms ごとにチェック…… というのは避けたいので使えなそうです

window.onblur と window.onfocus というそういえばこんなのあったっけというのを見つけて来たのですが document.hasFocus とは違って iframe があるとページ全体としてフォーカスの判定をしてくれないです
iframe にフォーカスが移ると外側のメインのページからフォーカスが外れて iframe の window にフォーカスが当たるという扱いです
document.hasFocus では iframe にフォーカスがあっても  true だったのに こっちではフォーカスなしという扱いです

これの問題はページの中に iframe があって メモ帳などを操作したあとに iframe の中をクリックしてブラウザにフォーカスが移った時に window.onfocus イベントが発火しないところです

ただ 今回は再度フォーカス当たった時じゃなくて  フォーカス外れた時に処理してもいいので onblur を使うことにしました
var n = false
window.onmousedown = eve => n = true
window.onmouseup = eve => n = false
window.onblur = eve => n = false

function isMouseButtonDown(){
    return n
}

これで途中で変にフォーカス外れても mousedown 状態が続かずいい感じに押してるか判定できます

今回のサンプルはマウスのどれかというゆるいものですが しっかり作るなら マウスのどのボタンか キーボードのどのキーかをちゃんと判断してオブジェクト形式でどれが押されてるかを保存しないといけないです