Bagaimana mencegah klik pada tautan '#' agar tidak melompat ke atas halaman?

213

Saat ini saya menggunakan <a>tag dengan jQuery untuk memulai hal-hal seperti acara klik, dll.

Contohnya adalah <a href="#" class="someclass">Text</a>

Tapi aku benci bagaimana '#' membuat halaman melompat ke bagian atas halaman. Apa yang bisa saya lakukan?

st4ck0v3rfl0w
sumber
2
Saya dengan David Dorward di sini, dan gargantaun pada pertanyaan duplikat terkait. Jika Anda memiliki tautan di situs web Anda, tautan itu harus berfungsi sebagai tautan biasa. Jika JavaScript mencegat mereka dan melakukan sesuatu yang berbeda, semuanya baik dan bagus, tetapi Anda harus memiliki tautan nyata di sana, yang mengarah ke halaman nyata. Ini diperlukan untuk semua jenis alasan, tidak terkecuali SEO dan aksesibilitas.
Daniel Pryden
“Bodoh sama bodohnya dengan kita Kita semua pernah ke sana sebelumnya :)
takeshin

Jawaban:

242

Di jQuery, saat Anda menangani acara klik, return false untuk menghentikan tautan agar tidak merespons dengan cara biasamencegah tindakan default, yaitu mengunjungi hrefatribut, agar tidak terjadi (sesuai komentar PoweRoy dan jawaban Erik ):

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

    // Cancel the default action
    e.preventDefault();
});
BoltClock
sumber
1
@ pray: OP menentukan bahwa dia menggunakan jQuery untuk bekerja dengan tautan ini.
BoltClock
8
Alih-alih mengembalikan false, lakukan event.preventDefault (). Ini lebih jelas bagi orang-orang yang akan membaca kode Anda.
RvdK
@ PoweRoy: mengerti. Saya melakukan edit dan mempelajari sesuatu yang baru :)
BoltClock
5
@BoltClock OP harus menggunakan tombol untuk menangani event klik alih-alih jangkar. Jawaban Anda sangat berguna, tetapi dalam kasus ketika href menunjuk ke suatu tempat dan Anda tidak memerlukan pengalihan saat ini . Mencegah perilaku default dari tindakan yang tidak diperlukan sama sekali adalah semacam saran seperti: ambil pisau, ambil pisau dan palu paku menggunakan pegangan :) Ambil alat yang tepat untuk pekerjaan itu!
takeshin
1
Jika jquery:$('a[href=#]').click(function(e) { e.preventDefault(); });
Snufkin
298

Jadi ini sudah tua tapi ... kalau-kalau ada orang yang menemukan ini dalam pencarian.

Cukup gunakan "#/"alih-alih "#"dan halaman tidak akan melompat.

Chris
sumber
2
Persis apa yang saya butuhkan! Bahkan setahun setelah komentar Anda, ini sangat membantu saya, jadi terima kasih Chris
Zack
49
yang berfungsi karena menavigasi ke jangkar bernama /, bukan karena #/memiliki makna. Anda dapat melakukan hal yang sama dengan #whateveryouwantdan itu akan mencegah lompatan ke atas
gaul
3
Ini perlu jawaban terbaik. Terima kasih.
Gilberto Sánchez
1
@lang, meskipun Anda benar, dan ini hanya nitpicking, tapi saya lebih suka menggunakan "# /" daripada "#whateveryouwant" karena "# /" digunakan cukup umum dan dengan demikian mengungkapkan niat (Clean Code). Itu masih bisa menjadi tambahan untuk jawabannya.
jobbert
22
Hati-hati - ini membuat catatan dalam riwayat browser sehingga mengklik kembali tidak akan melakukan apa yang menurut pengguna akan dilakukan setelah mengklik tautan dengan #/atau apa pun misalnya #whatever.
Darren Sweeney
61

Anda bahkan dapat menulisnya seperti ini:

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

Saya tidak yakin ini cara yang lebih baik tetapi ini adalah jalan :)

