リンクボタンのdisabled処理をinert属性からイベント制御へ変更

shoelace-style/webawesome

Web Awesomeの<wa-button>コンポーネントにおいて、リンク型ボタン(href属性を持つボタン)の無効化処理がinert属性の使用からクリックイベントの制御へと変更されました。この変更により、disabled状態のリンクボタンが確実にクリック不可となります。

背景

<wa-button>コンポーネントはボタン型とリンク型の両方をサポートしていますが、通常のボタン要素とは異なり、アンカー要素(<a>)には標準のdisabled属性が存在しません。#1848では、リンク型ボタンを無効化する機能が実装され、その実装ではinert属性が採用されていました。

本PRは、このinert属性による実装をrevertし、クリックイベントを直接防ぐ方法へと変更しています。PRタイトルに「Revert inert」と明記されているように、以前の実装方法からの方針転換が行われました。

技術的な変更

handleClickメソッドの先頭に、disabled状態とloading状態のチェック処理が追加されました。

変更前:

private handleClick() {
  // Only create a light dom button for submit / reset buttons.
  if (this.type !== 'submit' && this.type !== 'reset') {
    return;
  }

変更後:

private handleClick(event: PointerEvent) {
  // Prevent disabled and loading buttons from being clicked
  if (this.disabled || this.loading) {
    event.preventDefault();
    event.stopImmediatePropagation();
    return;
  }

  // Only create a light dom button for submit / reset buttons.
  if (this.type !== 'submit' && this.type !== 'reset') {
    return;
  }

テンプレート部分では、inert属性の条件付き設定が削除され、aria-disabled属性の設定もリンク型かつdisabled状態の場合のみに限定されました。

変更前:

?disabled=${ifDefined(isLink ? undefined : this.disabled)}
?inert=${ifDefined(isLink ? this.disabled : undefined)}
aria-disabled=${this.disabled ? 'true' : 'false'}

変更後:

?disabled=${ifDefined(isLink ? undefined : this.disabled)}
aria-disabled=${ifDefined(isLink && this.disabled ? 'true' : undefined)}

ボタン型要素の場合は引き続き標準のdisabled属性が使用され、リンク型要素の場合はイベントハンドラでクリックを防ぎます。

設計判断

イベントレベルでのクリック防止が選択されました。event.preventDefault()event.stopImmediatePropagation()による制御は、クリックイベントのみをターゲットとした限定的な処理です。stopImmediatePropagation()の使用により、同じ要素に登録された他のイベントリスナーも実行されなくなるため、disabled状態の一貫性が保証されます。

aria-disabled属性の設定もifDefinedを使用してリンク型かつdisabled状態の場合のみに限定することで、ボタン型要素では標準のdisabled属性による暗黙的なARIAサポートを活用し、属性の重複を避ける判断がなされています。この変更により、ボタン型とリンク型で異なるアプローチを取りつつ、両者で一貫したdisabled状態の実現を目指しています。

まとめ

本PRは、リンク型ボタンの無効化処理をinert属性からイベント制御へと変更することで、より予測可能な動作を実現しています。event.preventDefault()event.stopImmediatePropagation()の組み合わせにより、disabled状態のリンクボタンが確実にクリック不可となり、loading状態も同様に処理されます。ARIA属性の最適化も併せて行われ、標準のHTML要素の振る舞いとの一貫性が向上しています。

記事メタデータ

Generated by:
Claude Sonnet 4.5 for DiffDaily

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
リトライ後承認
Review Count:
2回 (改善を経て承認)
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

「リード文(総論)→背景・技術的変更・設計判断(各論)→まとめ(結論)」という3部構成が明確に適用されており、非常に分かりやすい構成です。

カスタムMarkdown構文 ⚠ WARNING

シンタックスハイライト・GitHubリンク記法の正確性

GitHubのPRへのリンク記法がガイドラインの例と僅かに異なります。本文中の`[#1848](URL)`は問題ありませんが、フッターの`[PR #2006](URL)`は、テキストを`#2006`とすることが推奨されます。ただし、可読性に大きな影響はありません。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

Webコンポーネント、イベント処理、ARIA属性に関する内容であり、専門知識を持つエンジニアという対象読者に完全に適合しています。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

各セクションが総論→各論の構成になっており、各段落もトピックセンテンスで始まるなど、パラグラフ・ライティングの原則が守られています。非常に読みやすいです。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

記事内のコードブロック(変更前・変更後)は、提供されたDiffの内容を正確に反映しています。`handleClick`の変更とテンプレートの`inert`削除が正しく引用されています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

`inert`属性、`event.stopImmediatePropagation()`、`aria-disabled`などの技術用語が文脈に沿って正確に使用されています。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

イベント制御への変更理由や`aria-disabled`の条件変更など、コード変更に対する技術的な説明は論理的かつ正確です。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

記事内のすべての主張(`inert`からのrevertである点、#1848との関連性など)は、PRのタイトル、Description、Diff内容によって裏付けられており、ハルシネーションは見られません。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

PR番号(#2006、#1848)が正確に記載されています。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

記事のタイトル「リンクボタンのdisabled処理をinert属性からイベント制御へ変更」は、PRの「Revert `inert`」という内容を的確に要約しており、主題の整合性は高いです。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

記事には、リリース日程やサポート状況といったPR情報に基づかない外部知識は含まれていません。`<a>`要素の標準的な振る舞いに関する言及は、文脈を補うための適切なものです。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

過去の実装(`inert`採用)と今回の変更(revert)の時間的な前後関係が正しく表現されています。