2014-01-22 164 views
-1

我通常使用不同風格的代碼,這是一種更基本的風格。所以我正在嘗試一種新的做事方式,但我似乎無法得到它。jQuery函數返回undefined

我的console.log返回一個jQuery對象:console.log(accountMenu.child);

但是這返回undefined:console.log(accountMenu.child.css('top'));。和其他jQuery方法是一樣的。我究竟做錯了什麼?

var accountMenu = { 
accountButton: jQuery('.my-account-btn'), 
child: jQuery('#my-account-droplist'), 
container: jQuery('.my-account-droplist-container'), 

closeAccount: function() { 
    accountButton.removeClass('expanded'); 
    child.animate({ 
     "top": child.outerHeight() * -1 
    }, 650); 
}, 

openAccount: function(){ 
    accountButton.addClass('expanded'); 
    child.animate({ 
     "top": 0 
    }, 650); 
    this.setTimeout(function(){closeAccount()}, 6000); 
}}; 

jQuery(document).ready(function(){ 

accountMenu.child.css({"top": accountMenu.child.outerHeight() * -1}); 

console.log(accountMenu.child); 

//animate account drop down 
accountMenu.accountButton.click(function() { 
    //check if open or closed 
    if (accountMenu.accountButton.hasClass('expanded')){ 
     accountMenu.accountMenu.closeAccount(); 
    } else{ 
     //first close mycart 
     if (jQuery('.top-cart > div').hasClass('expanded')){ 
      Enterprise.TopCart.hideCart(); 
      setTimeout(function(){ 
       accountMenu.accountMenu.openAccount(); 
      }, 700); 
     }else { 
      accountMenu.accountMenu.openAccount(); 
     }; 
    }; 
}); 
}); 
+0

是jQuery的正確加載?什麼時候'.css(「top」)'給出未定義 - 在'document.ready'之前或之後觸發? – CompuChip

+0

已加載jQuery。 –

+0

我從** console.log(accountMenu.child); **: [context:document,selector:「#my-account-droplist」,jquery:「1.10.2」,constructor:function, init:function ...] 並從** console.log(accountMenu.child.css('top')); **: [div#my-account-droplist,context:document,selector:「# my-account-droplist「,jquery:」1.10.2「,constructor:function,init:function ...] –

回答

1

你知道jQuery(document).ready(),你已經在使用它。但是,在頁面加載完成之前,您可以從該塊外部的頁面獲取數據。

編輯:如果你問如何使accountMenu全球,你與var關鍵字在適當的範圍內聲明它:

var accountMenu; 

jQuery(document).ready(function(){ 
    accountMenu = { 
     accountButton: jQuery('.my-account-btn'), 
     ... 
    }; 
}); 
+0

aah好吧,這是有道理的。但我需要從其他地方訪問數據,這就是爲什麼我把它放在ready()函數之外的原因。什麼是更好的方式來格式化? –

0

「我的console.log返回jQuery對象:console.log(accountMenu.child);

這是因爲$("any selector")總是返回一個jQuery OB ject,但如果沒有元素匹配,jQuery對象將爲空,然後.css()將返回undefined

試圖訪問/操作DOM元素的任何JS代碼都需要在瀏覽器解析相關元素後運行,這意味着您應該將var accountMenu = { ...聲明移動到文檔就緒處理程序中或將腳本元素移至(在</body>標記之前 - 在這種情況下,您根本不需要就緒處理程序)。

+0

好吧,但那麼我怎麼會從jQuery(document).ready()函數以外調用這兩個函數呢? –

+0

我不明白。你爲什麼不打電話給他們,就像你已經打電話給他們一樣? – nnnnnn

+0

從哪裏?你不是總想從某個觸發器訪問你的數據嗎(無論是'document.ready'還是一些按鈕點擊等)? – CompuChip

0

哪些錯誤在側Document.ready.I越來越可變accountMenu認爲你需要做這樣的

jQuery(document).ready(function(){ 

var accountMenu = { 
accountButton: jQuery('.my-account-btn'), 
child: jQuery('#my-account-droplist'), 
container: jQuery('.my-account-droplist-container'), 

closeAccount: function() { 
    accountButton.removeClass('expanded'); 
    child.animate({ 
     "top": child.outerHeight() * -1 
    }, 650); 
}, 

openAccount: function(){ 
    accountButton.addClass('expanded'); 
    child.animate({ 
     "top": 0 
    }, 650); 
    this.setTimeout(function(){closeAccount()}, 6000); 
}}; 

accountMenu.child.css({"top": accountMenu.child.outerHeight() * -1}); 

console.log(accountMenu.child); 

//animate account drop down 
accountMenu.accountButton.click(function() { 
    //check if open or closed 
    if (accountMenu.accountButton.hasClass('expanded')){ 
     accountMenu.accountMenu.closeAccount(); 
    } else{ 
     //first close mycart 
     if (jQuery('.top-cart > div').hasClass('expanded')){ 
      Enterprise.TopCart.hideCart(); 
      setTimeout(function(){ 
       accountMenu.accountMenu.openAccount(); 
      }, 700); 
     }else { 
      accountMenu.accountMenu.openAccount(); 
     }; 
    }; 
}); 
});