【JavaScript】<a>タグの連打を防止する方法

2023年4月11日火曜日

JavaScript

t f B! P L

 

【JavaScript】<a>タグの連打を防止する方法








画像と<a>タグでボタンを作ったのですが連打させたくありません。
1回だけ受け付けて、2回目以降は無視してほしいのです。

色々調べて disabled=true にすると良いのかと思いましたが、


<a>タグにはdisabledプロパティがありません。


そこでもう少し調べていくと解決策が見つかりました。


pointer-events プロパティを使えばよいらしいです!

JavaScriptで使う場合は pointerEvents を指定します。


実際のサンプルコード



HTML

<a href="https://~" onClick="doDisabled(this)">ああ</a>

this を指定するとその要素のオブジェクトが渡されるよ。


JavaScript

<script type="text/javascript">

function doDisabled(btn) {

btn.style.pointerEvents = "none";

}

</script>


これで出来上がり!


しかし欠点もあります。



問題点


キーイベントは無効化されない


タブなどを押してリンクにカーソルを合わせてリターンキーを押すと反応してしまいます。
なので、tabindex=-1 を付けておくと安全です。


JavaScript

<script type="text/javascript">

function doDisabled(btn) {

btn.style.pointerEvents = "none";

               btn.tabindex = -1;

}

</script>



IE10以下のバージョンではサポートしていない


IEは2022年6月16日にサポートが終了しているので新しいブラウザを使ってもらいましょう。


キャッシュでブラウザバックするとボタンが押せないままになってる


ブラウザバックのボタンを押して画面がリロードされるのであれば問題ないのですが、例えばガワネイティブのようなアプリでページ遷移前の状態をキャッシュして、キャッシュからページを表示するタイプだとボタンを無効化した状態のままなので、リンクを押せなくなってしまいます

ユーザーが手動でリロードしてくれればいいのですが、手間を掛けさせるわけにもいきません。

一定時間経過したら有効になるような処理を入れると良いのかもしれませんが、私の場合は解決できずに断念しました。。。;;

結局、サーバ側で連打検知を入れて対応したのですがあまりスマートでない形となりました。

良い解決方法があれば教えてください。;;

以上です。

ラベル

3DCG AdSense AI Amazon Echo Blender Blogger cron Cursor DNS Fire TV GCP Github Copilot Google Cloud HTTP iOS IPA iPad iPhone5 JavaScript laravel mySQL nodejs PhotoShop PHP Python Redis Scratch SSH Unity vue.js Webサーバ Windows10 WinSCP イヤーカフ型 イラスト おかし おやつ オリンピック お文具 カイワレ大根 ガチャ きのこ ギフト キャラ弁 クリスマス クレジットカード ゲーミング ゲーミングキーボード ゲーミングマウス ゲーミングマウスパッド ゲーミングモニター ゲームパッド ゴーヤー栽培 コナン サーバ サイクリング サイバーセキュリティ サイバー攻撃 サブスクリプション しりとり すイエんサー スクラッチ スマートウォッチ スライム セキュリティ ゼロトラスト ダイエット タブレット ドズル社 なわとび バーテープ パズル パンダ ぷよぷよ ふるさと納税 プログラミング プロトコル番号 マイクラ マイクロソフト マリオ マンガ メモ ランニングウォッチ ランニングゲーム ワイヤレスイヤホン 異世界 絵本 株関連 鬼滅の刃 健康診断 工作 磁石 自転車 自動化 収益化 書き初め 小学校 松屋 情報処理 情報処理安全確保支援士 辛辛魚 水泳 生成AI 折り紙 川渡し問題 銭天堂 誕生日 段ボール 知育菓子 中学受験 冬鳥 動画 動画編集 日常 認定試験 粘土 福袋 便利な雑貨 母の日 銘酒 料理

このブログを検索

ブログをよくする

連絡フォーム

名前

メール *

メッセージ *

QooQ