2010-11-22 88 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