คุณไม่สามารถปิดการใช้งานลิงค์ (ในแบบพกพา) คุณสามารถใช้หนึ่งในเทคนิคเหล่านี้ (แต่ละอันมีข้อดีและข้อเสีย)
วิธี 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
ททริบิว / คลาสด้วย