-2

我有一些变量要在 jQuery 的焦点事件中使用。我如何声明它们以便它们在焦点回调中?

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 或空字符串

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 对象,以便您只创建一次,减少对.val().

你可以看到它工作的jsFiddle。当您第一次聚焦到框时它仍然是 0,但是聚焦到带有文本的框会产生预期的结果。

于 2012-11-09T21:21:35.633 回答