Bạn không thể vô hiệu hóa một liên kết (theo cách di động). Bạn có thể sử dụng một trong những kỹ thuật này (mỗi kỹ thuật có lợi ích và nhược điểm riêng).
Cách CSS
Đây phải là cách đúng (nhưng xem sau) để làm điều đó khi hầu hết các trình duyệt sẽ hỗ trợ nó:
a.disabled {
pointer-events: none;
}
Đó là những gì, ví dụ, Bootstrap 3.x làm. Hiện tại (2016) nó chỉ được hỗ trợ tốt bởi Chrome, FireFox và Opera (19+). Internet Explorer bắt đầu hỗ trợ điều này từ phiên bản 11 nhưng không dành cho các liên kết tuy nhiên nó có sẵn trong một yếu tố bên ngoài như:
span.disable-links {
pointer-events: none;
}
Với:
<span class="disable-links"><a href="#">...</a></span>
Giải pháp thay thế
Chúng tôi, có lẽ, cần phải xác định một lớp CSS cho pointer-events: none
nhưng những gì nếu chúng ta tái sử dụng các disabled
thuộc tính thay vì một lớp CSS? Nói đúng ra disabled
là không được hỗ trợ <a>
nhưng các trình duyệt sẽ không phàn nàn về các thuộc tính không xác định . Sử dụng disabled
thuộc tính IE sẽ bỏ qua pointer-events
nhưng nó sẽ tôn vinh disabled
thuộc tính cụ thể của IE ; các trình duyệt tuân thủ CSS khác sẽ bỏ qua thuộc tính và danh dự không xác định . Dễ viết hơn là giải thích:disabled
pointer-events
a[disabled] {
pointer-events: none;
}
Một tùy chọn khác cho IE 11 là đặt display
các thành phần liên kết thành block
hoặc inline-block
:
<a style="pointer-events: none; display: inline-block;" href="#">...</a>
Lưu ý rằng đây có thể là một thiết bị cầm tay giải pháp nếu bạn cần hỗ trợ IE (và bạn có thể thay đổi HTML của mình) nhưng ...
Tất cả điều này nói xin lưu ý rằng pointer-events
chỉ vô hiệu hóa ... sự kiện con trỏ. Liên kết vẫn sẽ được điều hướng thông qua bàn phím sau đó bạn cũng cần áp dụng một trong những kỹ thuật khác được mô tả ở đây.
Tiêu điểm
Kết hợp với kỹ thuật CSS được mô tả ở trên, bạn có thể sử dụng tabindex
theo cách không chuẩn để ngăn chặn một yếu tố được tập trung:
<a href="#" disabled tabindex="-1">...</a>
Tôi chưa bao giờ kiểm tra tính tương thích của nó với nhiều trình duyệt sau đó bạn có thể muốn tự kiểm tra nó trước khi sử dụng. Nó có lợi thế để làm việc mà không cần JavaScript. Thật không may (nhưng rõ ràng) tabindex
không thể thay đổi từ CSS.
Đánh chặn nhấp chuột
Sử dụng một href
hàm JavaScript, kiểm tra điều kiện (hoặc chính thuộc tính bị vô hiệu hóa) và không làm gì trong trường hợp.
$("td > a").on("click", function(event){
if ($(this).is("[disabled]")) {
event.preventDefault();
}
});
Để vô hiệu hóa các liên kết làm điều này:
$("td > a").attr("disabled", "disabled");
Để kích hoạt lại chúng:
$("td > a").removeAttr("disabled");
Nếu bạn muốn thay vì .is("[disabled]")
bạn có thể sử dụng .attr("disabled") != undefined
(jQuery 1.6+ sẽ luôn trả về undefined
khi thuộc tính không được đặt) nhưng is()
rõ ràng hơn nhiều (nhờ Dave Stewart cho mẹo này). Xin lưu ý ở đây tôi đang sử dụng disabled
thuộc tính theo cách không chuẩn, nếu bạn quan tâm đến điều này thì hãy thay thế thuộc tính bằng một lớp và thay thế .is("[disabled]")
bằng .hasClass("disabled")
(thêm và xóa bằng addClass()
và removeClass()
).
Zoltán Tamási lưu ý trong một nhận xét rằng "trong một số trường hợp, sự kiện nhấp đã bị ràng buộc với một số chức năng" thực "(ví dụ: sử dụng knoutoutjs) Trong trường hợp đó, việc xử lý sự kiện có thể gây ra một số rắc rối. xử lý sai đến của liên kết touchstart
, mousedown
và keydown
các sự kiện. nó có một số nhược điểm (nó sẽ ngăn chặn cảm ứng năng cuộn bắt đầu vào liên kết)" nhưng xử lý sự kiện bàn phím cũng có lợi ích để ngăn chặn bàn phím điều hướng.
Lưu ý rằng nếu href
không xóa, người dùng có thể truy cập trang đó theo cách thủ công.
Xóa liên kết
Xóa href
thuộc tính. Với mã này, bạn không thêm trình xử lý sự kiện mà bạn tự thay đổi liên kết. Sử dụng mã này để vô hiệu hóa các liên kết:
$("td > a").each(function() {
this.data("href", this.attr("href"))
.attr("href", "javascript:void(0)")
.attr("disabled", "disabled");
});
Và cái này để kích hoạt lại chúng:
$("td > a").each(function() {
this.attr("href", this.data("href")).removeAttr("disabled");
});
Cá nhân tôi không thích giải pháp này lắm (nếu bạn không phải làm nhiều hơn với các liên kết bị vô hiệu hóa) nhưng nó có thể tương thích hơn vì có nhiều cách để theo liên kết.
Xử lý nhấp chuột giả
Thêm / xóa một onclick
chức năng trong đó bạn return false
, liên kết sẽ không được theo dõi. Để tắt liên kết:
$("td > a").attr("disabled", "disabled").on("click", function() {
return false;
});
Để kích hoạt lại chúng:
$("td > a").removeAttr("disabled").off("click");
Tôi không nghĩ có lý do để thích giải pháp này thay vì giải pháp đầu tiên.
Tạo kiểu
Kiểu dáng thậm chí còn đơn giản hơn, bất kể giải pháp nào bạn đang sử dụng để vô hiệu hóa liên kết chúng tôi đã thêm một disabled
thuộc tính để bạn có thể sử dụng quy tắc CSS sau:
a[disabled] {
color: gray;
}
Nếu bạn đang sử dụng một lớp thay vì thuộc tính:
a.disabled {
color: gray;
}
Nếu bạn đang sử dụng khung UI, bạn có thể thấy các liên kết bị vô hiệu hóa không được tạo kiểu đúng cách. Bootstrap 3.x, ví dụ, xử lý tình huống này và nút được tạo kiểu chính xác cả với disabled
thuộc tính và với .disabled
lớp. Thay vào đó, nếu bạn xóa liên kết (hoặc sử dụng một trong các kỹ thuật JavaScript khác), bạn cũng phải xử lý kiểu dáng vì <a>
không href
có vẫn được vẽ như được bật.
Ứng dụng Internet phong phú có thể truy cập (ARIA)
Đừng quên bao gồm một thuộc tính aria-disabled="true"
cùng với disabled
thuộc tính / lớp.