2011-09-19 47 views
0

我有一个javascript对象(简化)。为什么我不能将此元素引用设置为变量?

var MyObject = (function(){ 

    var propertyOne = $('.links li:first-child'); 
    var propertyTwo = $('.links .active'); 

    function startup() 
    { 
    propertyOne.addClass("class"); //Works 
    propertyTwo.addClass("class2"); //Does not work 
    $('.links .active').addClass("class2"); // Works 
    } 

    return { 
    init: function() 
    { 
     startup(); 
    } 
    } 
}); 

我选择propertyOne和propertyTwo的方式有什么区别?我不明白为什么

propertyOne.addClass("class"); //Works 
$('.links .active').addClass("class2"); // Works 

然而...

propertyTwo.addClass("class2"); //Does not work 

谁能帮我解释一下?

回答

3

在调用var propertyTwo = $('.links .active')时,propertyTwo的DOM元素不能存在,而只有调用startup()时才会存在。

要确认这一点,我们需要更多关于您的脚本的信息。例如,如果在DOM完全加载之前创建了MyObject,然后在DOM完全加载之后(或者至少在加载了对应于$('.links .active')的元素之后调用init()的方法),我之前描述的内容可能会发生。

无论如何,你应该重点学习如何调试这样的事情连同为什么这个特定的尝试是行不通的。在这个过程中的主要步骤是行var propertyTwo = $('.links .active')后立即登录到控制台propertyTwo。如果控制台显示[] (至少在Chrome中),这意味着没有匹配的元素,这将支持我说的事情发生。

+1

+1。jQuery的长度/大小是perfiect方法来di agnose这样的条件http://api.jquery.com/length/ –

+0

啊,你是对的,我想我知道你要去哪里。在DOM被加载后(在脚本的另一部分中),'active'类被应用。有没有什么方法可以将该元素设置为我的对象的属性? –

+0

也许,但我需要看到更多的代码。您可以在运行您放入帖子的代码之前设置“主动”类吗?这将是一个非常简单的解决方案。如果没有,我真的需要看到更多的代码(HTML和JS)提供进一步的帮助。 – maxedison

相关问题