在IE 9中设置对象“对象不支持此操作”

时间:2013-03-07 23:26:49

标签: javascript jquery internet-explorer

尝试将对象的属性设置为新对象,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  
};

4 个答案:

答案 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 ...');
};

})