2013-03-07 64 views
2

試圖對象的屬性設置爲一個新的對象和IE 9給了我一個奇怪的錯誤 「對象不支持此操作」我不明白爲什麼這是唯一抱怨的瀏覽器。設置對象

http://jsfiddle.net/billpull/QNm6f/1/

我寫的代碼的順序它得到想知道如果是這樣的問題,因爲技術上存在該對象之前,瀏覽器將達到這一部分,但在實際執行的代碼是它確實存在解析。

var project = {}; 

project.viewModels = {}; 

project.myViewLocator = { 
    viewOne: null, 
    viewTwo: null 
}; 

$(function() { 
    project.myViewLocator.viewOne = new project.viewModels.ViewOneModel(); 
}); 

project.viewModels.ViewOneModel = function() { 
    // some logic 
}; 

回答

2

,因爲你擁有了它在左側面板設置onload您的jsfiddle有這個排序問題。這意味着,當你撥打:

$(function() { 
    project.myViewLocator.viewOne = new project.viewModels.ViewOneModel(); 
}); 

文件已加載,因此立即執行回調,因此ViewOneModel()尚未確定。

如果將左側面板更改爲「<body>中沒有換行」,則排序問題將消失,因爲文檔尚未準備好,並且只有在定義了構造函數之後調用回調函數纔會被調用。

如果你看到在瀏覽器之間的時間差,這可能是由於該jQuery的實現在不同的瀏覽器domready中方法的不同方式。但是,在所有情況下,等待運行的代碼,直到onload已經解僱將意味着DOM已準備就緒,domready中的代碼可能已經解僱或註冊時可能會立即觸發。


最簡單的建議是在使用它之前定義任何函數,而不必擔心這樣的時間問題。


進一步信息:在通過jQuery的跟蹤落實.ready()(或者你正在使用的形式),你可以找到的代碼塊:

// Do we need to add the callbacks to the 
// current firing batch? 
if (firing) { 
    firingLength = list.length; 
    // With memory, if we're not firing then 
    // we should call right away 
} else if (memory) { 
    firingStart = start; 
    fire(memory); 
} 

這表明(你可以閱讀註釋),如果DOM已經準備好,jQuery在註冊時立即調用回調函數。

0

您正在註冊dom ready回調初始化ViewOneModel之前您定義了它。我猜是IE9的定義之前執行的回調,因爲DOM已經準備好了。

0

你假設$()是一個異步方法。 但是,事實上,如果dom在調用之前就已經準備好了,這是一個錯誤的假設。

更改順序將工作:

var project = {}; 

project.viewModels = {}; 

project.myViewLocator = { 
    viewOne: null, 
    viewTwo: null 
}; 

project.viewModels.ViewOneModel = function() { 
    // some logic 
}; 

$(function() { 
    project.myViewLocator.viewOne = new project.viewModels.ViewOneModel(); 
}); 
0

試試這個應該工作正常,問題是你在呼喚它被定義之前,對象上的功能。

這裏是jsffidle

var project = {}; 

project.viewModels = {}; 

project.myViewLocator = { 
    viewOne: null, 
    viewTwo: null 
}; 
$(document).ready(function() { 
$(function() { 
    project.myViewLocator.viewOne = new project.viewModels.ViewOneModel(); 
}); 

project.viewModels.ViewOneModel = function() { 
    // some logic 
    alert('it s working fine ...'); 
}; 

})