funkcja event.preventDefault () nie działa w IE

202

Oto mój kod 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', '');
        }
    });
});

We wszystkich przeglądarkach oprócz IE działa to dobrze. Ale w IE powoduje to błąd. Mam IE8, więc podczas korzystania z jego debugera JavaScript dowiedziałem się, że eventobiekt nie ma preventDefaultmetody powodującej błąd, więc formularz jest przesyłany. Ta metoda jest obsługiwana w przypadku przeglądarki Firefox (którą dowiedziałem się za pomocą Firebug).

Jakaś pomoc?

sv_in
źródło
To robi; zgodnie z dokumentacją ( mootools.net/docs/core/Native/Event#Event:preventDefault ) to, co ma, powinno działać: „Metoda zdarzenia: preventDefault - Metoda przeglądarki, aby zapobiec domyślnej akcji zdarzenia”.
Paolo Bergantino,
Mój zły, usunąłem swój komentarz, który brzmiał: „czy mootools nie mają metody zatrzymywania zdarzeń?”. Więc jest problem z mootools na ie8 ...
Alsciende
2
Nie można odtworzyć tego problemu. To skrzypce „działa dla mnie np. 8” Czy możesz ustawić zredukowane skrzypce, aby wyświetlić błąd? jsfiddle.net
eerne

Odpowiedzi:

472

w IE możesz użyć

event.returnValue = false;

aby osiągnąć ten sam wynik.

Aby nie wyświetlać błędu, możesz przetestować obecność funkcji preventDefault:

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

Możesz połączyć te dwa z:

event.preventDefault ? event.preventDefault() : (event.returnValue = false);
Alsciende
źródło
48
Następujący kod działał dla mnie: if (event.preventDefault) {event.preventDefault (); } else {event.returnValue = false; }
sv_in
229
event.preventDefault ? event.preventDefault() : event.returnValue = false;
mortiy
31
Warto zauważyć, że „zdarzenie” musi być globalnym obiektem zdarzenia w IE8. Nie można użyć zdarzenia przekazanego do modułu obsługi zdarzeń, takiego jak e.preventDefault, musi to być event.preventDefault, aby działało w IE8.
jmort253
event.preventDefault();z jakiegoś powodu przestałem dla mnie pracować w FireFoxie. Użyłem kodu moralności i działało świetnie. Dzięki ~
James
8
Żeby dodać trochę jasności do komentarza @ jmort253:$('.something').click(function(e){ e.preventDefault ? e.preventDefault() : event.returnValue = false; });
Łukasz
23

Jeśli powiązasz zdarzenie za pomocą funkcji addEvent mootools, program obsługi zdarzeń otrzyma naprawione (rozszerzone) zdarzenie przekazane jako parametr. Zawsze będzie zawierał metodę preventDefault ().

Wypróbuj to skrzypce, aby zobaczyć różnicę w wiązaniu zdarzeń. 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>

Dla wszystkich użytkowników jQuery możesz naprawić zdarzenie w razie potrzeby. Powiedzmy, że użyłeś HTML onclick = ".." i otrzymujesz zdarzenie specyficzne dla IE, w którym brakuje funkcji preventDefault (), po prostu użyj tego kodu, aby go uzyskać.

e = $.event.fix(e);

Następnie e.preventDefault (); działa w porządku.

oldwizard
źródło
2
Niestety ta sztuczka nie działa dla mnie. Korzystam z IE 10 i przed wywołaniem e.preventDefault (); Kameruję dzwoniąc do $ .event.fix (e); bez powodzenia :(
Beatles1692
Mogło to zostać usunięte z jquery 2? Ale IE10 nie potrzebuje poprawki.
oldwizard
Czy przypisałeś stałe zdarzenie do zmiennej e?
oldwizard
11

Wiem, że to dość stary post, ale spędziłem trochę czasu próbując sprawić, by działało w IE8.

Wygląda na to, że istnieją pewne różnice w wersjach IE8, ponieważ rozwiązania zamieszczone tutaj i w innych wątkach nie działały dla mnie.

Powiedzmy, że mamy ten kod:

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

W mojej preventDefault()metodzie IE8 istnieje z powodu jQuery, ale nie działa (prawdopodobnie z powodu punktu poniżej), więc to się nie powiedzie.

Nawet jeśli ustawię returnValuewłaściwość bezpośrednio na false:

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

To też nie zadziała, ponieważ właśnie ustawiłem właściwość niestandardowego obiektu zdarzenia jQuery.

Jedynym rozwiązaniem, które pracuje dla mnie jest, aby ustawić właściwość returnValueo zmiennej globalnej event tak:

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

Aby ułatwić komuś, kto spróbuje przekonać IE8 do działania. Mam nadzieję, że IE8 wkrótce umrze okropnie w bolesnej śmierci.

AKTUALIZACJA:

Jak wskazuje sv_in , można użyć, event.originalEventaby uzyskać oryginalny obiekt zdarzenia i ustawić returnValuewłaściwość w oryginalnym. Ale nie przetestowałem go jeszcze w moim IE8.

muffir
źródło
1
Możesz także pobrać oryginalny obiekt zdarzenia przeglądarki event.originalEvent. Więcej informacji: stackoverflow.com/a/16675056/22550
sv_in
6

Mootools redefiniuje funkcję zapobieganiaDefault w obiektach zdarzeń. Twój kod powinien więc dobrze działać w każdej przeglądarce. Jeśli nie, oznacza to problem ze wsparciem ie8 w mootools.

Czy przetestowałeś swój kod na ie6 i / lub ie7?

Doktor mówi

Każde zdarzenie dodane za pomocą addEvent automatycznie pobiera metodę mootools, bez konieczności ręcznego jej instancji.

ale w przeciwnym razie możesz spróbować

new Event(event).preventDefault();
Alsciende
źródło
1
Wystąpił problem podczas takiego pakowania również w IE. O mój Boże! Dlaczego IE?
sv_in
Nie chce jednak zatrzymać zdarzenia, po prostu uniemożliwi jego domyślną akcję.
Alsciende
5
if (e.preventDefault) {
    e.preventDefault();
} else {
    e.returnValue = false;
}

Testowane na IE 9 i Chrome.

RolandoCC
źródło
2
Nie działa w IE 11 (e.preventDefault jest funkcją, chociaż wydaje się, że nic nie robi)
GreySage
4

Aby wyłączyć klawisz klawiatury po IE9, użyj: e.preventDefault();

Aby wyłączyć zwykły klawisz klawiatury w IE7 / 8, użyj: e.returnValue = false;lubreturn false;

Jeśli spróbujesz wyłączyć skrót klawiaturowy (za pomocą Ctrl itp. Ctrl+F), Musisz dodać te linie:

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

Oto pełny przykład tylko dla 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;
    }
});

