event.preventDefault () işlevi IE'de çalışmıyor


203

JavaScript (mootools) kodum şu şekildedir:

$('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 dışındaki tüm tarayıcılarda bu işe yarar. Ancak IE'de bu bir hataya neden olur. IE8 var, bu yüzden JavaScript hata ayıklayıcısını kullanırken, eventnesnenin preventDefaulthataya neden olan bir yöntemi olmadığını öğrendim ve böylece form gönderiliyor. Firefox (Firebug kullanarak öğrendim) durumunda yöntem desteklenir.

Herhangi bir yardım?


Öyle; Dokümanlara göre ( mootools.net/docs/core/Native/Event#Event:preventDefault ) ne yapması gerekir: "Olay Yöntemi: preventDefault - Etkinliğin varsayılan eylemini önlemek için çapraz tarayıcı yöntemi."
Paolo Bergantino

Benim kötü, "mootools olayları durdurmak için bir yöntemi yok?" Olan yorumumu sildim. Yani ie8 üzerinde mootools ile ilgili bir sorun var ...
Alsciende

2
Bu sorun yeniden oluşturulamıyor. Bu keman "benim için yani 8'de çalışıyor" Hatayı göstermek için azaltılmış bir keman kurabilir misiniz? jsfiddle.net
eerne

Yanıtlar:


473

IE'de şunları kullanabilirsiniz:

event.returnValue = false;

aynı sonucu elde etmek için.

Ve bir hata almamak için, önleme varlığını test edebilirsiniz:

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

İkisini aşağıdakilerle birleştirebilirsiniz:

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

48
Aşağıdaki kod benim için çalıştı: if (event.preventDefault) {event.preventDefault (); } else {event.returnValue = yanlış; }
sv_in

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

31
"Olay" ın IE8'deki global olay nesnesi olması gerektiğini belirtmek gerekir. Olay işleyicisine iletilen olayı kullanamazsınız, örneğin e.preventDefault, bunun IE8'de çalışması için event.preventDefault olması gerekir .
jmort253

event.preventDefault();nedense benim için FireFox'ta çalışmayı bıraktım. Mority'nin kodunu kullandı ve harika çalıştı. Teşekkürler ~
James

8
@ Jmort253 adlı kullanıcının yorumuna biraz açıklık getirmek için:$('.something').click(function(e){ e.preventDefault ? e.preventDefault() : event.returnValue = false; });
Luke

23

Olayı mootools'un addEvent işleviyle bağlarsanız, olay işleyiciniz parametre olarak sabit (artırılmış) bir olay alır. Her zaman preventDefault () yöntemini içerir.

Olay bağlamadaki farkı görmek için bu kemanı deneyin. 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>

Dışarıdaki tüm jQuery kullanıcıları için gerektiğinde bir etkinliği düzeltebilirsiniz. HTML onclick = ".." kullandığınızı ve preventDefault () içermeyen IE'ye özgü bir etkinlik aldığınızı varsayalım, almak için bu kodu kullanın.

e = $.event.fix(e);

Bundan sonra e.preventDefault (); iyi çalışıyor.


2
Ne yazık ki bu hile benim için çalışmıyor. IE 10 kullanıyorum ve e.preventDefault () çağırmadan önce; $ .Event.fix (e) çağıran kamera; Başarısız :(
Beatles1692

Jquery 2'den kaldırılmış olabilir mi? Ancak IE10'un düzeltmeye ihtiyacı yoktur.
oldwizard

Sabit olayı e değişkenine tekrar atadınız mı?
oldwizard

11

Bu oldukça eski bir yazı olduğunu biliyorum ama sadece IE8 bu işi yapmaya çalışırken biraz zaman geçirdim.

Görünüşe göre IE8 sürümlerinde bazı farklılıklar var, çünkü burada ve diğer konularda gönderilen çözümler benim için işe yaramadı.

Diyelim ki bu koda sahibiz:

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

Benim IE8 preventDefault()yöntemi jQuery nedeniyle var, ama çalışmıyor (muhtemelen aşağıdaki noktadan dolayı), bu yüzden bu başarısız olur.

returnValueÖzelliği doğrudan false değerine ayarlasam bile :

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

Sadece jQuery özel olay nesnesinin bazı özelliklerini ayarladığım için bu da çalışmaz.

Benim için çalışan tek çözüm returnValue, global değişkenin özelliğini şu şekilde ayarlamaktır event:

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

IE8'i çalışmaya ikna etmeye çalışan birinin daha kolay olması için. Umarım IE8 yakında acı verici bir ölümle korkunç bir şekilde ölür.

GÜNCELLEME:

Sv_in belirttiği gibi , event.originalEventorijinal olay nesnesini almak ve orijinal nesnede returnValueözellik ayarlamak için kullanabilirsiniz . Ama henüz IE8 cihazımda test etmedim.


1
Ayrıca orijinal tarayıcı olay nesnesini de alabilirsiniz event.originalEvent. Daha fazla bilgi: stackoverflow.com/a/16675056/22550
sv_in

6

Mootools, Event nesnelerindeki preventDefault öğesini yeniden tanımlar. Bu nedenle kodunuz her tarayıcıda iyi çalışmalıdır. Değilse, o zaman mootoollerde ie8 desteğiyle ilgili bir sorun var.

Kodunuzu ie6 ve / veya ie7 üzerinde test ettiniz mi?

Doktor diyor

AddEvent ile eklenen her olay, manuel olarak örneklemeye gerek kalmadan mootools yöntemini otomatik olarak alır.

ama öyle değilse, denemek isteyebilirsiniz

new Event(event).preventDefault();

1
IE'de de bu şekilde kaydırma yaparken bazı sorunlar oluştu. Aman Tanrım! Neden IE?
sv_in

Etkinliği durdurmak istemiyor, ancak varsayılan eylemini engelliyor.
Alsciende

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

IE 9 ve Chrome'da test edildi.


2
IE 11'de çalışmıyor (e.preventDefault, bir şey yapmıyor gibi görünse de bir işlevdir)
GreySage

4

IE9'dan sonra bir klavye tuşunu devre dışı bırakmak için şunu kullanın: e.preventDefault();

IE7 / 8 altında normal bir klavye tuşunu devre dışı bırakmak için şunu kullanın: e.returnValue = false;veyareturn false;

Bir klavye kısayolunu (Ctrl, gibi Ctrl+F) devre dışı bırakmaya çalışırsanız şu satırları eklemeniz gerekir:

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

Sadece IE7 / 8 için tam bir örnek:

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

Başvuru: IE7 / IE8'de klavye kısayollarını devre dışı bırakma


Kafadaki çiviyi vuran tek cevaplı sizsiniz. Buradaki herkesin erken IE hakkında konuşmasının tek nedeni, platformlar arası işlevselliğe ihtiyaç duymasıdır. "e.keyCode = 0;" erken IE'de herhangi bir varsayılan eylemi öldürür.
www-0av-Com

3

İşte jquery 1.3.2 ve 09-18-2009'un gece yapısıyla test ettiğim bir işlev. Sonuçlarınızı bana bildirin. OSX'te Safari, FF, Opera'da her şey yolunda gidiyor. Yalnızca sorunlu bir IE8 hatasını düzeltmek içindir ve istenmeyen sonuçlara neden olabilir:

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

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

Kullanımı:

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

1
Bu stopyöntemi daha önce hiç görmedim ve msdn'de bulamadım. Bu ne işe yarıyor?
Oriol

1
.stop()bir istisna atar, çünkü mevcut değildir. Herhangi bir istisna istenen etkiye sahip olacaktır.
Jay Bazuzi

ve neden bir istisna atmak istersiniz? Yani, bir istisna atmak istiyorsanız, sadece e.preventDefault()bir istisna
Matthias Burger

2

preventDefaultyaygın bir standarttır; eski IE sürümleriyle uyumlu olmak istediğiniz her seferinde bir adhoc kullanmak hantaldır, bir çoklu dolgu kullanmak daha iyidir:

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

Bu, Etkinliğin prototipini değiştirecek ve genel olarak javascript / DOM'un harika bir özelliği olan bu işlevi ekleyecektir. Artık sorunsuz kullanabilirsiniz e.preventDefault.


0

return false dinleyicinizdeki tüm tarayıcılarda çalışmalıdır.

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

0

FWIW, herhangi birinin bu soruyu daha sonra tekrar ziyaret etmesi durumunda, onKeyPress işleyici işlevinize ne teslim ettiğinizi de kontrol edebilirsiniz.

Yanlışlıkla onKeyPress (olay) yerine onKeyPress (this) ilettiğimde bu hatayla karşılaştım.

Kontrol edilecek başka bir şey.


0

İşlev kontrolü olan bir yöntem bana yardımcı oldu. Bu yöntem IE8'de çalışır

if(typeof e.preventDefault == 'function'){
  e.preventDefault();
} else {
  e.returnValue = false;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.