pria schaller
sumber
Metode ini baik untuk pra-HTML 4 tetapi hari ini praktiknya sangat buruk karena terlalu banyak melanggar tindakan navigasi seperti "tautan terbuka di tab baru".
Steve-o
7
Anda mungkin benar tetapi .. dalam hal ini penting karena ia memberikan acara onclick sehingga tautan terbuka di tab baru tidak akan berfungsi ...
guy schaller
Pintasan adalah href='javascript:;'tetapi hati-hati itu memicu window.beforeUnload acara di IE
Mihir
Ini mungkin merusak fungsinya sendiri? Karena jika saya melakukan ini, fungsi saya untuk membuat slide tidak lagi dipicu.
user3806549
29

Solusi # 1: (polos)

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

Solusi # 2: (diperlukan javascript)

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

Solusi # 3: (diperlukan jQuery)

<a href="#" class="someclass">Text</a>
<script>
$('a.someclass').click(function(e) {
    e.preventDefault();
});
</script>
Nabi KAZ
sumber
3
Solusi pertama adalah sempurna. Pendek, bersih, dan sederhana. Ini harus menjadi jawaban yang diterima. Terima kasih!
AlmostPitt
Nomor 1 adalah solusi yang luar biasa. Terima kasih!
Brenton Scott
11

Gunakan saja <input type="button" />alih-alih <a>dan gunakan CSS untuk menatanya agar terlihat seperti tautan jika Anda mau.

Tombol dibuat khusus untuk mengklik, dan mereka tidak memerlukan atribut href.

Cara terbaik adalah menggunakan aksi onload untuk membuat tombol dan menambahkannya di tempat yang Anda butuhkan melalui javascript, jadi dengan javascript dinonaktifkan, mereka tidak akan ditampilkan sama sekali dan tidak membingungkan pengguna.

Ketika Anda menggunakan, href="#"Anda mendapatkan banyak tautan berbeda yang menunjuk ke lokasi yang sama, yang tidak akan berfungsi ketika agen tidak mendukung JavaScript.

takeshin
sumber
1
@kingjeffrey Tapi tidak melakukan apa-apa masih lebih baik daripada menavigasi ke #.
Robert
8

Jika Anda ingin menggunakan jangkar, Anda dapat menggunakan http://api.jquery.com/event.preventDefault/ seperti jawaban lain yang disarankan.

Anda juga dapat menggunakan elemen lain seperti rentang dan melampirkan acara klik itu.

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

Anda dapat menggunakan #0sebagai href, karena 0tidak diizinkan sebagai id, halaman tidak akan melompat.

<a href="#0" class="someclass">Text</a>
Veve
sumber
5
$('a[href="#"]').click(function(e) {e.preventDefault(); });
Praveen Manne
sumber
3
Bisakah Anda menambahkan penjelasan singkat?
JF Meier
Sepertinya saya menambahkan handler klik pada jangkar apa pun yang memiliki href "#" yang terkait dengannya. Dengan cara ini, Anda tidak perlu mencari semua penangan klik yang sudah ada dan menambahkan e.preventDefault () di dalamnya.
Mani5556
4

Gunakan saja

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

JQUERY

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

Jika elemen tidak memiliki nilai href yang berarti, maka itu sebenarnya bukan tautan, jadi mengapa tidak menggunakan beberapa elemen lain saja?

Seperti yang disarankan oleh Neothor, rentang sama tepat dan, jika ditata dengan benar, akan terlihat jelas sebagai item yang dapat diklik. Anda bahkan bisa melampirkan hover event, untuk membuat elemnt 'menyala' saat mouse pengguna bergerak di atasnya.

Namun, setelah mengatakan ini, Anda mungkin ingin memikirkan kembali desain situs Anda sehingga berfungsi tanpa javascript, tetapi ditingkatkan oleh javascript saat tersedia.

belugabob
sumber
4

Tautan dengan href = "#" hampir selalu harus diganti dengan elemen tombol:

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

Menggunakan tautan dengan href = "#" juga merupakan masalah aksesibilitas karena tautan ini akan terlihat oleh pembaca layar, yang akan membacakan "Tautan - Teks" tetapi jika pengguna mengkliknya tidak akan pergi ke mana pun.

mati suri
sumber
3

Anda bisa meneruskan tag anchor tanpa properti href, dan menggunakan jQuery untuk melakukan tindakan yang diperlukan:

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

