จุดยึดแท็กที่ไม่มีแอตทริบิวต์ href ปลอดภัยหรือไม่


232

การใช้แท็กจุดยึดโดยไม่ต้องมีhrefแอตทริบิวต์และใช้ตัวจัดการเหตุการณ์คลิก JavaScript แทนหรือไม่ ดังนั้นฉันจะละเว้นhrefอย่างสมบูรณ์แม้จะว่างเปล่า ( href="")


1
เหตุการณ์ onclick ยังคงเป็นต้นเหตุ ฉันต้องการใช้แท็ก anchor แทน span / div เพราะเป็นแท็กที่เหมาะสมเท่านั้นที่รองรับ CSS: โฮเวอร์ใน IE
john

3
@Martin ANCHORS สามารถเข้าถึงและเปิดใช้งานผ่านแป้นพิมพ์ องค์ประกอบ SPAN ปกติไม่สามารถทำได้ ดูที่นี่: jsfiddle.net/simevidas/4DTxv/2
Šime Vidas


2
ใน HTML5 แองเคอร์ที่ไม่มีแอตทริบิวต์ href คือตัวเชื่อมโยงหลายมิติของตัวยึดตำแหน่ง: dev.w3.org/html5/markup/a.html
Ignacio Lago

1
คุณแน่ใจหรือว่าไม่ต้องการปุ่มแทน นี่หมายความว่าการแท็บ ฯลฯ นั้นใช้งานได้และคุณสามารถจัดสไตล์ปุ่มของคุณให้ดูเหมือนลิงค์ในกรณีที่จำเป็น เป็นที่ยอมรับฉันไม่รู้เกี่ยวกับโฮเวอร์ใน IE
robbie_c

คำตอบ:


217

ใน HTML5 การใช้aองค์ประกอบที่ไม่มีhrefแอตทริบิวต์นั้นถูกต้อง จะถือว่าเป็น "ตัวเชื่อมโยงหลายมิติตัวยึด"

ตัวอย่าง:

<a>previous</a>

มองหา "ตัวยึดเชื่อมโยงหลายมิติ" ใน W3C สมอแท็กหน้าอ้างอิง: https://www.w3.org/TR/2016/REC-html51-20161101/textlevel-semantics.html#the-a-element

และมันยังถูกกล่าวถึงในวิกิที่นี่: https://www.w3.org/wiki/Elements/a

ลิงค์ตัวยึดมีไว้สำหรับกรณีที่คุณต้องการใช้องค์ประกอบจุดยึด แต่ไม่สามารถนำทางได้ทุกที่ สิ่งนี้มีประโยชน์สำหรับการทำเครื่องหมายหน้าปัจจุบันในเมนูการนำทางหรือเส้นทางเกล็ดขนมปัง (วิธีการแบบเก่าน่าจะเป็นการใช้ span tag หรือ anchor tag ที่มีคลาสชื่อ "active" หรือ "current" เพื่อจัดรูปแบบและ JavaScript เพื่อยกเลิกการนำทาง)

ลิงค์ตัวยึดยังมีประโยชน์ในกรณีที่คุณต้องการตั้งค่าปลายทางของลิงก์ผ่าน JavaScript ในขณะรันไทม์ คุณเพียงแค่ตั้งค่าของแอตทริบิวต์ href และแท็กจุดยึดจะสามารถคลิกได้

ดูสิ่งนี้ด้วย:


3
คำจำกัดความของ "ลิงค์ตัวยึด" คืออะไร
Gyum Fox

14
รับทราบว่าโดยไม่ต้องรูปแบบจะไม่สามารถเพิ่มโดยอัตโนมัติไปยังองค์ประกอบ hrefcursor: pointer
ลุค

38

มันก็โอเค แต่ในเวลาเดียวกันอาจทำให้เบราว์เซอร์บางตัวทำงานช้า

http://webdesignfan.com/yslow-tutorial-part-2-of-3-reducing-server-calls/

คำแนะนำของฉันคือใช้ <a href="#"> </a>

หากคุณกำลังใช้ JQuery อย่าลืมใช้:

.click(function(event){
    event.preventDefault();
    // Click code here...
});

7
ฉันไม่สามารถใช้ href = "#" ได้เพราะฉันใช้คั่นหน้า ajax ซึ่งเกี่ยวข้องกับการเปลี่ยนแฮชฉันควรทำอย่างไร
john

5
แทนที่จะใช้ javascript: void (0); ภายใน href ฉันใช้จาวาสคริปต์:; มันสั้นกว่าที่จะเขียน
พันธมิตร

16
การปรับประสิทธิภาพจะมีผลเฉพาะในกรณีที่คุณระบุแอตทริบิวต์ href เปล่า คำถามระบุว่าไม่มีแอตทริบิวต์ href เลย
Pete B

