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?



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();
});

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.


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 :)


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>

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.


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');
});

7

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

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

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

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"); }

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.


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.


3

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

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


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>

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.


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.


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.


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
    }
);

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>

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/


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..

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.


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();
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.