リンクを無効にすることはできません(ポータブルな方法で)。これらの手法のいずれかを使用できます(それぞれに独自の利点と欠点があります)。
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クラスを定義する必要がありますが、CSSクラスの代わりに属性pointer-events: none
を再利用 するとdisabled
どうなるでしょうか。厳密にdisabled
はサポートされて<a>
いませんが、ブラウザは不明な属性について文句を言うことはありません。disabled
属性IEを使用すると無視されますが、pointer-events
IE固有のdisabled
属性が優先されます。他のCSS準拠ブラウザは、不明な 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
無効にされていることに注意してください...ポインターイベントのみです。リンクは引き続きキーボードからナビゲートできます。その場合、ここで説明する他の手法のいずれかを適用する必要もあります。
フォーカス
上記のCSSテクニックと組み合わせてtabindex
、非標準的な方法で要素がフォーカスされないようにすることができます。
<a href="#" disabled tabindex="-1">...</a>
私は多くのブラウザとの互換性を確認したことがないので、これを使用する前に自分でテストしたいかもしれません。JavaScriptなしで動作するという利点があります。残念ながら(もちろん)tabindex
CSSから変更することはできません。
インターセプトクリック
href
JavaScript関数にa を使用して、条件(または無効化された属性自体)を確認し、ケースでは何もしません。
$("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
(undefined
属性が設定されていない場合はjQuery 1.6以降が常に返されます)がis()
はるかに明確です(このヒントを提供してくれたDave Stewartに感謝します)。私が使用している、ここで注意してください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
有効としてまだ描かれています。
Accessible Rich Internet Applications(ARIA)
属性/クラスaria-disabled="true"
とともに属性も含めることを忘れないでくださいdisabled
。