Ви не можете відключити посилання (портативним способом). Можна скористатися однією з цих методик (кожна з яких має свої переваги та недоліки).
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але що , якщо ми повторно в disabledатрибут замість класу CSS? Власне кажучи, disabledце не підтримується, <a>але браузери не скаржаться на невідомі атрибути. Використання disabledатрибута IE буде ігнорувати, pointer-eventsале він буде шанувати специфічний disabledатрибут IE ; інші браузери, сумісні з CSS, ігнорують невідомий 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.
Перехоплення кліків
Використовуйте hrefфункцію JavaScript, перевірте стан (або сам атрибут вимкнено) і нічого не робити в разі.
$("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+ завжди буде повертатися, undefinedколи атрибут не встановлений), але is()це набагато зрозуміліше (завдяки Дейву Стюарту за цю пораду). Зауважте, тут я використовую disabledатрибут нестандартним способом, якщо вам це важливо, то замініть атрибут класом і замініть .is("[disabled]")на .hasClass("disabled")(додавання та видалення з addClass()і removeClass()).
Золтан Тамасі зазначив у коментарі, що "в деяких випадках подія клацання вже пов'язана з якоюсь" реальною "функцією (наприклад, з використанням 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;
}
Якщо ви використовуєте рамку інтерфейсу користувача, можливо, ви побачите, що відключені посилання неправильно оформлені. Наприклад, Bootstrap 3.x, обробляє цей сценарій, і кнопка правильно стильована як з disabledатрибутом, так і з .disabledкласом. Якщо замість цього ви очищаєте посилання (або використовуєте одну з інших методик JavaScript), ви також повинні керувати стилізацією, оскільки <a>без hrefтексту все ще пофарбовано як включено.
Доступні додатки для багатого Інтернету (ARIA)
Не забудьте також включити атрибут aria-disabled="true"разом із disabledатрибутом / класом.