Truy cập sự kiện để gọi hàm ngăn chặn mặc định từ hàm tùy chỉnh bắt nguồn từ thuộc tính onclick của thẻ


119

Tôi có các liên kết như thế này:

<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 thực hiện preventDefault()bên trong myfunc(), bởi vì một #sẽ được thêm vào thanh địa chỉ khi nhấp vào liên kết (mà không cần thực hiện return false;hoặc href='javascript:void(0);')

Điều này có khả thi không? Tôi có thể nhận được sự kiện bên trong khôngmyfunc()


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

5
nó cũng ngừng lan truyền
Omu

4
return falsechỉ dừng truyền trong jQuery.
cruzanmo

Câu trả lời:


157

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

Một ví dụ nhanh .

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

  1. Chạy nó như cũ và nhận thấy rằng liên kết không chuyển hướng đến Google sau cảnh báo.
  2. Sau đó, thay đổi giá trị eventđược truyền vào onclicktrình xử lý thành một cái gì đó khác như e, nhấp vào 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, chứng tỏ chuyển hướng).

5
được rồi, tôi thấy tất cả những gì tôi phải làm là đặt thông số của mình ở vị trí thứ haimyfunc(event, {a:123, b:"asdas"})
Omu 23/12/11

1
@Omu Đối số được truyền vào, sự kiện, có thể ở bất kỳ vị trí nào, không nhất thiết phải là đối số đầu tiên, miễn là nó ở đúng vị trí của danh sách tham số đã 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'}, event).
cateyes

2
Tôi nghĩ rằng bạn không cần phải vượt qua và nắm bắt đối tượng sự kiện một cách rõ ràng. Bạn chỉ cần tham khảo nó trong chức năng. Ai đó có thể xin vui lòng xác nhận? Ý tôi là, mã này không có sự kiện cũng sẽ hoạt động:function sayHi() { event.preventDefault(); alert("hi"); }
K Vij

111

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>

Đó thực sự là một cách tốt để thực hiện chặn bộ nhớ cache cho các tài liệu có dự phòng cho các trình duyệt không hỗ trợ JS (không chặn bộ nhớ cache 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 bật, nó sẽ mở PDF bằng chuỗi truy vấn chặn bộ nhớ cache, nếu không, nó chỉ mở PDF.


Chỉ có thể sử dụng công nghệ phía máy chủ để ghi lại liên kết đó nếu bạn đang muốn chặn bộ nhớ cache.
mpen

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

11

Thử cái này:

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

điều này yêu cầu thẻ <script> cho mỗi sự kiện nhấp chuột, làm cho mã phức tạp hơn.
somid

Nó cũng yêu cầu jQuery, trong khi có thể có mặt không nên là điều kiện tiên quyết.
Đổ không thường xuyên vào

Cũng không đồng ý ở đây, Một phân tích cú pháp đơn giản cho một hàm nội tuyến hiệu quả hơn và ít mã hơn.
Shannon Hochkins

1
@ somid3, trong khi jQuery là không cần thiết , nếu bạn đang lo lắng về hiệu suất, bạn có thể sử dụng một trình xử lý sự kiện được giao một đơn do đó bạn chỉ gắn một người biết lắng nghe duy nhất cho tất cả các neo trên trang như thế này: $("body").on("click","a",function(e) { e.preventDefault() });. Trong cả hai trường hợp, không giải pháp nào sẽ tác động có ý nghĩa đến hiệu suất.
KyleMit

7
<script type="text/javascript">
$('a').click(function(){
   return false;
});
<script>

2
Điều này áp dụng cho mọi liên kết và sẽ phá vỡ tất cả các liên kết, cũng yêu cầu javascript phải được chèn vào trang cũng như jQuery.
Shannon Hochkins

Ngoài ra, khi sử dụng jQuery, return falsekhông được khuyến khích vì nó cũng sẽ ngăn tất cả các trình xử lý sự kiện khác trên phần tử đó chạy và ngăn sự kiện sôi lên đến phần tử cao hơn.
Stijn de Witt

6

Thêm một lớp duy nhất vào các liên kết và một javascript ngăn chặn mặc định trên các liên kết 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>

Cách tiếp cận thú vị cho một giải pháp toàn cầu.
AFract

5

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


1
vâng, đó là một lựa chọn quá, mặc dù theo mặc định liên kết sẽ không có gạch dưới, và nếu javascript bị tắt có được sẽ không href đi đến
Omu

4

Tôi nghĩ rằng khi chúng tôi sử dụng onClick, chúng tôi muốn làm điều gì đó khác 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();
});

2

Đơn giản!

onclick="blabla(); return false"

2

Bạn có thể truy cập sự kiện từ onclick như thế này:

<button onclick="yourFunc(event);">go</button>

và tại hàm javascript của bạn, lời khuyên của tôi là thêm câu lệnh dòng đầu tiên đó là:

function yourFunc(e) {
    e = e ? e : event;
}

sau đó sử dụng ở mọi nơi e làm biến sự kiện



0

Không có bất kỳ thư viện JS hoặc jQuery. Để mở một cửa sổ bật lên đẹp nếu có thể. Không thể mở liên kết bình thường một cách an toàn.

<a href="https://acme.com/" onclick="onclick="openNewWindow(event, this.href);">...</a>

Và chức năng trợ giúp:

function openNewWindow(event, location) {
  if (event.preventDefault && event.stopImmediatePropagation) { 
    event.preventDefault(); 
    event.stopImmediatePropagation(); 
  } else {
    event.returnValue = false; 
  }
  window.open(location, 'targetWindow', 'toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=yes,width=800,height=450');
}
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.