Làm cách nào để ngăn nhấp chuột vào liên kết '#' nhảy lên đầu trang?


212

Tôi hiện đang sử dụng <a>các thẻ với jQuery để bắt đầu những thứ như các sự kiện nhấp chuột, v.v.

Ví dụ là <a href="#" class="someclass">Text</a>

Nhưng tôi ghét cách '#' làm cho trang nhảy lên đầu trang. Tôi có thể làm gì thay thế?



2
Tôi với David Dorward ở đây, và gargantaun về câu hỏi trùng lặp được liên kết. Nếu bạn có các liên kết trên trang web của bạn, họ cần phải hoạt động như các liên kết bình thường. Nếu JavaScript chặn chúng và làm một cái gì đó khác biệt, tất cả đều tốt và tốt, nhưng bạn cần phải có một liên kết thực sự ở đó, dẫn đến một trang thực sự. Điều này là cần thiết cho tất cả các loại lý do, không phải ít nhất là SEO và khả năng truy cập.
Daniel Pryden

Câm

Câu trả lời:


241

Trong jQuery, khi bạn xử lý sự kiện nhấp chuột, trả về false để ngăn liên kết phản hồi theo cách thông thườngngăn hành động mặc định, đó là truy cập hrefthuộc tính, diễn ra (theo nhận xét của PoweRoy và câu trả lời của Erik ):

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

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

1
@pranay: OP chỉ định rằng anh ấy đang sử dụng jQuery để làm việc với các liên kết này.
BoltClock

8
Thay vì trả về false, hãy thực hiện một event.preventDefault (). Điều này rõ ràng hơn cho những người sẽ đọc mã của bạn.
RvdK

@PoweRoy: hiểu rồi Tôi đã thực hiện chỉnh sửa và học được điều gì đó mới :)
BoltClock

5
@BoltClock OP nên sử dụng các nút để xử lý các sự kiện nhấp thay vì neo. Câu trả lời của bạn khá hữu ích, nhưng trong trường hợp khi href điểm ở đâu đó và bạn không cần chuyển hướng vào lúc này . Ngăn chặn hành vi mặc định của hành động hoàn toàn không cần thiết là một loại lời khuyên như: lấy dao, lấy lưỡi dao và đóng đinh bằng tay cầm :) Hãy sử dụng một công cụ phù hợp cho công việc!
takeshin

1
Nếu jquery:$('a[href=#]').click(function(e) { e.preventDefault(); });
Snufkin

298

Vì vậy, đây là cũ nhưng ... chỉ trong trường hợp ai đó tìm thấy điều này trong một tìm kiếm.

Chỉ cần sử dụng "#/"thay vì "#"và trang sẽ không nhảy.


2
Chính xác những gì tôi cần! Thậm chí một năm sau bình luận của bạn, điều này rất hữu ích cho tôi vì vậy cảm ơn bạn Chris
Zack

49
Nó hoạt động bởi vì nó điều hướng đến neo được đặt tên /, không phải vì #/có bất kỳ ý nghĩa nào. bạn có thể làm điều tương tự với #whateveryouwantnó và nó sẽ ngăn một cú nhảy lên đỉnh
tiếng lóng

3
Điều này cần phải là câu trả lời tốt nhất. Cảm ơn bạn
Gilberto Sánchez

1
@slang, mặc dù bạn đúng và đây chỉ là trò đùa, nhưng tôi thích sử dụng "# /" thay vì "#whateveryouwant" vì "# /" được sử dụng khá phổ biến và do đó tiết lộ ý định (Mã sạch). Nó vẫn có thể là một bổ sung cho câu trả lời mặc dù.
jobbert

22
Cẩn thận - điều này tạo ra một bản ghi trong lịch sử trình duyệt, vì vậy, nhấp lại sẽ không làm những gì người dùng nghĩ rằng nó sẽ làm sau khi nhấp vào một liên kết với #/hoặc bất cứ điều gì khác, ví dụ #whatever.
Darren Sweeney

61

bạn thậm chí có thể viết nó như thế này:

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

Tôi không chắc chắn đó là một cách tốt hơn nhưng đó là một cách :)


Phương pháp này rất tốt cho tiền HTML 4 nhưng ngày nay nó rất tệ vì nó phá vỡ quá nhiều hành động điều hướng như "liên kết mở trong tab mới".
Steve-o

