วิธีการทำแท็กสมอหมายถึงอะไร


159

ฉันใช้ jQuery ฉันต้องทำให้แท็กจุดยึดไม่ทำงาน

ฉันมักจะเขียนแบบนี้:

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

อย่างไรก็ตามนี่หมายถึงด้านบนของหน้า!


เพราะ jquery จะจัดการกับเหตุการณ์การคลิกดังนั้นฉันต้องการให้ลิงก์เป็นเหมือนลิงก์ achor แต่ทำตัวเหมือนฟังก์ชั่นของจาวาสคริปต์
เหม็ด

dupe ที่มีประสิทธิภาพ: stackoverflow.com/questions/265478/preventdefault-on-an-a-tag
annakata

1
ดังที่กล่าวไว้ในหนึ่งในคำตอบด้านล่าง: หากคุณไม่ต้องการให้ลิงก์ชี้ไปที่แหล่งข้อมูลอย่าใช้องค์ประกอบ A
งัด Bynens

อย่าใช้hrefคุณลักษณะที่อยู่ในนั้น
vsync

คำตอบ:


103

หากคุณไม่ต้องการให้มันชี้ไปที่สิ่งใดคุณอาจไม่ควรใช้<a>แท็ก (สมอ)

หากคุณต้องการบางสิ่งให้ดูเหมือนลิงค์ แต่ไม่ทำหน้าที่เหมือนลิงก์คุณควรใช้องค์ประกอบที่เหมาะสม (เช่น<span>) จากนั้นกำหนดสไตล์โดยใช้ CSS:

<span class="fake-link" id="fake-link-1">Am I a link?</span>

.fake-link {
    color: blue;
    text-decoration: underline;
    cursor: pointer;
}

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

$('#fake-link-1').click(function() {
    /* put your code here */
});

37
ปัญหานี้มีปัญหา: ไม่อนุญาตให้ใช้การนำทางแท็บ

6
โปรดทราบว่า (ตามที่ Iraimbilanja ชี้ให้เห็น) วิธีการขยายที่นี่จะปิดใช้งานความเป็นไปได้ที่จะเรียกใช้ฟังก์ชันโดยใช้แป้นพิมพ์ซึ่งฉันจะพิจารณาปัญหาการใช้งาน
Fredrik Mörk

3
ปัญหาการเข้าถึง คุณสามารถแก้ไขได้โดยใช้องค์ประกอบปุ่ม (สร้างจาก JavaScript เพื่อให้ผู้ใช้ที่ไม่ใช่ JS ไม่ได้รับการควบคุมที่เสียหาย)
Quentin

4
ต่อไปนี้เป็นวิธีแก้ไขปัญหาอย่างรวดเร็ว: tabindex = "0" บนองค์ประกอบที่ไม่ใช่ลิงก์จะเปิดใช้งานการนำทางแป้นพิมพ์ในเบราว์เซอร์ที่ทันสมัยที่สุด
งัด Bynens

1
อีก 'ปัญหา' คือคุณไม่ได้ CSS: โฮเวอร์หลอกคลาสจะไม่ทำงานกับองค์ประกอบที่ไม่ได้เชื่อมโยงใน IE6 แต่เนื่องจากคุณกำลังเพิ่มองค์ประกอบเหล่านี้ผ่าน JavaScript อยู่ดี (อย่างน้อยคุณควร) คุณก็สามารถเขียนสคริปต์ที่เพิ่มคลาส. hover ไปยังองค์ประกอบเมื่อทำการโฮเวอร์
งัด Bynens

268

มีน้อยกว่าโซลูชั่นที่สมบูรณ์แบบ:

1. ลิงก์ไปที่สมอเรือปลอม

<a href="#">

ปัญหา: คลิกที่ลิงค์กระโดดกลับไปที่ด้านบนของหน้า

2. ใช้แท็กอื่นที่ไม่ใช่ 'a'

ใช้แท็ก span และใช้ jquery เพื่อจัดการการคลิก

ปัญหา: หยุดการนำทางคีย์บอร์ดต้องเปลี่ยนเคอร์เซอร์โฮเวอร์ด้วยตนเอง

3. เชื่อมโยงไปยังฟังก์ชั่นโมฆะ javascript

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

ปัญหา: หยุดพักเมื่อเชื่อมโยงรูปภาพใน IE

สารละลาย

เนื่องจากสิ่งเหล่านี้ล้วนแล้วแต่มีปัญหาวิธีแก้ปัญหาที่ฉันตัดสินคือการเชื่อมโยงไปยังจุดยึดปลอมแล้วคืนค่าเท็จจากเมธอด onClick:

