Làm cách nào để ngăn việc xử lý sự kiện mặc định trong phương pháp onclick?


88

Làm thế nào để ngăn chặn mặc định trong một phương pháp onclick? Tôi có một phương pháp mà tôi cũng đang chuyển một giá trị tùy chỉnh

<a href="#" onclick="callmymethod(24)">Call</a>
function callmymethod(myVal){
    //doing custom things with myVal
    //here I want to prevent default
}

Câu trả lời:


106

Hãy để lệnh gọi lại của bạn trở lại falsevà chuyển nó cho onclicktrình xử lý:

<a href="#" onclick="return callmymethod(24)">Call</a>

function callmymethod(myVal){
    //doing custom things with myVal
    //here I want to prevent default
    return false;
}

Tuy nhiên, để tạo mã có thể bảo trì , bạn nên kiêng sử dụng "Javascript nội dòng" (tức là: mã nằm ngay trong thẻ của phần tử) và sửa đổi hành vi của phần tử thông qua tệp nguồn Javascript được bao gồm (nó được gọi là Javascript không phô trương ).

Đánh dấu:

<a href="#" id="myAnchor">Call</a>

Mã (tệp riêng biệt):

// Code example using Prototype JS API
$('myAnchor').observe('click', function(event) {
    Event.stop(event); // suppress default click behavior, cancel the event
    /* your onclick code goes here */
});

1
@AamirAfridi Có, nó đang hoạt động. Bạn nên điều chỉnh fiddle của bạn và thay đổi onLoadedthành no wrap. Hoặc chỉ cần viết đánh dấu .html của riêng bạn.
Linus Kleen,

1
Hãy xem câu trả lời bên dưới! "Theo tôi thì câu trả lời là sai! Anh ấy yêu cầu event.preventDefault (); khi bạn chỉ trả về false; nó gọi event.preventDefault (); AND event.stopPropagation (); cả!"
Ravindranath Akila

1
Khó tính, câu hỏi của OP không bao giờ đề cập đến preventDefault, câu hỏi là làm thế nào để "ngăn chặn [cái] nhấp chuột mặc định" .
Linus Kleen

1
@LinusKleen, cũng xin nói thêm, làm thế nào để ngăn chặn nhấp chuột trong trường hợp này
vp_arth

1
@vp_arth Sử dụng "CSS nhấp qua" cho việc này. Nhìn vào câu hỏi này .
Linus Kleen

46

Theo tôi câu trả lời là sai! Anh ta yêu cầu event.preventDefault();khi bạn chỉ trả lại sai; nó cũng gọi event.preventDefault();AND event.stopPropagation();!

Bạn có thể giải quyết nó bằng cách này:

<a href="#" onclick="callmymethod(event, 24)">Call</a>
function callmymethod(e, myVal){
    //doing custom things with myVal

    //here I want to prevent default
    e = e || window.event;
    e.preventDefault();
}

6
Bạn đang dựa vào window.eventmà không phải lúc nào cũng có sẵn trên các trình duyệt.
Linus Kleen

Đã chỉnh sửa để thêm: event = event || window.event;
Nigel Fds

45

Hãy thử điều này (nhưng hãy sử dụng các nút cho những trường hợp như vậy nếu bạn không có hrefgiá trị hợp lệ để giảm cấp duyên dáng )

<a href="#" onclick="callmymethod(24); return false;">Call</a>

1
tốt đơn giản là tốt nhất. Tôi muốn điều này tương tự cho event.preventDefault ();
Sameer Kazi

Nó làm việc cho tôi, nhưng bạn có thể giải thích tại sao bạn phải làm return false;như vậy không? Chúng ta thậm chí trả lại sai cho cái gì?
Kolob Canyon

bạn chỉ có thể quay lại thay vì trả về false, việc quay lại sẽ tránh liên kết điều hướng đến href. Về mặt kỹ thuật, chúng ta nên sử dụng nút cho những trường hợp như vậy.
Aamir Afridi

12

Bạn có thể bắt sự kiện và sau đó chặn sự kiện đó bằng PreventDefault () - hoạt động với Javascript thuần túy

document.getElementById("xyz").addEventListener('click', function(event){
    event.preventDefault();
    console.log(this.getAttribute("href"));
    /* Do some other things*/
});

11

Chỉ cần đặt "javascript: void (0)", thay cho "#" trong thẻ href

<a href="javascript:void(0);" onclick="callmymethod(24)">Call</a>

9

Điều này đã làm việc cho tôi

<a href="javascript:;" onclick="callmymethod(24); return false;">Call</a>


0

Sẽ quá tẻ nhạt nếu thay đổi cách sử dụng chức năng trong tất cả các trang html return false.

Vì vậy, đây là một giải pháp đã được thử nghiệm chỉ vá chính chức năng:

function callmymethod(myVal) {
    // doing custom things with myVal

    // cancel default event action
    var event = window.event || callmymethod.caller.arguments[0];
    event.preventDefault ? event.preventDefault() : (event.returnValue = false);

    return false;
}    

Điều này chính xác ngăn IE6, IE11 và Chrome mới nhất truy cập href="#"sau khi trình xử lý sự kiện onclick hoàn tất.

Tín dụng:


0

Nếu bạn cần đặt nó trong thẻ. Không phải là giải pháp tốt nhất, nhưng nó sẽ hoạt động.

Đảm bảo rằng bạn đặt sự kiện onclick trước href. Chỉ làm việc cho tôi theo cách này.

<a onclick="return false;" href="//www.google.de">Google</a>

0

Một cách khác để làm điều đó là sử dụng eventđối tượng bên trong thuộc tính onclick(mà không cần thêm đối số bổ sung vào hàm để truyền sự kiện)

function callmymethod(myVal){
    console.log(myVal);
}
<a href="#link" onclick="event.preventDefault();callmymethod(24)">Call</a>


-3

Cung cấp một lớp hoặc id cho phần tử và sử dụng hàm jquery unbind ();

$(".slide_prevent").click(function(){
                $(".slide_prevent").unbind();
              });
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.