18
ตามจริงแล้วตามบทความ (และเหมาะสม) การปรับประสิทธิภาพที่เป็นไปได้จะใช้กับแอตทริบิวต์src ที่ว่างเปล่าเท่านั้น มันไม่ได้พูดอะไรเกี่ยวกับประสิทธิภาพที่ชาญฉลาดเกี่ยวกับคุณลักษณะ href ที่ว่างเปล่า
bergie3000

1
สวัสดี @Gunnar ดูเหมือนว่าลิงก์จะหายไปในตอนนี้ คุณมีการอ้างอิงอื่นสำหรับการอ้างสิทธิ์หรือไม่?
user31782

25

คำตอบสั้น ๆ : ไม่

คำตอบยาว:

ก่อนอื่นหากไม่มีแอตทริบิวต์ href จะไม่มีลิงก์ หากไม่ใช่ลิงก์ก็จะไม่สามารถใช้แป้นพิมพ์ (หรือสวิตช์ลมหายใจหรืออุปกรณ์อินพุตอื่น ๆ ที่ไม่ใช่ตัวชี้โดยใช้ตัวชี้) (เว้นแต่คุณจะใช้คุณสมบัติ HTML 5 tabindexซึ่งไม่รองรับในระดับสากล) เป็นเรื่องยากมากที่จะเหมาะสมสำหรับการควบคุมที่ไม่มีการเข้าถึงคีย์บอร์ด

ที่สอง คุณควรมีทางเลือกอื่นเมื่อ JavaScript ไม่ทำงาน (เนื่องจากโหลดช้าจากเซิร์ฟเวอร์การเชื่อมต่ออินเทอร์เน็ตหลุด (เช่นสัญญาณมือถือบนรถไฟที่กำลังเคลื่อนที่) JS ถูกปิด ฯลฯ )

ทำให้การใช้งานของการเพิ่มประสิทธิภาพของความก้าวหน้าโดยJS สร้างความรำคาญ


ปัญหาคือฉันต้องการสิ่งที่ฉันสามารถแนบเหตุการณ์การคลิกด้วยวิธี "คลิก" ของ jQuery ที่ได้รับการเน้นและขีดเส้นใต้เช่นลิงค์เมื่อเมาส์วางอยู่เหนือมัน มีอะไรนอกเหนือจากแท็กจุดยึด href-less ที่สามารถทำได้โดยไม่มี CSS? (เช่นตามที่เป็นอยู่โดยไม่ต้องเพิ่มการโต้ตอบแบบพื้นฐานด้วยตนเองในขณะที่ยังคงความเรียบง่ายของการกำหนดฟังก์ชันการคลิกโดยตรงผ่าน jQuery)
Triynko

@Triynko - ใช้ลิงก์ แต่ทำอย่างถูกต้อง ดูบรรทัดสุดท้ายของคำตอบ
เควนติน

5
Tabindex บนแท็ก 'a' ใช้ได้ตั้งแต่ HTML4 (อย่างน้อย) w3schools.com/tags/att_global_tabindex.asp
technoTarek

@technoTarek - ใช่ แต่hrefเป็นข้อบังคับ (เว้นแต่ว่าจะเป็นสมอชื่อในกรณีที่ tabindex ไม่สมเหตุสมผล) การใช้tabindexเพื่อเพิ่มองค์ประกอบที่ไม่สามารถโฟกัสได้ในการสั่งซื้อแท็บเป็นนวัตกรรมใหม่ใน HTML 5
Quentin

4
นี่เป็นสิ่งที่ผิด ไม่ว่าคุณจะอ้างอิงสเป็คที่เก่ากว่าสำหรับ HTML ในเวลานั้นฉันไม่สามารถพูดได้ แต่ตามสเป็ค HTML5 นั้นแน่นอนว่ามันถูกต้องสมบูรณ์ที่จะมีaแท็กโดยไม่มีhrefแอตทริบิวต์
ไมเคิล

23

หากคุณต้องใช้ href สำหรับความสามารถในการย้อนกลับคุณสามารถใช้

<a href="javascript:void(0)">link</a>

แทน # หากคุณไม่ต้องการใช้คุณสมบัติ


1
ฉันต้องการแท็ก <a> ที่ทำงานเหมือนลิงก์ในทุกฟังก์ชันยกเว้น นี้ได้เคล็ดลับสำหรับฉัน.
Jad S

13

แท็กใช้ได้โดยไม่มีแอตทริบิวต์ href ตรงกันข้ามกับคำตอบมากมายที่นี่มีเหตุผลมาตรฐานจริง ๆ ในการสร้างจุดยึดเมื่อไม่มี href ความหมาย "a" หมายถึงจุดยึดหรือลิงก์ ถ้าคุณใช้มันเพื่ออะไรก็ตามที่ตามความหมายนั้นคุณก็ไม่เป็นไร