<a href="#" onClick="return false;">

ไม่ใช่วิธีแก้ปัญหาที่กระชับที่สุด แต่มันแก้ปัญหาทั้งหมดด้วยวิธีการข้างต้น


2
ฉันมักจะใช้ javascript: void (0); วิธีการเนื่องจากการใช้ # แสดง URL ปัจจุบันในแถบของ Firefox บนเม้าส์ซึ่งอาจทำให้เข้าใจผิดสำหรับผู้ใช้
lucaferrario

8
breaks when linking images in IEสิ่งนี้หมายความว่า?
eugene

14
@ugene คำถามนี้มีอายุ 3 ปีแล้ว แต่ IE เคยทำให้รูปภาพหายไปเมื่อมีลิงก์ไปยังฟังก์ชั่นโมฆะ ไม่แน่ใจว่าเมื่อแก้ไขแล้ว แต่ใช้งานได้ใน IE10 ซึ่งเป็นสิ่งที่ฉันติดตั้งไว้ทั้งหมด ตอนนี้ฉันใช้เป็นการส่วนตัว<a href="javascript:;">
zaius

1
ฉันเคยใช้ความคิดเห็นในที่นั่นด้วย: <a href="javascript:void(0); // แสดงคุณสมบัติ palette"> ด้วยวิธีดังกล่าวเมื่อผู้ใช้เลื่อนขึ้นพวกเขาจะเห็นความคิดเห็นที่สามารถบอกใบ้ถึงสิ่งที่คาดหวังเมื่อพวกเขาคลิก (แม้ว่าคุณสามารถใช้คำแนะนำเครื่องมือได้เช่นกัน)
Robin Zimmermann

5
ดูเหมือนว่าhref="javascript:"ยังเพียงพอและใช้งานได้ในเบราว์เซอร์หลักล่าสุด ไม่จำเป็นต้องใช้เครื่องหมายอัฒภาคในความเป็นจริง PhpStorm ยังแนะนำให้ลบออก
jlh

40

ในการทำให้มันไม่ทำอะไรเลยให้ใช้สิ่งนี้:

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

1
<a href="javascript:;">หรือเพียงแค่ PS ไม่ได้ทำงานกับtarget=_blankแม้ว่า
อเล็กซ์

36

วิธีที่ถูกต้องในการจัดการสิ่งนี้คือ "ทำลาย" ลิงก์ด้วย jQuery เมื่อคุณจัดการลิงก์

HTML

<a href="#" id="theLink">My Link</a>

JS

$('#theLink').click(function(ev){
    // do whatever you want here

    ev.preventDefault();
    ev.stopPropagation();
});

การเรียกสองครั้งสุดท้ายนั้นหยุดเบราว์เซอร์ตีความการคลิก


5
ในขณะที่ฟังดูเหมือนว่า "เหมาะสม" เพราะจะหยุดการทำกิจกรรม แต่การส่งคืนค่าเท็จเป็น verbose ที่น้อยกว่าและทำสิ่งเดียวกัน ครั้งเดียวที่คุณต้องการทำคือถ้าคุณมีตัวจัดการเหตุการณ์ที่ลงทะเบียนไว้กับการคลิกลิงก์ผ่าน jQuery แล้ว
aleemb

25

มีหลายวิธีที่จะทำเช่นนั้น

อย่าเพิ่มและhrefคุณสมบัติ

<a name="here"> Test <a>

คุณสามารถเพิ่มเหตุการณ์ onclick แทน href like

<a name="here" onclick="YourFunction()"> Test <a>

หรือคุณสามารถเพิ่มฟังก์ชัน void เช่นนี้ซึ่งจะเป็นวิธีที่ดีที่สุด

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

จำเป็นต้องระบุแอตทริบิวต์ชื่อหรือไม่
Petrus Theron

@PetrusTheron ไม่จำเป็น .
Punit Gajjar

นี่คือ rip-off ของคำตอบที่มีอยู่ก่อน
aross

1
อย่าลืมตั้งค่าสไตล์ของแท็กจุดยึดของคุณหากคุณลบแอhrefททริบิวต์เนื่องจากจะไม่ทำงานเหมือนไฮเปอร์ลิงก์ (แม้ว่า onclick จะยังใช้งานได้) คุณจะต้องรีเซ็ตสิ่งที่ชอบcursor: pointer;และ:hoverตัวเลือก
Partack

@Partack ถูกต้อง .. ขอบคุณที่สังเกต
Punit Gajjar

24

คุณหมายถึงอะไรโดยเปล่าประโยชน์?

<a href='about:blank'>blank page</a>

หรือ

