2

私は積み重ねられています。私のコードでは、送信の不正行為を防ぐことはできません。追加するまで、これは正常に機能していthis.doSomething();ました。

なぜこれが起こるのですか?PreventDefaultを使用する必要がありますか?

作業コード: http: //jsfiddle.net/WwW5R/

HTML:

<div id="container">
    <form action="" method="post" id="input">
            <input type="submit">
    </form>
</div>

JavaScript:

$(function() {
    var ReserveUI = function($el) {
        this.$form = {
            input: $el.find('#input')
        };
        this._eventify();
    };

    ReserveUI.prototype.doSomething = function() {
        return false;
    }

    ReserveUI.prototype._eventify = function() {
        this.$form.input.submit(function() {
            this.doSomething(); //if comment out this line, it works
            return false;
        });
    };
    var UI = new ReserveUI($("#container"));
});

読んでくれてありがとう:)

4

3 に答える 3

2

submitコールバック関数では、thisオブジェクトを参照するのではなく、要素自体を参照します。

したがって、要素にdoSomethingプロパティがなく、return falseスキップされるため、例外が発生します。

代わりに、これを書いてください:

ReserveUI.prototype._eventify = function() {
    var self = this;
    this.$form.input.submit(function(e) {
        e.preventDefault(); // cancels event even if subsequent lines fail
        self.doSomething();
    });
};

バグの原因がスコープの問題にすぎないことを示す実用的な例については、http://jsfiddle.net/xgGGx/1/を参照してください。

これがスクリプトデバッグツールの目的です。報告されたエラーにより、障害がかなり明白になるはずです...

于 2012-04-26T11:36:38.030 に答える
2

これはスコープの不一致です。

this.$form.input.submit(function() { //here "this" is ReserveUI
    this.doSomething(); //here "this" is input button
    return false;
});

また、doSomething()oninputボタンがないため、スクリプトが中断し、への部分が実行されなくなりreturn falseます。

これを回避する方法は次のとおりです

ReserveUI.prototype._eventify = function() {
    var $this = this; //create a reference to the object
    this.$form.input.submit(function() {
        $this.doSomething(); //Now call the object method
        return false;
    });
};

デモ

于 2012-04-26T11:43:05.973 に答える
0

コードにエラーがあるようdoSomethingです(プログラムだけreturn falseではないと思います)。

エラーが発生した場合でもイベントが継続しないようにするには、falseを返さず、e.preventDefault()代わりに次を使用します。

    this.$form.input.submit(function(e) {
        e.preventDefault();
        this.doSomething();
    });
于 2012-04-26T11:37:40.057 に答える