7
bạn có thể đúng nhưng .. trong trường hợp này không thành vấn đề vì anh ta đang đưa ra một sự kiện onclick nên liên kết mở trong tab mới sẽ không hoạt động ...
anh chàng schaller

Phím tắt là href='javascript:;'nhưng hãy cẩn thận, nó kích hoạt sự kiện window.b BeforeUnload trong IE
Mihir

Điều này có thể phá vỡ chức năng của chính mình? Bởi vì nếu tôi làm điều này, func của tôi để kết xuất các slide sẽ không còn được kích hoạt nữa.
3806549

29

Giải pháp số 1: (đơn giản)

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

Giải pháp số 2: (cần thiết javascript)

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

Giải pháp số 3: (cần thiết jQuery)

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

3
Giải pháp đầu tiên là hoàn hảo. Ngắn gọn, sạch sẽ và đơn giản. Đây phải là câu trả lời được chấp nhận. Cảm ơn!
MostPitt

Số 1 là một giải pháp tuyệt vời. Cảm ơn bạn!
Brenton Scott


11

Chỉ cần sử dụng <input type="button" />thay vì <a>và sử dụng CSS để tạo kiểu cho nó giống như một liên kết nếu bạn muốn.

Các nút được tạo riêng để nhấp và chúng không cần bất kỳ thuộc tính href nào.

Cách tốt nhất là sử dụng hành động onload để tạo nút và nối nó vào nơi bạn cần thông qua javascript, vì vậy với javascript bị vô hiệu hóa, chúng sẽ không hiển thị gì cả và không gây nhầm lẫn cho người dùng.

Khi bạn sử dụng, href="#"bạn nhận được vô số liên kết khác nhau trỏ đến cùng một vị trí, điều này sẽ không hoạt động khi tác nhân không hỗ trợ JavaScript.


1
@kingjeffrey Nhưng không làm gì vẫn tốt hơn là điều hướng đến #.
Robert

8

Nếu bạn muốn sử dụng một neo, bạn có thể sử dụng http://api.jquery.com/event.preventDefault/ như các câu trả lời khác được đề xuất.

Bạn cũng có thể sử dụng bất kỳ yếu tố nào khác như nhịp và đính kèm sự kiện nhấp vào đó.

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

7

Bạn có thể sử dụng #0as href, vì 0không được phép dưới dạng id, trang sẽ không nhảy.

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

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

3
Bạn có thể vui lòng thêm một lời giải thích ngắn?
JF Meier

Có vẻ như tôi đang thêm một trình xử lý nhấp chuột vào bất kỳ neo nào có href "#" được liên kết với nó. Bằng cách này, bạn sẽ không phải tìm kiếm tất cả các trình xử lý nhấp chuột mà bạn đã có và thêm e.preventDefault () vào trong chúng.
Mani5556

4

Chỉ dùng

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

YÊU CẦU

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

4

Nếu phần tử không có giá trị href, thì đó không thực sự là một liên kết, vậy tại sao không sử dụng một số phần tử khác thay thế?

Theo đề xuất của Neothor, một nhịp chỉ phù hợp và, nếu được tạo kiểu chính xác, sẽ rõ ràng rõ ràng như một mục có thể được nhấp vào. Bạn thậm chí có thể đính kèm một sự kiện di chuột, để làm cho elemnt 'sáng lên' khi chuột của người dùng di chuyển qua nó.

Tuy nhiên, đã nói điều này, bạn có thể muốn suy nghĩ lại về thiết kế trang web của mình để nó hoạt động mà không cần javascript, nhưng được tăng cường bởi javascript khi nó có sẵn.


4

Liên kết với href = "#" hầu như luôn luôn được thay thế bằng một phần tử nút:

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

Sử dụng các liên kết với href = "#" cũng là một mối quan tâm về khả năng truy cập vì các liên kết này sẽ hiển thị cho trình đọc màn hình, nó sẽ đọc ra "Liên kết - Văn bản" nhưng nếu người dùng nhấp vào thì nó sẽ không đi đến đâu.


3

Bạn chỉ có thể vượt qua thẻ neo mà không có thuộc tính href và sử dụng jQuery để thực hiện hành động bắt buộc:

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


