-2

jQuery の focus イベントで使用したい変数がいくつかあります。フォーカス コールバックに含まれるように宣言するにはどうすればよいですか?

var height = 72;

$('#myfield').focus(function() {
    heightinfeet = height / 12;
    alert(heightinfeet);
});

私にとって、高さは常に0です。渡す変数がいくつかあり、これをプロパティに使用してオブジェクトにしようとしましたが、どちらにも渡されませんでした

/ *実際のコード* /

function GOPRO_pfFieldConfirmation(oField1, oField2, oMarkerField, bCaseSens) {

var GOPRO_iFieldLen1 = $(oField1).val().length;
var GOPRO_iFieldLen2 = $(oField2).val().length;
var GOPRO_sFieldVal1 = $(oField1).val();
var GOPRO_sFieldVal2 = $(oField2).val();
var GOPRO_sFieldSub = GOPRO_sFieldVal1.substring(0, GOPRO_iFieldLen2);

//if not case sensitive, make all upper case

if (bCaseSens == false) {
    GOPRO_sFieldVal1 = GOPRO_sFieldVal1.toUpperCase();
    GOPRO_sFieldVal2 = GOPRO_sFieldVal2.toUpperCase();
    GOPRO_sFieldSub = GOPRO_sFieldSub.toUpperCase();

}

$(oField1).focus( function() {
    console.log(GOPRO_iFieldLen1);
    if ((GOPRO_sFieldVal1 == GOPRO_sFieldVal2) && GOPRO_iFieldLen1 > 0) {
        GreenMarker();
    }
    else if (GOPRO_iFieldLen1 > 0 && GOPRO_iFieldLen2 > 0) {
        RedMarker();
    }
    else {
        NoMarker();
    }

});

...

    GOPRO_pfFieldConfirmation($('#reg_email'), $('#reg_email2'), $('.field_confirm:eq(3)'), false);

console.log は常に 0 です。実際には、定義済みのすべての変数が 0 または null 文字列を返します。

4

1 に答える 1

0

これはスコープの問題ではありません。次のようなことが起こっています。

  1. 要素を選択し、入力ボックス内の値の長さを格納するこの関数を呼び出します
  2. 後で、人が空の箱に焦点を合わせ、0以前に保存されたものからログに記録されます
  3. 彼らはボックスに入力し、ぼやけて再び焦点を合わせます。今回0は、関数の最初の呼び出しで保存されたものであるため、まだ取得されており、その変数は更新されていません。

次のようなことをする必要があります。

function GOPRO_pfFieldConfirmation(oField1, oField2, oMarkerField, bCaseSens) {
    var $field1 = $(oField1), $field2 = $(oField2);

    $field1.focus(function() {
        //put these in the focus event, so they are bound everytime.
        var GOPRO_sFieldVal1 = $field1.val();
        var GOPRO_sFieldVal2 = $field2.val();
        var GOPRO_iFieldLen1 = GOPRO_sFieldVal1.length;
        var GOPRO_iFieldLen2 = GOPRO_sFieldVal2.length;
        var GOPRO_sFieldSub = GOPRO_sFieldVal1.substring(0, GOPRO_iFieldLen2);
        //if not case sensitive, make all upper case  
        if (bCaseSens == false) {
            GOPRO_sFieldVal1 = GOPRO_sFieldVal1.toUpperCase();
            GOPRO_sFieldVal2 = GOPRO_sFieldVal2.toUpperCase();
            GOPRO_sFieldSub = GOPRO_sFieldSub.toUpperCase();
        }

        console.log(GOPRO_iFieldLen1);
        if ((GOPRO_sFieldVal1 == GOPRO_sFieldVal2) && GOPRO_iFieldLen1 > 0) {
            //GreenMarker();
        } else if (GOPRO_iFieldLen1 > 0 && GOPRO_iFieldLen2 > 0) {
            //RedMarker();
        } else {
            //NoMarker();
        }
    });
}

GOPRO_pfFieldConfirmation('#reg_email', '#reg_email2', '.field_confirm:eq(3)', false);

jquery オブジェクトをキャッシュして 1 回だけ作成する、 への呼び出しを減らす.val()、オブジェクトを 2 回ラップしない (関数呼び出しで jquery オブジェクトを作成し、内部で再度ラップする) など、他にもいくつか追加しました。

jsFiddleが機能していることがわかります。最初にボックスにフォーカスしたときはまだ 0 ですが、テキストのあるボックスにフォーカスすると、期待どおりの結果が得られます。

于 2012-11-09T21:21:35.633 に答える