fungsi event.preventDefault () tidak berfungsi di IE


202

Berikut ini adalah kode JavaScript (mootool) saya:

$('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', '');
        }
    });
});

Di semua browser kecuali IE, ini berfungsi dengan baik. Tetapi di IE, ini menyebabkan kesalahan. Saya memiliki IE8 jadi ketika menggunakan JavaScript debugger-nya, saya menemukan bahwaevent objek tersebut tidak memiliki preventDefaultmetode yang menyebabkan kesalahan dan sehingga formulirnya semakin banyak diajukan. Metode ini didukung dalam kasus Firefox (yang saya temukan menggunakan Firebug).

Ada bantuan?


Itu benar; sesuai dengan dokumen ( mootools.net/docs/core/Native/Event#Event:preventDefault ) apa yang harusnya berfungsi: "Metode Peristiwa: preventDefault - Metode peramban silang untuk mencegah tindakan default acara."
Paolo Bergantino

Buruk saya, saya menghapus komentar saya, yang "tidakkah mootool memiliki metode untuk menghentikan acara?". Jadi ada masalah dengan mootool pada ie8 ...
Alsciende

2
Tidak dapat mereproduksi masalah ini. Biola ini "berfungsi untuk saya yaitu 8" Bisakah Anda mengatur biola yang dikurangi untuk menunjukkan kesalahan? jsfiddle.net
eerne

Jawaban:


472

di IE, Anda bisa menggunakan

event.returnValue = false;

untuk mencapai hasil yang sama.

Dan agar tidak mendapatkan kesalahan, Anda dapat menguji keberadaan preventDefault:

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

Anda dapat menggabungkan keduanya dengan:

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

48
Kode berikut ini berfungsi untuk saya: if (event.preventDefault) {event.preventDefault (); } else {event.returnValue = false; }
sv_in

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

31
Perlu dicatat bahwa "acara" harus menjadi objek acara global di IE8. Anda tidak dapat menggunakan acara yang diteruskan ke pengendali acara, seperti e.preventDefault, itu harus event.preventDefault agar ini berfungsi di IE8.
jmort253

event.preventDefault();berhenti bekerja untuk saya di FireFox karena suatu alasan, tiba-tiba. Kode moral yang digunakan dan itu bekerja dengan baik. Terima kasih ~
James

8
Sekadar menambahkan kejelasan pada komentar @ jmort253:$('.something').click(function(e){ e.preventDefault ? e.preventDefault() : event.returnValue = false; });
Luke

23

Jika Anda mengikat acara melalui fungsi addEvent mootools 'pengendali acara Anda akan mendapatkan peristiwa yang diperbaiki (ditambah) yang diteruskan sebagai parameter. Itu akan selalu berisi metode preventDefault ().

Cobalah biola ini untuk melihat perbedaan pengikatan acara. 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>

Untuk semua pengguna jQuery di luar sana, Anda dapat memperbaiki acara saat dibutuhkan. Katakanlah Anda menggunakan HTML onclick = ".." dan dapatkan acara khusus IE yang tidak memiliki preventDefault (), cukup gunakan kode ini untuk mendapatkannya.

e = $.event.fix(e);

Setelah itu e.preventDefault (); bekerja dengan baik.


2
Sayangnya trik ini tidak berhasil untuk saya. Saya menggunakan IE 10 dan sebelum memanggil e.preventDefault (); Saya memanggil $ .event.fix (e); tanpa keberhasilan :(
Beatles1692

Mungkin telah dihapus dari jquery 2? Tetapi IE10 tidak perlu diperbaiki.
oldwizard

Apakah Anda menetapkan acara tetap ke variabel e lagi?
oldwizard

11

Saya tahu ini posting yang cukup lama tetapi saya hanya menghabiskan waktu mencoba membuat ini berfungsi di IE8.

Tampaknya ada beberapa perbedaan dalam versi IE8 karena solusi yang diposting di sini dan di utas lainnya tidak berfungsi untuk saya.

Katakanlah kita memiliki kode ini:

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

Dalam preventDefault()metode IE8 saya ada karena jQuery, tetapi tidak berfungsi (mungkin karena poin di bawah), jadi ini akan gagal.

Bahkan jika saya menyetel returnValueproperti langsung ke false:

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

Ini juga tidak akan berfungsi, karena saya baru saja menetapkan beberapa properti objek acara kustom jQuery.

-Satunya solusi yang bekerja untuk saya adalah untuk properti set returnValuedari variabel global event seperti ini:

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

Hanya untuk membuatnya lebih mudah bagi seseorang yang akan mencoba meyakinkan IE8 untuk bekerja. Saya berharap bahwa IE8 akan mati mengerikan dalam kematian yang menyakitkan segera.

MEMPERBARUI:

Seperti yang ditunjukkan sv_in , Anda dapat menggunakan event.originalEventuntuk mendapatkan objek acara asli dan menyetel returnValueproperti di objek asli. Tapi saya belum mengujinya di IE8 saya.


1
Anda juga bisa mendapatkan objek acara browser asli dari event.originalEvent. Info Lebih Lanjut: stackoverflow.com/a/16675056/22550
sv_in

6

Mootools mendefinisikan kembali preventDefault di objek acara. Jadi kode Anda harus berfungsi dengan baik di setiap browser. Jika tidak, maka ada masalah dengan dukungan ie8 di mootools.

Apakah Anda menguji kode Anda pada ie6 dan / atau ie7?

Dokter mengatakan

Setiap peristiwa yang ditambahkan dengan addEvent mendapatkan metode mootools secara otomatis, tanpa harus secara manual mem-instansinya.

tetapi jika tidak, Anda mungkin ingin mencoba

new Event(event).preventDefault();

1
Ada beberapa masalah saat membungkus seperti ini juga di IE. Ya Tuhan! Mengapa IE?
sv_in

Dia tidak ingin menghentikan acara tersebut, hanya mencegah tindakan standarnya.
Alsciende

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

Diuji pada IE 9 dan Chrome.


2
Tidak berfungsi di IE 11 (e.preventDefault adalah fungsi, meskipun sepertinya tidak melakukan apa-apa)
GreySage

4

Untuk menonaktifkan tombol keyboard setelah IE9, gunakan: e.preventDefault();

Untuk menonaktifkan tombol keyboard biasa di bawah IE7 / 8, gunakan: e.returnValue = false;ataureturn false;

Jika Anda mencoba menonaktifkan pintasan keyboard (dengan Ctrl, seperti Ctrl+F), Anda perlu menambahkan baris-baris itu:

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

Berikut ini adalah contoh lengkap untuk IE7 / 8 saja:

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

Referensi: Cara menonaktifkan pintasan keyboard di IE7 / IE8


Anda adalah satu-satunya penjawab untuk memukul kuku di kepala. Satu-satunya alasan siapa pun di sini berbicara tentang IE awal adalah karena mereka membutuhkan fungsionalitas lintas platform. "e.keyCode = 0;" akan membunuh tindakan default apa pun di IE awal.
www-0av-Com

3

Inilah fungsi yang saya uji dengan jquery 1.3.2 dan 09-18-2009 pada malam hari. Biarkan saya tahu hasil Anda dengannya. Semuanya dieksekusi dengan baik pada akhir ini di Safari, FF, Opera di OSX. Ini khusus untuk memperbaiki bug IE8 yang bermasalah, dan mungkin memiliki hasil yang tidak diinginkan:

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

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

Pemakaian:

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

1
Saya belum pernah melihat stopmetode ini sebelumnya, dan saya tidak dapat menemukannya di msdn. Apa fungsinya?
Oriol

1
.stop()melempar pengecualian, karena itu tidak ada. Pengecualian apa pun akan memiliki efek yang diinginkan.
Jay Bazuzi

dan mengapa Anda ingin melempar pengecualian? Maksud saya, jika Anda ingin melempar pengecualian, Anda bisa memanggil saja e.preventDefault()karena itu akan melempar pengecualian ...
Matthias Burger

2

preventDefaultadalah standar luas; menggunakan adhoc setiap kali Anda ingin mematuhi versi IE lama itu rumit, lebih baik menggunakan polyfill:

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

Ini akan memodifikasi prototipe Acara dan menambahkan fungsi ini, fitur javascript / DOM yang hebat secara umum. Sekarang Anda dapat menggunakannya e.preventDefaulttanpa masalah.


0

return false di pendengar Anda harus bekerja di semua browser.

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

0

FWIW, jika ada yang melihat kembali pertanyaan ini nanti, Anda mungkin juga memeriksa apa yang Anda serahkan ke fungsi handler onKeyPress Anda.

Saya mengalami kesalahan ini ketika saya keliru menyampaikan onKeyPress (ini) bukannya onKeyPress (acara).

Hanya sesuatu yang lain untuk diperiksa.


0

Saya dibantu oleh metode dengan pemeriksaan fungsi. Metode ini berfungsi di IE8

if(typeof e.preventDefault == 'function'){
  e.preventDefault();
} else {
  e.returnValue = false;
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.