2011-12-23 32 views
81

Tôi có liên kết như thế này:preventDefault bên trong thuộc tính onclick của một thẻ

<a href="#" onclick="myfunc({a:1, b:'hi'})" />click</a> 
<a href="#" onclick="myfunc({a:3, b:'jo'})" />click</a> 

và tôi muốn làm một preventDefault() bên myfunc, bởi vì một # sẽ được thêm vào thanh địa chỉ khi nhấp vào liên kết (không làm return false; hoặc href='javascript:void(0);')

là điều này có thể? Tôi có thể nhận được sự kiện bên trong myfunc

+6

Có gì sai với trả về false? – Alex

+5

nó dừng tuyên truyền quá – Omu

+4

'return false' chỉ dừng tuyên truyền trong jQuery. – cruzanmo

Trả lời

112

Tôi tin rằng bạn có thể vượt qua trong event vào inline chức năng đó sẽ là đối tượng event cho sự kiện nêu ra trong các trình duyệt tương thích W3C (tức là phiên bản cũ của IE vẫn sẽ yêu cầu phát hiện bên trong của hàm xử lý sự kiện của bạn để xem window.event).

A quick example.

function sayHi(e) { 
 
    e.preventDefault(); 
 
    alert("hi"); 
 
}
<a href="http://google.co.uk" onclick="sayHi(event);">Click to say Hi</a>

  1. Run nó như là và nhận thấy rằng liên kết đó không chuyển hướng đến Google sau khi cảnh báo.
  2. Sau đó, thay đổi event được chuyển vào trình xử lý onclick cho một thứ khác như e, nhấp chạy, sau đó nhận thấy rằng chuyển hướng diễn ra sau cảnh báo (ngăn kết quả chuyển sang màu trắng, thể hiện chuyển hướng).
+5

ok, tôi thấy tất cả những gì tôi phải làm là đặt tham số thứ hai 'myfunc (sự kiện, {a: 123, b:" asdas "})' – Omu

+1

@ChuckNorris - vâng, đúng vậy. –

+1

@Omu Đối số được truyền vào, sự kiện, có thể ở bất kỳ nơi nào, không cần phải là người đầu tiên, miễn là nó nằm đúng vị trí của danh sách tham số được xác định cho hàm. Ví dụ, 'function myfunc (o, e) {...}', sau đó nó có thể được gọi là 'myfunc ({a: 1, b: 'hi'}, sự kiện)'. – cateyes

2

Bạn không chỉ có thể xóa thuộc tính href khỏi thẻ?

+0

có, đó là một tùy chọn, mặc dù theo mặc định liên kết sẽ không gạch dưới và nếu javascript bị tắt thì sẽ không có href để truy cập vào – Omu

9

Hãy thử điều này:

<script> 
    $("a").click(function(event) { 
     event.preventDefault(); 
    }); 
</script> 
+0

yêu cầu thẻ

4

Thêm một lớp duy nhất để các liên kết và một javascript có thể ngăn chặn mặc định trên liên kết với các lớp này:

<a href="#" class="prevent-default" 
    onclick="$('.comment .hidden').toggle();">Show comments</a> 

<script> 
    $(document).ready(function(){ 

    $("a.prevent-default").click(function(event) { 
     event.preventDefault(); 
      }); 
    }); 
</script> 
3

Tôi nghĩ rằng khi chúng ta sử dụng onClick chúng tôi muốn làm một cái gì đó khác so với mặc định. Vì vậy, đối với tất cả các liên kết của bạn với onClick:

$("a[onClick]").on("click", function(e) { 
    return e.preventDefault(); 
}); 
74

Giải pháp đơn giản nhất chỉ đơn giản là:

<a href="#" onclick="event.preventDefault(); myfunc({a:1, b:'hi'});" />click</a> 

Nó thực sự là một cách tốt để làm bộ nhớ cache busting cho tài liệu với một dự phòng không có JS kích hoạt trình duyệt (không bộ nhớ cache busting nếu không có JS)

<a onclick=" 
if(event.preventDefault) event.preventDefault(); else event.returnValue = false; 
window.location = 'http://www.domain.com/docs/thingy.pdf?cachebuster=' + 
Math.round(new Date().getTime()/1000);" 
href="http://www.domain.com/docs/thingy.pdf"> 

Nếu JavaScript được kích hoạt, nó sẽ mở tệp PDF bằng chuỗi truy vấn busting cache, nếu không nó sẽ mở tệp PDF.

+0

Chỉ có thể sử dụng công nghệ phía máy chủ để viết lại liên kết đó nếu bộ nhớ cache là tất cả những gì bạn đang theo dõi. – mpen

+0

Nó sẽ tốt hơn, nhưng tôi không có quyền truy cập vào mã phía máy chủ. Làm việc với những gì tôi có. – JuLo

-1

Đơn giản!

onclick="blabla(); return false" 
Các vấn đề liên quan