尝试将对象的属性设置为新对象,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
};
答案 0 :(得分:2)
您的jsFiddle有这个排序问题,因为您在左侧面板中设置了onload
。这意味着当你打电话时:
$(function () {
project.myViewLocator.viewOne = new project.viewModels.ViewOneModel();
});
文档已经加载,因此它会立即执行回调,因此尚未定义ViewOneModel()
。
如果将左侧面板更改为“No wrap in <body>
”,则排序问题消失,因为文档尚未就绪,并且在定义了构造函数之后才调用回调函数
如果您发现浏览器之间的时间差异,那可能是由于jQuery在不同浏览器中实现DOMReady方法的不同方式。但是,在所有情况下,等待运行代码直到onload
被触发将意味着DOM已经准备好并且DOMReady代码可能已经被触发或者可能在注册时立即触发。
最简单的建议是在使用之前定义任何函数,而不必担心像这样的时序问题。
更多信息:在跟踪.ready()
(或您正在使用的表单)的jQuery工具时,您可以找到以下代码块:
// 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会在你注册时立即调用回调。
答案 1 :(得分:0)
您正在注册dom ready
回调以在定义之前初始化ViewOneModel
。我猜IE9正在执行定义之前的回调,因为DOM已经准备就绪。
答案 2 :(得分: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();
});
答案 3 :(得分: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 ...');
};
})