リンクを無効にすることはできません(ポータブルな方法で)。これらの手法の1つを使用できます(それぞれに独自の長所と短所があります)。
CSSの方法
これは、ほとんどのブラウザがサポートするときに行う正しい方法です(ただし、後で参照してください)。
a.disabled {
pointer-events: none;
}
これは、たとえば、Bootstrap3.xが行うことです。現在(2016年)、Chrome、FireFox、Opera(19+)でのみ十分にサポートされています。Internet Explorerはバージョン11からこれをサポートし始めましたが、リンクはサポートしていませんが、次のような外部要素で利用できます。
span.disable-links {
pointer-events: none;
}
と:
<span class="disable-links"><a href="#">...</a></span>
回避策
おそらく、CSSクラスを定義する必要がありますが、CSSクラスの代わりに属性を再利用 するとpointer-events: none
どうなるでしょうか。厳密に言えば、はサポートされていませんが、ブラウザは不明な属性について文句を言うことはありません。属性IEを使用すると無視されますが、IE固有の属性は尊重されます。他のCSS準拠のブラウザは、不明な属性を無視して尊重します。説明するよりも書く方が簡単です。disabled
disabled
<a>
disabled
pointer-events
disabled
disabled
pointer-events
a[disabled] {
pointer-events: none;
}
IE 11のもう1つのオプションはdisplay
、リンク要素のセットをblock
またはに設定することinline-block
です。
<a style="pointer-events: none; display: inline-block;" href="#">...</a>
IEをサポートする必要がある場合(そしてHTMLを変更できる場合)、これは移植可能なソリューションである可能性があることに注意してください...
pointer-events
これはすべて、ポインタイベントのみを無効にすることに注意してください。リンクは引き続きキーボードを介してナビゲートできるため、ここで説明する他の手法の1つを適用する必要もあります。
集中
上記のCSS手法と組み合わせてtabindex
、要素がフォーカスされるのを防ぐために非標準的な方法で使用できます。
<a href="#" disabled tabindex="-1">...</a>
私は多くのブラウザとの互換性をチェックしたことがないので、これを使用する前に自分でテストすることをお勧めします。JavaScriptなしで動作するという利点があります。残念ながら(しかし明らかに)tabindex
CSSから変更することはできません。
クリックを傍受する
JavaScript関数にaを使用href
し、条件(または無効な属性自体)を確認し、万が一の場合は何もしません。
$("td > a").on("click", function(event){
if ($(this).is("[disabled]")) {
event.preventDefault();
}
});
リンクを無効にするには、次のようにします。
$("td > a").attr("disabled", "disabled");
それらを再度有効にするには:
$("td > a").removeAttr("disabled");
代わりに.is("[disabled]")
使用したい場合は(属性が設定されていない場合.attr("disabled") != undefined
は常にjQuery 1.6+が返されます)、はるかに明確です(このヒントを提供してくれたDave Stewartに感謝します)。ここで私は非標準的な方法で属性を使用していることに注意してください。これが気になる場合は、属性をクラスに置き換え、に置き換えてください( andの追加と削除)。undefined
is()
disabled
.is("[disabled]")
.hasClass("disabled")
addClass()
removeClass()
ZoltánTamásiはコメントで、「クリックイベントがすでに何らかの「実際の」関数にバインドされている場合があります(たとえば、knockoutjsを使用)。その場合、イベントハンドラーの順序付けによって問題が発生する可能性があります。したがって、リターンをバインドして無効なリンクを実装しました。リンクのtouchstart
、mousedown
およびイベントへの誤ったハンドラーkeydown
。いくつかの欠点があります(リンクでタッチスクロールが開始されないようにします)」が、キーボードイベントを処理することには、キーボードナビゲーションを防ぐという利点もあります。
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)
属性/クラスaria-disabled="true"
と一緒に属性も含めることを忘れないでください。disabled