<td>
無効にする必要があるリンク ボタンがあります。これは IE では機能しますが、Firefox と Chrome では機能しません。
以下のすべてを試しましたが、Firefox (1.4.2 js を使用) では動作しませんでした。
$(".myLink").attr('disabled', 'disabled');
$(".myLink").attr('disabled', true);
$(".myLink").attr('disabled', 'true');
注意 - アンカー タグのクリック機能は動的に登録されているため、登録解除できません。また、リンクを無効モードで表示する必要があります。
ベストアンサー1
リンクを無効にすることはできません (ポータブルな方法で)。次のいずれかの手法を使用できます (それぞれに利点と欠点があります)。
CSSの方法
ほとんどのブラウザがサポートしている場合は、これが正しい方法です(ただし、後述します)。
a.disabled {
pointer-events: none;
}
これは、たとえばBootstrap 3.xが行うことです。現在(2016年)は、Chrome、Firefox、Opera(19以上)でのみサポートされています。Internet Explorerはバージョン11からサポートを開始しましたが、リンク用ではないただし、次のような外部要素では使用できます。
span.disable-links {
pointer-events: none;
}
と:
<span class="disable-links"><a href="#">...</a></span>
回避策
おそらく、 の CSS クラスを定義する必要がありますpointer-events: none
が、CSS クラスの代わりに属性を再利用するとどうなるでしょうか? 厳密に言えばはサポートされていませんが、ブラウザーは不明な属性について文句を言いません。 属性を使用すると、IE は無視しますが、 IE 固有の属性を尊重します。他の CSS 準拠ブラウザーは不明な属性を無視し、 を尊重します。説明するよりも書く方が簡単です:disabled
disabled
<a>
disabled
pointer-events
disabled
disabled
pointer-events
a[disabled] {
pointer-events: none;
}
IE 11 の別のオプションは、display
リンク要素をblock
またはに設定することですinline-block
。
<a style="pointer-events: none; display: inline-block;" href="#">...</a>
IE をサポートする必要がある場合 (HTML を変更できる場合)、これは移植可能なソリューションになる可能性があることに注意してください。
ただしpointer-events
、無効にするのはポインター イベントのみであることに注意してください。リンクはキーボードで操作できますが、ここで説明する他のテクニックのいずれかも適用する必要があります。
集中
上記の CSS テクニックと組み合わせて、tabindex
非標準的な方法を使用して要素にフォーカスが当たらないようにすることができます。
<a href="#" disabled tabindex="-1">...</a>
多くのブラウザとの互換性を確認したことがないので、使用する前に自分でテストすることをお勧めします。JavaScript なしで動作するのが利点です。残念ながら (当然ですが) tabindex
CSS から変更することはできません。
クリックを傍受する
JavaScript 関数を使用してhref
、条件 (または無効な属性自体) をチェックし、該当する場合は何も行いません。
$("td > a").on("click", function(event){
if ($(this).is("[disabled]")) {
event.preventDefault();
}
});
リンクを無効にするには、次の操作を行います。
$("td > a").attr("disabled", "disabled");
再度有効にするには:
$("td > a").removeAttr("disabled");
の代わりに.is("[disabled]")
を使用することもできます(jQuery 1.6+では、属性が設定されていない場合は.attr("disabled") != undefined
常に が返されます)。ただし、こちらの方がはるかに明確です (このヒントを提供してくれた Dave Stewart に感謝します)。ここでは、属性を非標準的な方法で使用していることに注意してください。この点が気になる場合は、属性をクラスに置き換え、を に置き換えてください (とを追加および削除します)。undefined
is()
disabled
.is("[disabled]")
.hasClass("disabled")
addClass()
removeClass()
ゾルターン・タマーシコメントで指摘された「場合によっては、クリック イベントがすでに何らかの「実際の」関数にバインドされています (たとえば、knockoutjs を使用)。その場合、イベント ハンドラーの順序によって問題が発生する可能性があります。そのため、リンクのtouchstart
、mousedown
およびkeydown
イベントに return false ハンドラーをバインドして、無効なリンクを実装しました。これにはいくつか欠点があります (リンクでタッチ スクロールが開始されなくなります)」が、キーボード イベントを処理すると、キーボード ナビゲーションを防止できるという利点もあります。
クリアされていない場合は、href
ユーザーが手動でそのページにアクセスできることに注意してください。
リンクをクリア
属性をクリアしますhref
。このコードでは、イベント ハンドラーは追加されませんが、リンク自体は変更されます。リンクを無効にするには、次のコードを使用します。
$("td > a").each(function() {
this.data("href", this.attr("href"))
.attr("href", "javascript:void(0)")
.attr("disabled", "disabled");
});
再度有効にするには、次の操作を実行します。
$("td > a").each(function() {
this.attr("href", this.data("href")).removeAttr("disabled");
});
個人的には、この解決策はあまり好きではありません (無効なリンクでそれ以上のことをする必要がなければ) が、リンクをたどる方法がさまざまであるため、より互換性がある可能性があります。
偽のクリックハンドラー
リンクがたどられないonclick
機能を追加/削除します。リンクを無効にするには:return false
$("td > a").attr("disabled", "disabled").on("click", function() {
return false;
});
再度有効にするには:
$("td > a").removeAttr("disabled").off("click");
最初の解決策ではなく、この解決策を優先する理由はないと思います。
スタイリング
スタイル設定はさらに簡単です。リンクを無効にするためにどのようなソリューションを使用していても、disabled
属性を追加したので、次の CSS ルールを使用できます。
a[disabled] {
color: gray;
}
属性の代わりにクラスを使用している場合:
a.disabled {
color: gray;
}
UI フレームワークを使用している場合、無効なリンクが適切にスタイル設定されていないことがあります。たとえば、Bootstrap 3.x はこのシナリオを処理し、ボタンはdisabled
属性と.disabled
クラスの両方で適切にスタイル設定されます。代わりにリンクをクリアする場合 (または他の JavaScript テクニックのいずれかを使用する場合)、スタイル設定も処理する必要があります。これは、リンクが<a>
なくhref
ても有効なものとして描画されるためです。
アクセシブルなリッチ インターネット アプリケーション (ARIA)
attribute/classaria-disabled="true"
と一緒に属性も含めることを忘れないでください。disabled