2010-11-22 94 views
2

我正在跟蹤我的代碼中的一個神祕問題。這個「錯誤」情況,其通過jQuery的.delegate()結合的event handler內:typeof jQuery.data()越野車?

my.$table_body.delegate('.wf-dropdown', 'change', function(e){ 
    parent_row_element = $(e.target).closest('tr')[0]; 

    if(typeof $.data(parent_row_element, 'changed') == 'undefined') 
     $.data(parent_row_element, 'changed', {}); 

    $.data(parent_row_element, 'changed').wf_id = e.target.value; 
    // .. more code 
}); 

你並不需要知道其中的一些變量的定義,他們是爲了什麼,神祕的事情發生在檢查值爲undefined。 我明確檢查是否已經有一個對象附加到parent_row_element,如果沒有,創建它。好像typeof $.data(anything)以我無法真正描述的方式失敗。如果連接了像Firebug這樣的調試器,則它的計算結果爲undefined,並且一切工作正常,沒有調試器,因爲對象未定義,所以始終拋出.wf_id,因爲它沒有創建。

它完美,如果我用這個語句:

if(!$.data(parent_row_element, 'changed')) 
    $.data(parent_row_element, 'changed', {}); 

這就是爲什麼我想,這是一個錯誤。還是我忽略了一些東西?

我能重現此問題:

拋出上點擊了錯誤的typeof用於
http://www.jsfiddle.net/5cEVf/

工作正常,沒有typeof運算
http://www.jsfiddle.net/5cEVf/3/

+1

你在這裏使用'=='而不是'==='使用可怕的領域。 (噢等待它的「typeof」結果 - 沒關係) – Pointy 2010-11-22 13:37:43

+0

@Pointy:我不這麼認爲?在調試模式下,'=='不應該成爲一個問題,無論如何'=='和'==='評估爲'true'。 – jAndy 2010-11-22 13:40:01

+1

爲什麼不''警告'typeof'的結果,所以你可以看到沒有使用調試器會發生什麼。 – 2010-11-22 13:40:10

回答

3

升級過去的1.4。 2,它是固定的。

如果你提醒typeof的結果,你會在1.4.2中得到object

+1

看起來像一個'返回null;'在1.4.2現在只是'return;' – Pointy 2010-11-22 13:54:22

+0

看起來像這樣。我很困惑,因爲如果你在FireBug調試會話期間評估整個'typeof'語句,它真的返回'undefined'。 – jAndy 2010-11-22 13:55:53

+0

btw ..我無法升級到1.4.4的具體項目。新的CSS處理在多個地方將代碼搞砸了。 – jAndy 2010-11-22 13:59:52

1

問題是該值設置爲null,null是一個對象。

因此typeof返回'object'這使得您的if失敗,並且由於該對象爲空,它也無法分配新屬性。

+0

我不認爲這個值實際上是'null' - 它真的看起來像是一個已經在1.4.3或1.4.4中修復的jQuery bug。當沒有「數據」材料存在於特定元素時,舊代碼將顯式返回null。 – Pointy 2010-11-22 13:56:43

+0

@Pointy,是的,我的意思是'.data()'的返回值爲null,'typeof null =='object''。 – 2010-11-22 13:58:41

+0

我已經在patrick dw的回答中發表了評論。無論如何,Firebug debbug監控會將表達式評估爲「undefined」。 – jAndy 2010-11-22 14:06:09