จะป้องกันการคลิกลิงก์ '#' ไม่ให้ข้ามไปยังด้านบนของหน้าได้อย่างไร


213

ขณะนี้ฉันกำลังใช้<a>แท็กกับ jQuery เพื่อเริ่มต้นสิ่งต่างๆเช่นกิจกรรมการคลิกเป็นต้น

ตัวอย่างคือ <a href="#" class="someclass">Text</a>

แต่ฉันเกลียดที่ '#' ทำให้หน้าข้ามไปด้านบนของหน้า ฉันควรทำอะไรแทน



2
ฉันอยู่กับ David Dorward ที่นี่และgargantaunจากคำถามที่ซ้ำกันที่เชื่อมโยง หากคุณมีลิงก์ในเว็บไซต์ของคุณพวกเขาจำเป็นต้องทำงานเหมือนลิงก์ปกติ หาก JavaScript ขัดขวางพวกเขาและทำสิ่งที่แตกต่างออกไปดีและดี แต่คุณต้องมีลิงก์จริงที่นั่นซึ่งนำไปสู่หน้าจริง นี่เป็นสิ่งจำเป็นสำหรับเหตุผลทุกประเภทไม่ใช่อย่างน้อยที่สุดก็คือ SEO และการเข้าถึง
Daniel Pryden

“ คนโง่ก็เหมือนคนโง่”พวกเราเคยไปที่นั่นมาก่อน :)
takeshin

คำตอบ:


242

ใน jQuery เมื่อคุณจัดการกับเหตุการณ์คลิก กลับเท็จเพื่อหยุดการเชื่อมโยงจากการตอบสนองตามปกติป้องกันการกระทำเริ่มต้นซึ่งจะเข้าเยี่ยมชมhrefคุณลักษณะจากที่เกิดขึ้น (ต่อความคิดเห็นของ PoweRoy และคำตอบของ Erik ):

$('a.someclass').click(function(e)
{
    // Special stuff to do when this link is clicked...

    // Cancel the default action
    e.preventDefault();
});

1
@pranay: OP ระบุว่าเขาใช้ jQuery เพื่อทำงานกับลิงก์เหล่านี้
BoltClock

8
แทนที่จะส่งคืนค่าเท็จให้ทำ event.preventDefault () นี่จะชัดเจนยิ่งขึ้นสำหรับผู้ที่จะอ่านรหัสของคุณ
RvdK

@PoweRoy: เข้าใจแล้ว ฉันทำการแก้ไขและเรียนรู้สิ่งใหม่ :)
BoltClock

5
@BoltClock OP ควรใช้ปุ่มเพื่อจัดการเหตุการณ์คลิกแทนจุดยึด คำตอบของคุณค่อนข้างมีประโยชน์ แต่ในกรณีที่ href ชี้ไปที่อื่นและคุณไม่ต้องการเปลี่ยนเส้นทางในขณะนี้ การป้องกันพฤติกรรมเริ่มต้นของการกระทำที่ไม่จำเป็นเลยเป็นคำแนะนำเช่น: ใช้มีดคว้าใบมีดและตอกตะปูโดยใช้ด้ามจับ :) ใช้เครื่องมือที่เหมาะสมสำหรับงาน!
takeshin

1
ถ้า jquery:$('a[href=#]').click(function(e) { e.preventDefault(); });
Snufkin

298

ดังนั้นนี่เก่า แต่ ... ในกรณีที่มีคนค้นหาสิ่งนี้ในการค้นหา

เพียงใช้"#/"แทน"#"และหน้าจะไม่กระโดด


2
สิ่งที่ฉันต้องการ! แม้หนึ่งปีหลังจากความคิดเห็นของคุณนี่เป็นประโยชน์สำหรับฉันดังนั้นขอบคุณ Chris
Zack

