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-イベントのデフォルトアクションを防ぐためのクロスブラウザーメソッド」。
Paolo Bergantino、

悪いことに、「mootoolsにはイベントを停止する方法がないのですか?」というコメントを削除しました。ie8のmootoolsに問題があります...
Alsciende

2
この問題は再現できません。このフィドルはIE 8で機能します」エラーを表示するためのフィドルを減らして設定できますか?jsfiddle.net
eerne

回答:


472

IEでは、あなたは使うことができます

event.returnValue = false;

同じ結果を達成するため。

エラーが発生しないようにするために、preventDefaultの存在をテストできます。

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

この2つを以下と組み合わせることができます。

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

48
次のコードは私のために働きました:if(event.preventDefault){event.preventDefault(); } else {event.returnValue = false; }
sv_in 2009年

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

31
「イベント」はIE8のグローバルイベントオブジェクトである必要があることに注意してください。イベントハンドラーに渡されたイベント(e.preventDefaultなど)を使用することはできません。これがIE8で機能するためには、event.preventDefaultである必要あります。
jmort253

event.preventDefault();なんらかの理由でFireFoxで私のために働くのをやめました。morityのコードを使用して、それはうまくいきました。おかげで〜
ジェームズ・

8
:ちょうど@ jmort253さんのコメントにいくつかの明快さを追加する$('.something').click(function(e){ e.preventDefault ? e.preventDefault() : event.returnValue = false; });
ルーク

23

mootoolsのaddEvent関数を介してイベントをバインドすると、イベントハンドラーはパラメーターとして渡される固定(拡張)イベントを取得します。常に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 = ".."を使用して、preventDefault()のないIE固有のイベントを取得したとします。このコードを使用して取得します。

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

私のIE8 preventDefault()メソッドにはjQueryが原因で存在しますが、(おそらく以下の点が原因で)機能していないため、これは失敗します。

returnValueプロパティを直接false に設定した場合でも、

$('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がすぐに苦痛な死で恐ろしく死ぬことを願っています。

更新:

以下のようsv_inポイント、あなたが使用することができevent.originalEvent、元のイベントオブジェクトとセット取得するにはreturnValue、元の1にプロパティを。しかし、IE8ではまだテストしていません。


1
から元のブラウザイベントオブジェクトを取得することもできますevent.originalEvent。詳細:stackoverflow.com/a/16675056/22550
sv_in

6

Mootoolsは、EventオブジェクトのpreventDefaultを再定義しています。したがって、コードはすべてのブラウザで正常に動作するはずです。そうでない場合は、mootoolsのie8サポートに問題があります。

ie6やie7でコードをテストしましたか?

医師は言う

addEventで追加されたすべてのイベントは、手動でインスタンス化する必要なく、mootoolsメソッドを自動的に取得します。

そうでない場合は、試すことをお勧めします

new Event(event).preventDefault();

1
IEでもこのようにラップすると問題が発生しました。何てことだ!IEを選ぶ理由
sv_in 2009年

彼女はイベントを停止したくはありませんが、デフォルトのアクションを防ぐだけです。
アルシエンデ2009年

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のナイトリービルドでテストしてきた関数です。それであなたの結果を教えてください。OSX上のSafari、FF、Operaでは、このためすべてが正常に実行されます。これは問題のある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 2013

1
.stop()存在しないため、例外をスローします。例外があれば、望ましい効果が得られます。
Jay Bazuzi 14年

そして、なぜあなたは例外を投げたいのですか?つまり、例外をスローする場合はe.preventDefault()、とにかく例外をスローする原因を呼び出すことができます...
Matthias Burger

2

preventDefault広く普及している標準です。古いバージョンのIEに準拠するたびにアドホックを使用するのは面倒です。ポリフィルを使用することをお勧めします。

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

これにより、イベントのプロトタイプが変更され、この関数が追加されます。これは、一般にjavascript / DOMの優れた機能です。これでe.preventDefault問題なく使用できます。


0

return false リスナーではすべてのブラウザで動作するはずです。

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

0

FWIW、誰かが後でこの質問を再訪する場合に備えて、onKeyPressハンドラー関数に渡す内容を確認することもできます。

onKeyPress(event)ではなくonKeyPress(this)を誤って渡したときに、このエラーに遭遇しました。

確認するべき他の何か。


0

機能チェック付きの方法に助けられました。この方法はIE8で機能します

if(typeof e.preventDefault == 'function'){
  e.preventDefault();
} else {
  e.returnValue = false;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.