kingjeffrey
sumber
Saya biasanya tidak merekomendasikan pendekatan ini, karena tidak ada tindakan mundur jika pengguna memiliki js dinonaktifkan. Tetapi mengingat Anda sudah memiliki href diatur #, saya berasumsi ini bukan masalah bagi Anda, dan dengan demikian menawarkan solusi ini karena kemungkinan cara paling sederhana untuk memenuhi kebutuhan Anda.
kingjeffrey
1
a:linkPemilih CSS tidak akan menargetkan tag anchor ini.
BoltClock
BoltClock, ini benar. Tetapi st4ck0v3rfl0w tidak menunjukkan kebutuhan seperti itu.
kingjeffrey
Semoga juga menggunakan <div> saat itu. Saya percaya poin dalam mempertahankan <a> adalah untuk mempertahankan stylingnya, yang sudah ditentukan oleh <a> reguler. Tanpa href, itu tidak akan terdeteksi dan ditata seperti <a> lainnya.
MarsAndBack
3

Saya telah menggunakan:

<a href="javascript://nop/" class="someClass">Text</a>
Brice Roncace
sumber
3

The #/trick bekerja, tetapi menambahkan acara sejarah untuk browser. Jadi, mengklik kembali tidak berfungsi sebagaimana yang diinginkan / diharapkan pengguna.

$('body').click('a[href="#"]', function(e) {e.preventDefault() }); adalah cara saya pergi, karena berfungsi untuk konten yang sudah ada, dan elemen apa pun yang ditambahkan ke DOM setelah dimuat.

Secara khusus, saya perlu melakukan ini di menu drop-down bootstrap di dalam .btn-group(Referensi) , jadi saya lakukan:

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

Dengan cara ini ditargetkan, dan tidak memengaruhi hal lain di laman.

David
sumber
3

Saya selalu menggunakan:

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

ketika mencoba untuk mencegah halaman melompat. Tidak yakin apakah ini yang terbaik, tetapi tampaknya telah bekerja dengan baik selama bertahun-tahun.

Josh Harris
sumber
3

Ada 4 cara serupa untuk mencegah halaman melompat ke atas tanpa JavaScript:

Pilihan 1:

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

Pilihan 2:

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

Opsi 3:

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

Opsi 4 ( Tidak disarankan ):

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

Tapi lebih baik digunakan event.preventDefault()jika Anda menyerahkan acara klik di jQuery.

ExillustX
sumber
3
Sementara kode ini dapat menjawab pertanyaan, memberikan konteks tambahan tentang bagaimana dan / atau mengapa memecahkan masalah akan meningkatkan nilai jangka panjang jawaban.
A. Suliman
2

Anda juga dapat mengembalikan false setelah memproses jquery Anda.

Misalnya.

$(".clickableAnchor").live(
    "click",
    function(){
        //your code
        return false; //<- prevents redirect to href address
    }
);
pengguna3581326
sumber
1
Itu, dan metode langsung, keduanya sudah usang dan tidak boleh digunakan lagi.
Quentin
2

Saya menggunakan sesuatu seperti ini:

<a href="#null" class="someclass">Text</a>
Stefan
sumber
2

Untuk mencegah halaman melompat, Anda perlu menelepon e.stopPropagation();setelah menelepon e.preventDefault();:

stopPropagationmencegah acara naik pohon DOM. Info lebih lanjut di sini: https://api.jquery.com/event.stoppropagation/

anthonyjruffa
sumber
bisa tolong berikan kode lengkap yang bisa saya tempel di html saya? Saya menggunakan Zurb Foundation 5.5.3.
Julie S.
2

Jika Anda ingin bermigrasi ke Bagian Jangkar di halaman yang sama tanpa melompat halaman gunakan:

Cukup gunakan "# /" bukannya "#" misalnya

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

Menambahkan sesuatu setelah #menetapkan fokus halaman ke elemen dengan ID itu. Solusi paling sederhana adalah menggunakan #/meskipun Anda menggunakan jQuery. Namun jika Anda menangani acara di jQuery, event.preventDefault()adalah cara untuk pergi.

Vivek Vijayan
sumber
0

The <a href="#!">Link</a>dan <a href="#/">Link</a>tidak berfungsi jika seseorang harus mengklik pada input yang sama lebih dari sekali .. itu hanya membutuhkan 1 kali klik event untuk masing-masing input ganda.

masih cara terbaik untuk pergi adalah dengan <a href="#">Link</a>

kemudian,

event.preventDefault();
Richard Rosario
sumber