49
ใช้งานได้เพราะนำทางไปยังสมอชื่อ/ไม่ใช่เพราะ#/มีความหมายใด ๆ คุณสามารถทำสิ่งเดียวกันด้วย#whateveryouwantและมันจะป้องกันไม่ให้กระโดดขึ้นไปด้านบน
คำสแลง

3
นี่ต้องเป็นคำตอบที่ดีที่สุด ขอบคุณคุณ
Gilberto Sánchez

1
@slang แม้ว่าคุณจะถูกต้องและนี่เป็นเพียงการสร้าง nitpicking แต่ฉันต้องการใช้ "# /" แทน "#whateveryouwant" เพราะ "# /" ใช้กันทั่วไปและแสดงถึงเจตนา (Clean Code) มันอาจจะเป็นคำตอบเพิ่มเติมได้
jobbert

22
ระวัง - นี้จะสร้างบันทึกในประวัติศาสตร์เบราว์เซอร์เพื่อคลิกกลับจะไม่ทำสิ่งที่ผู้ใช้คิดว่ามันจะทำหลังจากคลิกลิงก์ด้วยหรือสิ่งอื่นเช่น#/ #whatever
Darren Sweeney

61

คุณสามารถเขียนได้เช่นนี้

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

ฉันไม่แน่ใจว่ามันเป็นวิธีที่ดีกว่า แต่มันเป็นวิธี :)


วิธีนี้ใช้ได้ผลดีสำหรับ HTML 4 ล่วงหน้า แต่วันนี้เป็นวิธีปฏิบัติที่ไม่ดีนักเนื่องจากมีการใช้งานการนำทางมากเกินไปเช่น "เปิดลิงก์ในแท็บใหม่"
Steve-o

7
คุณอาจจะถูก แต่ .. ในกรณีนี้มันไม่สำคัญเพราะเขาให้เหตุการณ์ onclick ดังนั้นการเปิดลิงก์ในแท็บใหม่จะไม่ทำงานต่อไป ...
guy schaller

ทางลัดเป็นhref='javascript:;'แต่ต้องระวังมันจะทริกเกอร์ window.beforeUnload เหตุการณ์ใน IE
Mihir

นี่อาจทำให้หน้าที่ของเขาแตก เพราะถ้าฉันทำสิ่งนี้ func ของฉันในการเรนเดอร์สไลด์จะไม่กระตุ้นอีกต่อไป
user3806549

29

โซลูชัน # 1: (ธรรมดา)

<a href="#!" class="someclass">Text</a>

โซลูชัน # 2: (จำเป็นjavascript)

<a href="javascript:void(0);" class="someclass">Text</a>

โซลูชัน # 3: (จำเป็นjQuery)

<a href="#" class="someclass">Text</a>
<script>
$('a.someclass').click(function(e) {
    e.preventDefault();
});
</script>

3
ทางออกแรกนั้นสมบูรณ์แบบ สั้นสะอาดและเรียบง่าย นี่ควรเป็นคำตอบที่ยอมรับได้ ขอบคุณ!
เกือบPitt

หมายเลข 1 คือทางออกที่ยอดเยี่ยม ขอบคุณ!
Brenton Scott

15

คุณสามารถใช้event.preventDefault()เพื่อหลีกเลี่ยงปัญหานี้ อ่านเพิ่มเติมได้ที่นี่: http://api.jquery.com/event.preventDefault/


11

เพียงใช้<input type="button" />แทน<a>และใช้ CSS เพื่อจัดให้มีลักษณะเหมือนลิงก์หากคุณต้องการ

ปุ่มต่างๆถูกสร้างขึ้นมาเพื่อการคลิกโดยเฉพาะและพวกเขาไม่ต้องการแอตทริบิวต์ href ใด ๆ

วิธีที่ดีที่สุดคือการใช้การกระทำแบบ onload เพื่อสร้างปุ่มและต่อท้ายที่คุณต้องการผ่านทางจาวาสคริปต์ดังนั้นเมื่อปิดการใช้งานจาวาสคริปต์พวกเขาจะไม่แสดงเลยและไม่สับสนผู้ใช้

