業務備忘録

備忘録です

aタグとPointerEvent

2024-01-24 22:31:32 | 日記

aタグをコンソールから押す方法についてやっと理解できたのでメモ。

1.やりたいこと

こんなHTML内のaタグをJavaScriptからクリックしたい。

<body>
    <a href="https://www.google.com" id="target">Google.com</a>
</body>

2.ダメな例

function log(id){
    const target = document.getElementById(id);
    console.log(e);
    target.dispatchEvent(new Event('click'));
}

element.dispatchEvent()を使ってみる。dispatchEventは引数にEventオブジェクトを取って、要素に任意のイベントを割り当てることができる。
上記の場合は、Eventオブジェクトのコンストラクタに'click'を指定して、aタグにクリックイベントを発生させようとしている。

が、画面遷移は発生しない。

3.これならできるけど

function log(id){
    const target = document.getElementById(id);
    console.log(e);
    target.click();
}

click()メソッドを実行して、クリック動作をシミュレーションすることができ、aタグによる遷移を発生させることができる。

4.DispatchEventにこだわるなら

aタグのhref属性を削除したうえで、イベントオブジェクトを確認してみる。

function log(id){
    const target = document.getElementById(id);
    target.addEventListener('click', function (e) {
        console.log(e);
    });
    target.click();
}

Eventオブジェクトではなく、PointerEventオブジェクトが割り当てられている模様。

PointerEvent インターフェイスは、接触点の形状、イベントを生成した機器の種類、接触面に加えられた圧力の量など、ポインターによって生成された DOM イベントの状態を表します。

-----mdc web docs

クラス図

PointerEventはEventオブジェクトをプロトタイプとして継承しているので(多分)、Eventオブジェクトで指定できる'click'イベントも指定可能。
PointerEventによる発火であればログ出力して画面遷移。

function log(id){
    const target = document.getElementById(id);
    target.addEventListener('click', function (e) {
        if(e.constructor.name === 'PointerEvent'){
            console.log('PointerEvent!!');
        }
    });
    target.dispatchEvent(new PointerEvent('click'));
}

🥰🥰🥰

読めたら 読んでおく