Liên kết liên kết HTML - href và nhấp vào cả hai?


93

Tôi muốn tác giả một thẻ liên kết thực thi một số JavaScript và sau đó tiếp tục đi đến bất cứ nơi nào hrefsử dụng nó. Việc gọi một hàm thực thi JavaScript của tôi và sau đó đặt window.locationhoặc top.locationđến hrefvị trí không hoạt động đối với tôi.

Vì vậy, hãy tưởng tượng tôi có một phần tử có id "Foo" trên trang. Tôi muốn tạo một anchor tương tự như:

<a href="#Foo" onclick="runMyFunction(); return false;">Do it!</a>

Khi điều này được nhấp vào, tôi muốn thực thi runMyFunction và sau đó chuyển trang đến #Foo(không gây ra tải lại - sử dụng top.locationsẽ khiến nó tải lại trang).

Gợi ý? Tôi rất vui khi sử dụng jQuery nếu nó có thể giúp ích ở đây ...


return true;là giải pháp, nhưng bạn cũng có thể gọi location.hash = '#Foo'. Nó sẽ không tải lại trang.
shuangwhywhy

Câu trả lời:


130

Chỉ cần return truethay thế?

Giá trị trả về từ onClickmã là giá trị xác định xem hành động được nhấp vốn có của liên kết có được xử lý hay không - trả về falsecó nghĩa là nó không được xử lý, nhưng nếu bạn trả lại truethì trình duyệt sẽ tiếp tục xử lý sau khi hàm của bạn trả về và chuyển sang trạng thái thích hợp. mỏ neo.


1
Điều gì sẽ xảy ra nếu onclick không trả lại bất cứ điều gì?
maciek

1
@maciek thì giá trị trả về được coi undefinedlà sai cho những mục đích này.
Amber

1
Trước đây, bất cứ khi nào tôi sử dụng hàm js để khởi chạy trang mới và chỉ đặt "#" cho thuộc tính href, tôi sẽ trả về "-1" để ngăn hành động mặc định, thường là trình duyệt nhảy anh ấy đứng đầu trang, hoặc đôi khi tôi không trả lại bất cứ thứ gì. Gần đây, tôi đã phải sửa lại tất cả các trang đó vì @Amber đã khuyên ... đặc biệt trả về false, nếu tôi không muốn trang nhảy.
Randy

1
@Amber có vẻ như nếu onclick không trả lại bất kỳ thứ gì, hành động được nhấp vốn có của liên kết sẽ được xử lý.
iplus26

Ngoài ra, bạn không nên sử dụng event.preventDefault () trên trình xử lý sự kiện nhấp chuột.
Ruben

36
<a href="#Foo" onclick="return runMyFunction();">Do it!</a>

function runMyFunction() {
  //code
  return true;
}

Bằng cách này, bạn sẽ thực thi hàm của bạn VÀ bạn sẽ theo liên kết VÀ bạn sẽ theo liên kết chính xác sau khi hàm của bạn được chạy thành công.


1
Dường như không hoạt động nếu hàm của bạn trả về true sau một cuộc gọi hàm bị trì hoãn?
DavidVdd

7

Nếu liên kết chỉ nên thay đổi vị trí nếu chạy hàm thành công, thì hãy thực hiện onclick="return runMyFunction();"và trong hàm, bạn sẽ trả về true hoặc false.

Nếu bạn chỉ muốn chạy hàm và sau đó để thẻ liên kết thực hiện công việc của nó, chỉ cần xóa return falsecâu lệnh.

Một lưu ý nhỏ là bạn có thể nên sử dụng trình xử lý sự kiện thay thế, vì JS nội tuyến không phải là cách hoạt động rất tối ưu.


0

Khi thực hiện Cấu trúc HTML sạch, bạn có thể sử dụng cấu trúc này.

//Jquery Code
$('a#link_1').click(function(e){
  e . preventDefault () ;
  var a = e . target ;
  window . open ( '_top' , a . getAttribute ('href') ) ;
});

//Normal Code
element = document . getElementById ( 'link_1' ) ;
element . onClick = function (e) {
  e . preventDefault () ;
  
  window . open ( '_top' , element . getAttribute ('href') ) ;
} ;
<a href="#Foo" id="link_1">Do it!</a>

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.