2012-11-09 176 views
-2

我有一些變量,我想在jQuery的焦點事件中使用。我如何聲明它們以便它們處於焦點回調中?Javascript/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或空字符串

+1

閱讀本文 - http://stackoverflow.com/questions/500431/javascript-variable-scope –

+1

首先,你在調用'focus'時沒有關閉''''。 –

+0

對不起,這不是語法 –

回答

0

這不是一個問題的範圍,這裏是正在發生的事情:

  1. 你調用這個函數中選擇您的元素和存儲值的長度輸入框
  2. 後來的人集中到箱子,同時它是空的,而且由於較早
  3. 他們在框中輸入,模糊掉並重新聚焦在什麼被存儲0記錄;這次你仍然得到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()提供更少的電話,而不是包裝一個對象兩次(你在函數調用中創建了一個jquery對象,然後再把它包裹在裏面)。

你可以看到它的jsFiddle工作。當您第一次將注意力集中到框中時,它仍然是0,但是將注意力集中到帶有文本的框中會產生預期結果。