เมื่อคุณใช้href="#"คุณจะได้รับลิงค์ต่าง ๆ มากมายที่ชี้ไปยังตำแหน่งเดียวกันซึ่งจะไม่ทำงานเมื่อเอเจนต์ไม่สนับสนุน JavaScript


1
@kingjeffrey #แต่ทำอะไรก็ยังดีกว่าไปที่
Robert

8

หากคุณต้องการใช้สมอคุณสามารถใช้http://api.jquery.com/event.preventDefault/เหมือนคำตอบอื่น ๆ ที่แนะนำ

นอกจากนี้คุณยังสามารถใช้องค์ประกอบอื่น ๆ เช่นการขยายและแนบเหตุการณ์คลิกไปที่

$("span.clickable").click(function(){
alert('Yeah I was clicked');
});

7

คุณสามารถใช้#0เป็น href ได้เนื่องจาก0ไม่ได้รับอนุญาตให้เป็น id หน้าจะไม่กระโดด

<a href="#0" class="someclass">Text</a>

5
$('a[href="#"]').click(function(e) {e.preventDefault(); });

3
คุณช่วยเพิ่มคำอธิบายสั้น ๆ หน่อยได้ไหม?
JF Meier

ดูเหมือนว่าฉันจะเพิ่มตัวจัดการการคลิกบนจุดยึดใด ๆ ที่มี href ของ "#" ที่เกี่ยวข้อง ด้วยวิธีนี้คุณจะไม่ต้องค้นหาตัวจัดการการคลิกทั้งหมดที่คุณมีอยู่แล้วและเพิ่ม e.preventDefault () ภายในตัวพวกเขา
Mani5556

4

เพียงแค่ใช้

<a href="javascript:;" class="someclass">Text</a>

jQuery

