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  
};
4

4 回答 4

2

您的 jsFiddle 有这个排序问题,因为您onload在左侧面板中设置了它。这意味着当你打电话时:

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

文档已加载,因此它立即执行回调,因此ViewOneModel()尚未定义。

如果您将左侧面板更改为“No wrap in <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 会在您注册它时立即调用回调。

于 2013-03-07T23:31:49.707 回答
0

您正在注册回调以在定义它之前dom ready进行初始化。我猜 IE9 是在定义之前执行回调,因为 DOM 已经准备好了。ViewOneModel

于 2013-03-07T23:32:38.843 回答
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(); 
});
于 2013-03-07T23:34:35.293 回答
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 ...');
};

})
于 2013-03-08T00:12:49.473 回答