2013-03-07 66 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 ...'); 
}; 

})