<a href='whatever' onclick='return false;'>won't navigate</a>

1
ตกลงกัน - เพียงแค่ผลตอบแทนที่ผิดพลาดจากวิธี jQuery และ voila ของคุณก็จะไม่ไปไหน
joshcomley

14

ฉันคิดว่าคุณสามารถลอง

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

สิ่งเดียวที่ฉันเห็นที่นี่คือการรักษาความปลอดภัยเบราว์เซอร์ระดับสูงอาจแจ้งให้ดำเนินการจาวาสคริปต์

แม้ว่านี่จะเป็นวิธีที่ง่ายกว่า

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

ควรใช้เท่าที่จำเป็น

อ่านบทความนี้สำหรับพอยน์เตอร์บางตัวhttps://web.archive.org/web/20090301044015/http://blog.reindel.com/2006/08/11/a-hrefjavascriptvoid0-avoid-the-void


คำตอบที่ถูกต้องช่วยให้การนำทางแท็บ
K - ความเป็นพิษใน SO กำลังเพิ่มขึ้น

14

คำตอบนี้ควรได้รับการอัปเดตเพื่อแสดงถึงมาตรฐานเว็บใหม่ (HTML5)

นี้:

<a tabindex="0">This represents a placeholder hyperlink</a>

... เป็น HTML5 ที่ถูกต้อง คุณลักษณะ tabindex ทำให้แป้นพิมพ์สามารถโฟกัสได้เหมือนไฮเปอร์ลิงก์ปกติ คุณอาจใช้spanองค์ประกอบสำหรับสิ่งนี้ตามที่กล่าวไว้ก่อนหน้านี้ แต่ฉันพบว่าการใช้aองค์ประกอบนั้นดูดีกว่า

ดู: https://w3c.github.io/html-reference/a.html
และ: https://html.spec.whatwg.org/multipage/links.html#attr-hyperlink-href


1
นอกจากนี้ยังเป็น HTML4 ที่ถูกต้อง แต่จะไม่จัดแนวสมอเป็นลิงก์
ระหว่าง

1
ฉันไม่ทราบว่ามันเป็น html4 ที่ถูกต้อง แต่ข้อกำหนดของ HTML5 ระบุถึงกรณีใช้งานอย่างชัดเจน และสไตล์ที่ไม่ได้กำหนดเป้าหมายแอตทริบิวต์ href จะใช้งานได้เพียงสไตล์เบราว์เซอร์เริ่มต้นอาจเป็นปัญหา
aross

1
สิ่งนี้ยังไม่ทริกเกอร์clickเหตุการณ์เมื่อผู้ใช้เน้นองค์ประกอบและกด (ทดสอบใน Firefox 51)
torvin

@torvin มันง่ายมาก ใช้keydownเหตุการณ์
aross

การเล่นโวหารน่ารังเกียจ แต่ในหน้าต่าง 10 จะเพิ่มกล่องล้อมรอบองค์ประกอบ
1-14x0r

12

ต่อไปนี้เป็นสามวิธีสำหรับคุณสมบัติแท็ก<a>ของhrefแท็กที่อ้างถึงสิ่งใด

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

<a href="javascript:;">link</a >

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

1
นี่เป็นเพียงคำตอบที่ซ้ำกันของคำตอบที่ได้รับการโหวตสูงสุดในขณะนี้แต่มีข้อมูลน้อยกว่า
aross

5

ฉันรู้ว่านี่เป็นคำถามเก่า แต่ฉันคิดว่าฉันจะเพิ่มสองเซ็นต์ของฉัน:

ขึ้นอยู่กับว่าลิงก์กำลังทำอะไร แต่โดยปกติฉันจะชี้ลิงค์ไปยัง url ที่อาจแสดง / ทำสิ่งเดียวกันตัวอย่างเช่นหากคุณทำกล่องป๊อปอัปเล็กน้อย:

<a id="about" href="/about">About</a>

จากนั้นด้วย jQuery

$('#about').click(function(e) {
    $('#aboutbox').show();
    e.preventDefault();
});

ด้วยวิธีนี้เบราว์เซอร์ที่เก่ามาก (หรือเบราว์เซอร์ที่ปิดใช้งาน JavaScript) ยังคงสามารถนำทางไปยังหน้าเว็บที่แยกจากกันได้ แต่ที่สำคัญกว่านั้น Google จะเลือกและรวบรวมข้อมูลเนื้อหาของหน้าเกี่ยวกับ


5

ตรวจสอบให้แน่ใจว่าลิงก์ทั้งหมดของคุณที่คุณต้องการหยุดมีhref="#!"(หรืออะไรก็ได้ที่คุณต้องการจริงๆ) จากนั้นใช้สิ่งนี้:

