จะป้องกันการจัดการเหตุการณ์เริ่มต้นในวิธี onclick ได้อย่างไร?


91

จะป้องกันค่าเริ่มต้นในวิธี onclick ได้อย่างไร? ฉันมีวิธีการที่ฉันกำลังส่งค่าที่กำหนดเองด้วย

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

คำตอบ:


107

ให้โทรกลับของคุณกลับมาfalseและส่งต่อไปยังonclickตัวจัดการ:

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

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

อย่างไรก็ตามในการสร้างโค้ดที่บำรุงรักษาได้คุณควรละเว้นจากการใช้"inline Javascript" (กล่าวคือโค้ดที่อยู่ภายในแท็กขององค์ประกอบโดยตรง) และแก้ไขลักษณะการทำงานขององค์ประกอบผ่านซอร์สไฟล์ Javascript ที่รวมอยู่ (เรียกว่าJavascript ที่ไม่สร้างความรำคาญ )

มาร์กอัป:

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

รหัส (ไฟล์แยก):

// 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 ใช่มันใช้งานได้ คุณควรปรับไวโอลินและการเปลี่ยนแปลงของคุณจะonLoaded no wrapหรือเขียนมาร์กอัป. html ของคุณเองแทน
Linus Kleen

1
โปรดดูคำตอบด้านล่าง! "ในความคิดของฉันคำตอบนั้นผิด! เขาถามหา event.preventDefault (); เมื่อคุณเพียงแค่ส่งคืนเท็จมันเรียก event.preventDefault (); AND event.stopPropagation (); เช่นกัน!"
Ravindranath Akila

1
การจะมีความจุกจิกคำถามของ OP ไม่เคยกล่าวถึงpreventDefaultคำถามคือวิธีการ"ป้องกัน [ที่] เริ่มต้นคลิก"
Linus Kleen

1
@LinusKleen โปรดพูดด้วยวิธีป้องกันการคลิกในกรณี
vp_arth

1
@vp_arth ใช้ "CSS click through" สำหรับสิ่งนี้ ดูคำถามนี้
Linus Kleen

48

ในความคิดของฉันคำตอบนั้นผิด! เขาถามว่าevent.preventDefault();คุณกลับเท็จเมื่อไหร่ มันเรียกevent.preventDefault();และevent.stopPropagation();เช่นกัน!

คุณสามารถแก้ได้โดยสิ่งนี้:

<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
คุณอาศัยwindow.eventสิ่งที่ไม่สามารถใช้ได้ในเบราว์เซอร์
Linus Kleen

แก้ไขเพื่อเพิ่ม: event = event || window.event;
Nigel Fds

45

ลองใช้สิ่งนี้ (แต่โปรดใช้ปุ่มสำหรับกรณีดังกล่าวหากคุณไม่มีhrefค่าที่ถูกต้องสำหรับการย่อยสลายอย่างสง่างาม )

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

1
ดีที่สุด ฉันต้องการสิ่งนี้เหมือนกันสำหรับ event.preventDefault ();
Sameer Kazi

มันใช้ได้ผลสำหรับฉัน แต่คุณช่วยอธิบายได้return false;ไหมว่าทำไมคุณต้องทำ เรากลับเท็จไปเพื่ออะไร?
Kolob Canyon

คุณสามารถส่งคืนแทนการส่งคืนเท็จการส่งคืนจะหลีกเลี่ยงการเชื่อมโยงไปยัง href ในทางเทคนิคเราควรใช้ปุ่มสำหรับกรณีดังกล่าว
Aamir Afridi

12

คุณสามารถจับเหตุการณ์แล้วบล็อกได้ด้วย PreventDefault () - ทำงานร่วมกับ Javascript แท้

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




1

อีกวิธีในการทำเช่นนั้นคือการใช้eventวัตถุภายในแอตทริบิวต์onclick(โดยไม่จำเป็นต้องเพิ่มอาร์กิวเมนต์เพิ่มเติมให้กับฟังก์ชันเพื่อส่งผ่านเหตุการณ์)

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


0

มันจะน่าเบื่อเกินไปที่จะใช้งานฟังก์ชั่นที่แตกต่างกันในหน้า html return falseทั้งหมดเพื่อ

ดังนั้นนี่คือโซลูชันที่ผ่านการทดสอบแล้วซึ่งจะแก้ไขเฉพาะฟังก์ชันเท่านั้น:

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;
}    

สิ่งนี้จะป้องกันไม่ให้ IE6, IE11 และ Chrome ล่าสุดเข้าเยี่ยมชมได้อย่างถูกต้อง href="#"หลังจากตัวจัดการเหตุการณ์ onclick เสร็จสิ้น

เครดิต:


0

หากต้องใส่ในแท็ก ไม่ใช่วิธีแก้ปัญหาที่ดีที่สุด แต่จะได้ผล

อย่าลืมใส่เหตุการณ์ onclick ไว้หน้า href ใช้ได้เฉพาะกับวิธีนี้ของฉัน

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

-3

ให้คลาสหรือ id ให้กับองค์ประกอบและใช้ฟังก์ชัน jquery unbind ();

$(".slide_prevent").click(function(){
                $(".slide_prevent").unbind();
              });
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.