Odwołanie: Jak wyłączyć skróty klawiaturowe w IE7 / IE8

JBE
źródło
Jesteś jedyną osobą, która odpowiedziała, by trafić w gwóźdź. Jedynym powodem, dla którego ktoś tutaj mówi o wczesnej wersji IE, jest to, że potrzebuje funkcji międzyplatformowej. „e.keyCode = 0;” zabije domyślną akcję we wczesnym IE.
www-0av-Com
3

Oto funkcja, którą testowałem przy użyciu jquery 1.3.2 i nocnej wersji 09-18-2009. Daj mi znać swoje wyniki. Wszystko działa dobrze na tym końcu w Safari, FF, Opera na OSX. Służy wyłącznie do naprawiania problematycznego błędu IE8 i może mieć niezamierzone wyniki:

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

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

Stosowanie:

$('a').click(function (e) {
    // Execute code here
    ie8SafePreventEvent(e);
    return false;
})
Eliran Malka
źródło
1
Nigdy wcześniej nie widziałem tej stopmetody i nie mogłem jej znaleźć w msdn. Co to robi?
Oriol
1
.stop()zgłasza wyjątek, ponieważ nie istnieje. Każdy wyjątek przyniesie pożądany efekt.
Jay Bazuzi
i dlaczego chcesz rzucić wyjątek? Chodzi mi o to, że jeśli chcesz zgłosić wyjątek, możesz po prostu zadzwonić, e.preventDefault()ponieważ i tak wyrzuci wyjątek ...
Matthias Burger
2

preventDefaultjest powszechnym standardem; używanie adhoc za każdym razem, gdy chcesz być zgodny ze starymi wersjami IE, jest kłopotliwe, lepiej użyć polifill:

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

Spowoduje to zmodyfikowanie prototypu zdarzenia i dodanie tej funkcji, która jest świetną cechą javascript / DOM w ogóle. Teraz możesz używać e.preventDefaultbez problemu.

EliuX
źródło
0

return false Twój słuchacz powinien działać we wszystkich przeglądarkach.

$('orderNowForm').addEvent('submit', function () {
    // your code
    return false;
}
daemon1981
źródło
0

FWIW, na wypadek, gdyby ktoś powrócił do tego pytania później, możesz również sprawdzić, co przekazujesz funkcji obsługi onKeyPress.

Wystąpił ten błąd, gdy przez pomyłkę przekazałem onKeyPress (this) zamiast onKeyPress (event).

Jeszcze coś do sprawdzenia.

Kirby L. Wallace
źródło
0

Pomogła mi metoda z kontrolą funkcji. Ta metoda działa w IE8

if(typeof e.preventDefault == 'function'){
  e.preventDefault();
} else {
  e.returnValue = false;
}
Pablo
źródło