ฟังก์ชัน event.preventDefault () ไม่ทำงานใน IE


202

ต่อไปนี้เป็นรหัส JavaScript (mootools) ของฉัน:

$('orderNowForm').addEvent('submit', function (event) {
    event.preventDefault();
    allFilled = false;
    $$(".required").each(function (inp) {
        if (inp.getValue() != '') {
            allFilled = true;
        }
    });

    if (!allFilled) {
        $$(".errormsg").setStyle('display', '');
        return;
    } else {
        $$('.defaultText').each(function (input) {
            if (input.getValue() == input.getAttribute('title')) {
                input.setAttribute('value', '');
            }
        });
    }

    this.send({
        onSuccess: function () {
            $('page_1_table').setStyle('display', 'none');
            $('page_2_table').setStyle('display', 'none');
            $('page_3_table').setStyle('display', '');
        }
    });
});

ในเบราว์เซอร์ทั้งหมดยกเว้น IE สิ่งนี้ใช้ได้ดี แต่ใน IE สิ่งนี้ทำให้เกิดข้อผิดพลาด ฉันมี IE8 ดังนั้นในขณะที่ใช้ดีบักเกอร์ JavaScript ฉันพบว่าeventวัตถุไม่มีpreventDefaultวิธีการที่ทำให้เกิดข้อผิดพลาดและดังนั้นจึงมีการส่งแบบฟอร์ม วิธีการรองรับในกรณีของ Firefox (ซึ่งฉันพบโดยใช้ Firebug)

ความช่วยเหลือใด ๆ