$('.someclass').click(function(e) { alert("action here"); }

4

หากองค์ประกอบไม่มีค่า href ที่มีความหมายแสดงว่าไม่ใช่ลิงก์จริงๆดังนั้นทำไมไม่ใช้องค์ประกอบอื่นแทน

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

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


4

ลิงก์ที่มี href = "#" ควรถูกแทนที่ด้วยองค์ประกอบปุ่มเกือบทุกครั้ง:

<button class="someclass">Text</button>

การใช้ลิงค์กับ href = "#" เป็นปัญหาการเข้าถึงเนื่องจากลิงก์เหล่านี้จะปรากฏแก่ผู้อ่านหน้าจอซึ่งจะอ่าน "Link - Text" แต่ถ้าผู้ใช้คลิกมันจะไม่ไปไหนเลย


3

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

<a class="foo">bar</a>


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

1
a:linkตัวเลือก CSS จะไม่กำหนดเป้าหมายแท็กจุดยึดนี้
BoltClock

BoltClock นี่เป็นเรื่องจริง แต่ st4ck0v3rfl0w ไม่ได้ระบุถึงความต้องการดังกล่าว
kingjeffrey

อาจใช้ <div> เช่นกัน ฉันเชื่อว่าจุดสำคัญในการรักษา <a> คือการจัดแต่งทรงผมซึ่งได้รับการกำหนดโดย <a> ปกติแล้ว เมื่อไม่มี href จะไม่ถูกตรวจพบและจัดรูปแบบเหมือนกับ <a> อื่น ๆ
MarsAndBack


3

#/เคล็ดลับการทำงาน แต่จะเพิ่มเหตุการณ์ประวัติศาสตร์เบราว์เซอร์ ดังนั้นการคลิกย้อนกลับจะไม่ทำงานอย่างที่ผู้ใช้อาจต้องการ / คาดหวัง

$('body').click('a[href="#"]', function(e) {e.preventDefault() }); เป็นวิธีที่ฉันไปเพราะมันใช้งานได้กับเนื้อหาที่มีอยู่แล้วและองค์ประกอบใด ๆ ที่เพิ่มไปยัง DOM หลังจากโหลด

โดยเฉพาะฉันต้องทำสิ่งนี้ในรายการแบบหล่นลง bootstrap ภายในของ.btn-group(อ้างอิง)ดังนั้นฉันได้:

$('body').click('.dropdown-menu li a[href="#"]', function(e) {e.preventDefault() });

วิธีนี้เป็นเป้าหมายและไม่ส่งผลกระทบต่อสิ่งอื่นใดบนหน้าเว็บ


3

ฉันเคยใช้:

<a href="#?">Some text</a>

เมื่อพยายามป้องกันการข้ามหน้า ไม่แน่ใจว่านี่เป็นสิ่งที่ดีที่สุด แต่ดูเหมือนว่าจะทำงานได้ดีมาหลายปี


3

มี 4 วิธีที่คล้ายกันในการป้องกันไม่ให้หน้าไปด้านบนโดยไม่ใช้ JavaScript:

ตัวเลือกที่ 1:

<a href="#0">Link</a>

ตัวเลือก 2:

<a href="#!">Link</a>

ตัวเลือก 3:

<a href="#/">Link</a>

ตัวเลือก 4 ( ไม่แนะนำ ):

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

แต่จะเป็นการดีกว่าevent.preventDefault()ถ้าใช้หากคุณส่งกิจกรรมคลิกใน jQuery


3
ในขณะที่รหัสนี้อาจตอบคำถามให้บริบทเพิ่มเติมเกี่ยวกับวิธีการและ / หรือทำไมมันแก้ปัญหาจะปรับปรุงค่าระยะยาวของคำตอบ
A. Suliman

2

คุณสามารถคืนค่าเท็จหลังจากประมวลผล jQuery ของคุณ

เช่น.

$(".clickableAnchor").live(
    "click",
    function(){
        //your code
        return false; //<- prevents redirect to href address
    }
);

1
นั่นและวิธีการถ่ายทอดสดทั้งเลิกใช้แล้วและไม่ควรใช้อีกต่อไป
เควนติน


2

เพื่อป้องกันไม่ให้หน้ากระโดดคุณต้องโทรe.stopPropagation();หลังจากโทรe.preventDefault();:

stopPropagationป้องกันเหตุการณ์จากการขึ้นต้นทรี DOM ข้อมูลเพิ่มเติมที่นี่: https://api.jquery.com/event.stoppropagation/


คุณช่วยระบุรหัสแบบเต็มที่ฉันสามารถวางใน html ของฉันได้ไหม ฉันใช้ Zurb Foundation 5.5.3
Julie S.

2

หากคุณต้องการโยกย้ายไปยังส่วน Anchor ในหน้าเดียวกันโดยไม่ต้องใช้การกระโดดหน้า:

เพียงใช้ "# /" แทน "#" เช่น

<a href="#/home">Home</a>
<a href="#/about">About</a>
<a href="#/contact">contact</a> page will not jump up on click..

1

การเพิ่มบางสิ่งหลังจาก#กำหนดโฟกัสของหน้าไปยังองค์ประกอบด้วยรหัสนั้น ทางออกที่ง่ายที่สุดคือการใช้#/แม้ว่าคุณจะใช้ jQuery อย่างไรก็ตามหากคุณจัดการกับเหตุการณ์ใน jQuery event.preventDefault()เป็นวิธีที่จะไป


0

<a href="#!">Link</a>และ<a href="#/">Link</a>ไม่ทำงานถ้าหนึ่งที่มีการคลิกที่ป้อนข้อมูลเดียวกันมากกว่าหนึ่งครั้ง .. มันใช้เวลาเพียง 1 ในเหตุการณ์คลิกสำหรับแต่ละในหลายปัจจัย

ยังคงเป็นวิธีที่ดีที่สุดที่จะไปอยู่กับ <a href="#">Link</a>

แล้ว

event.preventDefault();
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.