jq('body').on('click.stop_link', 'a[href="#!"]',
function(event) {
     event.preventDefault();
});

4

คุณสามารถมีสมอ HTML ( aแท็ก) โดยไม่มีhrefแอตทริบิวต์ ออกจากhrefแอตทริบิวต์ & จะไม่เชื่อมโยงกับสิ่งใด:

<a>link</a>

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

1
ถ้าคนอื่นจะคิดว่ามันเป็น HTML5 ที่ถูกต้องแล้วคำตอบคือใช่ :) stackoverflow.com/a/33046203/5323892 นี่คือจากตัวอย่างจากหน้ามาตรฐาน (ดูรายการที่ 3): <nav> <ul> <li> <a href="https://stackoverflow.com/"> หน้าแรก </a> </li> <li> <a href = "/ ข่าว "> ข่าว </a> </li> <li> <a> ตัวอย่าง </a> </li> <li> <a href="https://stackoverflow.com/legal"> กฎหมาย </a> </li> </ ul> </nav>
Mohsin

มันใช้งานได้ แต่ถ้าคุณต้องการให้ตัวชี้เมาส์เปลี่ยนเป็นนิ้วเพียงเพิ่ม href = "JavaScript: void (0)" ตามที่แนะนำใน @Rutesh Makhijani
Tarik

3

สิ่งเดียวที่ได้ผลสำหรับฉันคือการรวมกันของข้างต้น:

ก่อนอื่น li ใน ul

<li><a onclick="LoadTab2_1()" href="JavaScript:void(0)">All Assigned</a></li>

จากนั้นใน LoadTab2_1 ฉันสลับแท็บด้วยตนเอง

$("#tabs-2-1").hide();
    $("#tabs-2-2").show();

นี่เป็นเพราะการตัดการเชื่อมต่อของยังตัดการเชื่อมต่อการกระทำในแท็บ

คุณต้องกำหนดสไตล์ของแท็บด้วยตนเองเมื่อแท็บหลักเปลี่ยนสิ่งต่างๆ

$("#secTab1").addClass("ui-tabs-active").addClass("ui-state-active").addClass("ui-state-hover").addClass("ui-state-focus");
    $("#secTab1 a").css("color", "#ffffff");


1
<a href="#" onclick="SomeFunction()"  class="SomeClass">sth.</a>

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

<a onclick="SomeFunction()"  class="SomeClass">sth.</a>

และฉันต้องการเพิ่ม css นี้

.SomeClass
{
    cursor: pointer;
}

คุณหมายถึงอะไรกับสิ่งนั้น แนะนำคืออะไรและเพราะเหตุใด
Burk

วิธีปฏิบัติที่ดีในการเก็บ javascript และ html ในไฟล์แยกกันนี่คือคำตอบโดยละเอียด: stackoverflow.com/questions/5871640/…
Alexandru Severin

1

ฉันพบปัญหานี้ในไซต์ WordPress ส่วนหัวของเมนูแบบเลื่อนลงมีแอตทริบิวต์href=""และปลั๊กอินส่วนหัวที่ใช้เฉพาะ URL มาตรฐานที่อนุญาตเท่านั้น ทางออกที่ง่ายที่สุดมีเพียงการเรียกใช้รหัสนี้ในส่วนท้าย:

jQuery('[href=""]').click(function(e){
    e.preventDefault();
});

สิ่งนี้จะป้องกันจุดยึดที่ว่างเปล่าไม่ให้ทำอะไรเลย


0

ตอบสนองไม่สนับสนุนการใช้ฟังก์ชันเช่นนี้href="javascript:void(0)"ในแท็ก anchor ของคุณอีกต่อไปแต่นี่เป็นสิ่งที่ใช้ได้ดี

<a href="#" onClick={() => null} >link</a>

-1

ฉันรู้ว่านี่ถูกติดแท็กเป็นคำถาม jQuery แต่คุณสามารถตอบคำถามนี้ด้วย AngularJS เช่นกัน

ในองค์ประกอบของคุณเพิ่มคำสั่ง ng-click และใช้ตัวแปร $ event ซึ่งเป็นเหตุการณ์คลิก ... ป้องกันพฤติกรรมเริ่มต้น:

<a href="#" ng-click="$event.preventDefault()">

คุณสามารถส่งผ่านตัวแปร $ event ไปยังฟังก์ชันได้:

<a href="#" ng-click="doSomething($event)">

ในฟังก์ชั่นนั้นคุณทำสิ่งที่คุณต้องการด้วยการคลิกเหตุการณ์

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