คุณไม่สามารถปิดการใช้งานลิงค์ (ในแบบพกพา) คุณสามารถใช้หนึ่งในเทคนิคเหล่านี้ (แต่ละอันมีข้อดีและข้อเสีย)
วิธี 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แต่ก็จะให้เกียรติเฉพาะ IE disabledแอตทริบิวต์; 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ฟังก์ชันa ถึง 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()ชัดเจนกว่ามาก (ขอบคุณ 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ทาสีเมื่อเปิดใช้งาน
แอปพลิเคชันอินเทอร์เน็ตที่สามารถเข้าถึงได้หลากหลาย (ARIA)
อย่าลืมรวมแอททริบิวaria-disabled="true"พร้อมกับแอdisabledททริบิว / คลาสด้วย