การใช้แท็กหนึ่งครั้งแบบไม่มีมาตรฐานคือการสร้างลิงค์ที่มีชื่อ สิ่งนี้อนุญาตให้คุณใช้จุดยึดที่มี name = blah และใหม่กว่าบนคุณสามารถสร้างจุดยึดด้วย href = # blah เพื่อเชื่อมโยงไปยังส่วนที่มีชื่อของหน้าปัจจุบัน อย่างไรก็ตามสิ่งนี้ถูกคัดค้านเนื่องจากคุณสามารถใช้ ID ในลักษณะเดียวกันได้ ตัวอย่างเช่นคุณสามารถใช้แท็กส่วนหัวที่มี id = header และต่อมาคุณอาจมีจุดยึดที่ชี้ไปที่ href = # header

อย่างไรก็ตามจุดของฉันไม่แนะนำให้ใช้คุณสมบัติชื่อ เพื่อจัดทำกรณีการใช้งานหนึ่งกรณีโดยที่คุณไม่จำเป็นต้องใช้ href และให้เหตุผลว่าทำไมจึงไม่จำเป็นต้องใช้


2
ฉันคิดว่าสิ่งที่คำถามพยายามถามและคำตอบอื่น ๆ กำลังตอบอยู่หรือไม่ไม่ว่าจะปลอดภัยหรือไม่ที่จะละเว้นhrefแอตทริบิวต์สำหรับ<a>องค์ประกอบที่ใช้เป็นองค์ประกอบแบบโต้ตอบ (เช่นลิงก์) อย่างที่คุณพูดถึงถ้าไม่มีhrefคุณลักษณะมันค่อนข้างง่าย ... ไม่ใช่ลิงค์เพียงสมอซึ่งเป็นสิ่งที่แตกต่างออกไปโดยสิ้นเชิง
BoltClock

1
ใช่ แต่เพียงเน้น - แท็ก <a> ยังคงใช้ได้ในกรณีการใช้งานเหล่านี้
ขาวดำ

9

จากเปอร์สเปคทีฟการเข้าถึงที่<a>ไม่มี href จะไม่สามารถแท็บได้ลิงก์ทั้งหมดควรสามารถใช้แท็บได้ดังนั้นให้เพิ่ม tabindex = '0 "หากคุณไม่มี href


1
หรือใช้ปุ่มถ้ามันจะทำการกระทำในหน้าแทนที่จะเปลี่ยนเส้นทาง
SimonDever

8

<a>แท็กโดยไม่มี "href" จะมีประโยชน์เมื่อใช้เมนูหลายระดับและคุณจำเป็นต้องขยายระดับถัดไป แต่ไม่ต้องการป้ายเมนูที่จะต้องมีการเชื่อมโยงการใช้งาน ฉันไม่เคยมีปัญหาใด ๆ ที่ใช้แบบนั้น


1
คุณลองเข้าถึงเมนูนั้นด้วยคีย์บอร์ดหรือไม่
aij

ฉันเพิ่งค้นพบว่าใน IE หากคุณวางตัวเหนือลิงก์บางอันและอันนี้เป็นจุดยึดโดยไม่ต้อง href ป๊อปอัพเล็ก ๆ ที่มี URL ด้านล่างจะอยู่ตรงนั้นแสดง URL ก่อนหน้าแทนที่จะหายไป จุดยึดไม่สามารถคลิกได้ดังนั้นจึงไม่ใช่ปัญหาใหญ่ แต่พอให้ฉันไปกับ div แทน
Andrew

1

ในบางเบราว์เซอร์คุณจะประสบปัญหาหากคุณไม่ได้ให้แอตทริบิวต์ href ฉันขอแนะนำให้คุณเขียนโค้ดของคุณดังนี้:

<a href="#" onclick="yourcode();return false;">Link</a>

คุณสามารถแทนที่ yourcode () ด้วยฟังก์ชันหรือตรรกะของคุณเอง แต่อย่าลืมเพิ่ม return return คำสั่งในตอนท้าย


ฉันใช้ Backbone.js กับ Backbone.Router และมี#ไว้สำหรับหน้าดัชนี สำหรับลิงค์ navbar ของฉันฉันไม่ต้องการเรียกเส้นทาง#ที่จะเกิดอะไรขึ้นถ้าคุณใช้a href="#"ด้วยตัวเอง การใช้<a href="#" onclick="return false;"หยุดเส้นทางที่ถูกทริกเกอร์ แต่เหตุการณ์การคลิกยังคงเต็มไปถึงตัวจัดการของฉัน (ซึ่งใช้เหตุการณ์ DOM ที่ตะขอผ่าน jQuery และ Backbone.Radio) ขอบคุณ @ shashwat13 :)
David Williamson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.