0


0

現在、HTMLタグで指定されたonkeypressイベントを含むテキストエリアがあります。 実行時に別の条件を追加したいので、このキー押下をキャプチャし、それを上書きするために使用される関数として保存しようとしています。 これが私が実装しようとしているコードです。

$(document).ready(関数(e){var defaultKeypress = $( 'textarea')。keypress; $( 'textarea')。keypress(関数(e){if(fieldsChanged){fieldsChanged = false;} else { defaultKeypress(e);}

;)); ;));

私が抱えている問題はIE 7にあります ( "defaultKeypress(e);"がコメントアウトされていても)元のキー押下げを起動し、新しいキー押下げを起動します。 (最初にオリジナル、次に新しい)。 textareaタグからonkeypress属性を削除する以外に(コードがどのように生成された場合でもこれを行うことはできません)、元のキープレスを起動しないようにする方法はありますか?

ありがとうございます。 意地の悪い

2 Answer


4


jQueryの `keypress`メソッドはあなたが渡したハンドラに_adds_していますが、何もオーバーライドしません_ これは仕様によるものです。 これにより、問題の要素に複数のイベントハンドラを添付することができ、既存のハンドラを壊すことを心配する必要はありません。

実際には、既存のハンドラを無効にする必要があります。 これにはunbindを使うことはできません。 あなたはとにかくあなただけのハンドラを自分で削除することができます:

var $el = $('textarea'),
    defaultKeypress = $el.attr('onkeypress');

$el.removeAttr('onkeypress');

$el.keypress(function(e) {
    if (fieldsChanged) {
        fieldsChanged = false;
    }
    else {
        return defaultKeypress.apply(this, arguments);
    }
});

apply`を使って正しいスコープで defaultKeypress`を呼び出し、その結果を返すために `return`を使っていることに注目してください。 これは、ブラウザがそれを呼び出した標準のイベントハンドラ環境を維持するためのすべてです。

参考文献:


1


http://docs.jquery.com/Events/unbind[unbind]メソッドを調べましたか?

私はこれを試してみませんでしたが、私はそれがこのように機能するはずだと思います。

$(document).ready(関数(e){var defaultKeypress = $( 'textarea')。keypress; $( 'textarea')。unbind( "keypress"); $( 'textarea') ){if(fieldsChanged){fieldsChanged = false;} else {defaultKeypress(e);}

;)); ;));