มันทำ; ตามเอกสาร ( mootools.net/docs/core/Native/Event#Event:preventDefault ) สิ่งที่เขาควรใช้งานได้: "วิธีการของเหตุการณ์: PreventDefault - วิธีเบราว์เซอร์ข้ามเพื่อป้องกันการกระทำเริ่มต้นของเหตุการณ์"
เปาโล Bergantino

ฉันไม่ดีฉันลบความคิดเห็นซึ่ง "mootools ไม่มีวิธีหยุดกิจกรรม" ดังนั้นจึงมีปัญหากับ MooTools ใน IE8 แล้ว ...
Alsciende

2
ไม่สามารถทำซ้ำปัญหานี้ได้ ซอนี้ "ใช้งานได้สำหรับฉันบน 8" คุณสามารถตั้งค่าซอลดลงเพื่อแสดงข้อผิดพลาดหรือไม่? jsfiddle.net
eerne

คำตอบ:


472

ใน IE คุณสามารถใช้

event.returnValue = false;

เพื่อให้ได้ผลลัพธ์เดียวกัน

และเพื่อไม่ให้เกิดข้อผิดพลาดคุณสามารถทดสอบการมีอยู่ของ PreventDefault:

if(event.preventDefault) event.preventDefault();

คุณสามารถรวมสองรายการเข้าด้วยกัน:

event.preventDefault ? event.preventDefault() : (event.returnValue = false);

48
รหัสต่อไปนี้ใช้งานได้สำหรับฉัน: if (event.preventDefault) {event.preventDefault (); } else {event.returnValue = false; }
sv_in

229
event.preventDefault ? event.preventDefault() : event.returnValue = false;
mortiy

31
เป็นที่น่าสังเกตว่า "เหตุการณ์" จะต้องเป็นวัตถุเหตุการณ์ระดับโลกใน IE8 คุณไม่สามารถใช้เหตุการณ์ที่ส่งผ่านไปยังตัวจัดการเหตุการณ์เช่น e.preventDefault จะต้องเป็น event.preventDefault เพื่อให้สิ่งนี้ทำงานได้ใน IE8
jmort253

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

8
เพียงเพิ่มความชัดเจนให้กับความคิดเห็นของ @ jmort253:$('.something').click(function(e){ e.preventDefault ? e.preventDefault() : event.returnValue = false; });
ลุค

23

หากคุณผูกเหตุการณ์ผ่านฟังก์ชั่น addEvent ของ mootools ตัวจัดการเหตุการณ์ของคุณจะได้รับเหตุการณ์ที่ผ่านการแก้ไข (เพิ่ม) เป็นพารามิเตอร์ มันจะมีเมธอด PreventDefault () เสมอ

ลองเล่นซอนี้เพื่อดูความแตกต่างของการผูกเหตุการณ์ http://jsfiddle.net/pFqrY/8/

// preventDefault always works
$("mootoolsbutton").addEvent('click', function(event) {
 alert(typeof(event.preventDefault));
});

// preventDefault missing in IE
<button
  id="htmlbutton"
  onclick="alert(typeof(event.preventDefault));">
  button</button>

สำหรับผู้ใช้jQueryทุกคนคุณสามารถแก้ไขเหตุการณ์เมื่อจำเป็น สมมติว่าคุณใช้ HTML onclick = ".. " และรับเหตุการณ์เฉพาะของ IE ที่ไม่มี preventDefault () เพียงแค่ใช้รหัสนี้เพื่อรับมัน

e = $.event.fix(e);

หลังจากนั้น e.preventDefault (); ทำงานได้ดี


2
น่าเสียดายที่เคล็ดลับนี้ใช้ไม่ได้สำหรับฉัน ฉันใช้ IE 10 และก่อนโทร e.preventDefault (); ฉันกำลังโทรหา $ .event.fix (e); โดยไม่ประสบความสำเร็จ :(
Beatles1692

อาจถูกลบออกจาก jquery 2 หรือไม่ แต่ IE10 ไม่ต้องการการแก้ไข
oldwizard

คุณกำหนดเหตุการณ์คงที่ให้กับตัวแปร e อีกครั้งหรือไม่
oldwizard

11

ฉันรู้ว่ามันค่อนข้างโพสต์เก่า แต่ฉันใช้เวลาพยายามทำให้งานนี้ใน IE8

ดูเหมือนว่ามีความแตกต่างบางประการในเวอร์ชัน IE8 เนื่องจากโซลูชันที่โพสต์ที่นี่และในเธรดอื่นไม่ได้ผลสำหรับฉัน

สมมติว่าเรามีรหัสนี้:

$('a').on('click', function(event) {
    event.preventDefault ? event.preventDefault() : event.returnValue = false;
});

ในpreventDefault()วิธีIE8 ของฉันมีอยู่เพราะ jQuery แต่ไม่ทำงาน (อาจเป็นเพราะจุดด้านล่าง) ดังนั้นสิ่งนี้จะล้มเหลว

แม้ว่าฉันจะตั้งค่าreturnValueคุณสมบัติโดยตรงเป็นเท็จ:

$('a').on('click', function(event) {
    event.returnValue = false;
    event.preventDefault();
});

สิ่งนี้ยังใช้งานไม่ได้เพราะฉันเพิ่งตั้งค่าคุณสมบัติบางอย่างของวัตถุเหตุการณ์ที่กำหนดเองของ jQuery

ทางออกเดียวที่เหมาะกับฉันคือการตั้งค่าคุณสมบัติreturnValueของตัวแปรทั่วโลก eventเช่นนี้:

$('a').on('click', function(event) {
    if (window.event) {
        window.event.returnValue = false;
    }
    event.preventDefault();
});

เพียงเพื่อให้ง่ายขึ้นสำหรับคนที่จะพยายามโน้มน้าวให้ IE8 ทำงาน ฉันหวังว่า IE8 จะตายอย่างน่ากลัวในความตายอันเจ็บปวดในไม่ช้า

UPDATE:

เมื่อsv_inชี้ให้เห็นคุณสามารถใช้event.originalEventเพื่อรับวัตถุเหตุการณ์ดั้งเดิมและตั้งค่าreturnValueคุณสมบัติในวัตถุดั้งเดิม แต่ฉันยังไม่ได้ทดสอบใน IE8 ของฉันเลย


1
คุณยังสามารถรับวัตถุเหตุการณ์เบราว์เซอร์ดั้งเดิมevent.originalEventได้ ข้อมูลเพิ่มเติม: stackoverflow.com/a/16675056/22550
sv_in

6

Mootools นิยามใหม่ preventDefault ในวัตถุเหตุการณ์ ดังนั้นรหัสของคุณควรทำงานได้ดีในทุกเบราว์เซอร์ ถ้าไม่เช่นนั้นแสดงว่ามีปัญหากับการรองรับ ie8 ใน mootools

คุณทดสอบโค้ดของคุณบน ie6 และ / หรือ ie7 หรือไม่?

หมอพูด

ทุกเหตุการณ์ที่เพิ่มเข้ามาด้วย addEvent จะได้รับวิธีการ mootools โดยอัตโนมัติโดยไม่จำเป็นต้องทำการอินสแตนซ์ด้วยตนเอง

แต่ในกรณีที่ไม่เป็นเช่นนั้นคุณอาจต้องการลอง

new Event(event).preventDefault();

1
มีปัญหาเมื่อห่อเช่นนี้ยังอยู่ใน IE โอ้พระเจ้า! ทำไมต้อง IE
sv_in

เธอไม่ต้องการหยุดกิจกรรม แต่เพียงแค่ป้องกันการกระทำเริ่มต้น
Alsciende

5
if (e.preventDefault) {
    e.preventDefault();
} else {
    e.returnValue = false;
}

ทดสอบบน IE 9 และ Chrome


2
ไม่ทำงานใน IE 11 (e.preventDefault เป็นฟังก์ชั่นแม้ว่ามันจะดูเหมือนจะไม่ทำอะไรเลย)
GreySage

4

หากต้องการปิดใช้งานแป้นคีย์บอร์ดหลังจาก IE9 ให้ใช้: e.preventDefault();

หากต้องการปิดใช้งานแป้นคีย์บอร์ดปกติภายใต้ IE7 / 8 ให้ใช้: e.returnValue = false;หรือreturn false;

หากคุณพยายามปิดการใช้งานแป้นพิมพ์ลัด (ด้วย Ctrl เช่นCtrl+F) คุณต้องเพิ่มบรรทัดเหล่านั้น:

try {
    e.keyCode = 0;
}catch (e) {}

นี่คือตัวอย่างเต็มรูปแบบสำหรับ IE7 / 8 เท่านั้น:

document.attachEvent("onkeydown", function () {
    var e = window.event;

    //Ctrl+F or F3
    if (e.keyCode === 114 || (e.ctrlKey && e.keyCode === 70)) {
        //Prevent for Ctrl+...
        try {
            e.keyCode = 0;
        }catch (e) {}

        //prevent default (could also use e.returnValue = false;)
        return false;
    }
});

การอ้างอิง: วิธีปิดใช้งานแป้นพิมพ์ลัดใน IE7 / IE8


คุณเป็นผู้ตอบเพียงคนเดียวที่ใช้ตะปูบนหัว เหตุผลเดียวที่ทุกคนที่นี่กำลังพูดถึง IE ในช่วงต้นคือพวกเขาต้องการฟังก์ชั่นข้ามแพลตฟอร์ม "e.keyCode = 0;" จะฆ่าการกระทำเริ่มต้นใน IE ต้น ๆ
www-0av-Com

3

นี่คือฟังก์ชั่นที่ฉันได้ทำการทดสอบด้วย jquery 1.3.2 และ 09-18-2009 build ทุกคืน แจ้งให้เราทราบผลลัพธ์ของคุณด้วย ทุกอย่างดำเนินไปด้วยดีในส่วนนี้ใน Safari, FF, Opera บน OSX มันใช้สำหรับการแก้ไขข้อผิดพลาด IE8 ที่เป็นปัญหาเท่านั้นและอาจมีผลลัพธ์ที่ไม่ได้ตั้งใจ:

function ie8SafePreventEvent(e) {
    if (e.preventDefault) {
        e.preventDefault()
    } else {
        e.stop()
    };

    e.returnValue = false;
    e.stopPropagation();
}

การใช้งาน:

$('a').click(function (e) {
    // Execute code here
    ie8SafePreventEvent(e);
    return false;
})

1
ฉันไม่เคยเห็นstopวิธีการนี้มาก่อนและไม่สามารถหาได้ใน msdn มันทำอะไร?
Oriol

1
.stop()โยนข้อยกเว้นเนื่องจากไม่มีอยู่ ข้อยกเว้นใด ๆ จะมีผลที่ต้องการ
Jay Bazuzi

และทำไมคุณต้องการที่จะโยนข้อยกเว้น? ฉันหมายความว่าถ้าคุณต้องการที่จะโยนข้อยกเว้นคุณก็สามารถเรียกe.preventDefault()ได้ว่ามันจะทำให้เกิดข้อยกเว้นต่อไป ...
Matthias Burger

2

preventDefaultเป็นมาตรฐานที่แพร่หลาย การใช้ adhoc ทุกครั้งที่คุณต้องการให้สอดคล้องกับ IE เวอร์ชันเก่าจะยุ่งยากกว่าการใช้ polyfill:

if (typeof Event.prototype.preventDefault === 'undefined') {
    Event.prototype.preventDefault = function (e, callback) {
        this.returnValue = false;
    };
}

สิ่งนี้จะแก้ไขต้นแบบของเหตุการณ์และเพิ่มฟังก์ชั่นนี้ซึ่งเป็นคุณสมบัติที่ยอดเยี่ยมของจาวาสคริปต์ / DOM โดยทั่วไป ตอนนี้คุณสามารถใช้ได้e.preventDefaultโดยไม่มีปัญหา


0

return false ในฟังของคุณควรทำงานในเบราว์เซอร์ทั้งหมด

$('orderNowForm').addEvent('submit', function () {
    // your code
    return false;
}

0

FWIW ในกรณีที่มีคนมาทบทวนคำถามนี้อีกครั้งคุณอาจตรวจสอบสิ่งที่คุณส่งมอบให้กับฟังก์ชั่นการจัดการ onKeyPress ของคุณ

ฉันพบข้อผิดพลาดนี้เมื่อฉันส่งผ่านผิดพลาดใน KeeyPress (นี่) แทน onKeyPress (เหตุการณ์)

ตรวจสอบอย่างอื่น


0

ฉันได้รับความช่วยเหลือจากวิธีการตรวจสอบฟังก์ชั่น วิธีนี้ใช้ได้ใน IE8

if(typeof e.preventDefault == 'function'){
  e.preventDefault();
} else {
  e.returnValue = false;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.