Tôi thường không khuyến nghị phương pháp này, vì không có hành động dự phòng nếu người dùng bị vô hiệu hóa js. Nhưng do bạn đã cài đặt href #, tôi cho rằng đây không phải là vấn đề đáng lo ngại đối với bạn và do đó đưa ra giải pháp này vì đây có thể là phương tiện đơn giản nhất để đáp ứng nhu cầu của bạn.
kingjeffrey

1
a:linkBộ chọn CSS sẽ không nhắm mục tiêu thẻ neo này.
BoltClock

BoltClock, đây là sự thật. Nhưng st4ck0v3rfl0w không cho thấy nhu cầu như vậy.
kingjeffrey

Cũng có thể sử dụng một <div> sau đó. Tôi tin rằng vấn đề trong việc duy trì <a> là giữ nguyên kiểu dáng, vốn đã được xác định bởi các <a> thông thường. Với no href, nó sẽ không được phát hiện và tạo kiểu như các <a> khác.
MarsAndBack


3

Thủ #/thuật hoạt động, nhưng thêm một sự kiện lịch sử vào trình duyệt. Vì vậy, nhấp trở lại không hoạt động như người dùng có thể muốn / mong đợi nó.

$('body').click('a[href="#"]', function(e) {e.preventDefault() }); là cách tôi đã đi, vì nó hoạt động cho nội dung đã có và bất kỳ yếu tố nào được thêm vào DOM sau khi tải.

Cụ thể, tôi cần phải làm điều này trong menu thả xuống bootstrap bên trong một .btn-group(Tham khảo) , vì vậy tôi đã làm:

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

Bằng cách này, nó đã được nhắm mục tiêu và không ảnh hưởng đến bất cứ điều gì khác trên trang.


3

Tôi đã luôn sử dụng:

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

khi cố gắng ngăn chặn việc nhảy trang. Không chắc đây có phải là tốt nhất không, nhưng có vẻ như nó đã hoạt động tốt trong nhiều năm.


3

Có 4 cách tương tự để ngăn trang nhảy lên đầu mà không cần bất kỳ JavaScript nào:

Lựa chọn 1:

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

Lựa chọn 2:

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

Tùy chọn 3:

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

Tùy chọn 4 ( Không nên dùng ):

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

Nhưng sẽ tốt hơn event.preventDefault()nếu sử dụng nếu bạn đang xử lý sự kiện nhấp chuột trong jQuery.


3
Mặc dù mã này có thể trả lời câu hỏi, việc cung cấp ngữ cảnh bổ sung về cách thức và / hoặc lý do giải quyết vấn đề sẽ cải thiện giá trị lâu dài của câu trả lời.
A. Suliman

2

Bạn cũng có thể trả về false sau khi xử lý jquery của bạn.

Ví dụ.

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

1
Điều đó và phương thức trực tiếp đều không được dùng nữa và không nên sử dụng nữa.
Quentin

2

Tôi sử dụng một cái gì đó như thế này:

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

2

Để ngăn trang nhảy, bạn cần gọi e.stopPropagation();sau khi gọi e.preventDefault();:

stopPropagationngăn sự kiện đi lên cây DOM. Thêm thông tin tại đây: https://api.jquery.com/event.stoppropagation/


bạn có thể vui lòng cung cấp mã đầy đủ mà tôi có thể dán trong html của mình không? Tôi đang sử dụng Zurb Foundation 5.5.3.
Julie S.

2

Nếu bạn muốn di chuyển đến Phần neo trên cùng một trang mà không cần nhảy lên, hãy sử dụng:

Chỉ cần sử dụng "# /" thay vì "#", vd

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

1

Thêm một cái gì đó sau khi #đặt trọng tâm của trang vào thành phần có ID đó. Giải pháp đơn giản nhất là sử dụng #/ngay cả khi bạn đang sử dụng jQuery. Tuy nhiên nếu bạn đang xử lý sự kiện trong jQuery, thì đó event.preventDefault()là cách để đi.


0

các <a href="#!">Link</a><a href="#/">Link</a> không làm việc nếu người ta phải bấm vào cùng một đầu vào nhiều hơn một lần .. nó chỉ mất trong 1 sự kiện click cho mỗi trên nhiều đầu vào.

cách tốt nhất để đi là với <a href="#">Link</a>

sau đó,

event.preventDefault();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.