javascript - 在 IE 9 中设置对象 "Object doesn' t 支持此操作”

标签 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  
};

最佳答案

您的 jsFiddle 存在此排序问题,因为您将其设置为 onload在左侧面板中。这意味着当您调用时:

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

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

如果将左侧面板更改为“<body> 中不换行”,则排序问题就会消失,因为文档尚未准备好,并且在定义构造函数之前不会调用回调函数。

如果您发现浏览器之间的时间差异,这可能是由于 jQuery 在不同浏览器中实现 DOMReady 方法的方式不同。但是,在所有情况下,都要等待运行代码,直到 onload has fire 意味着 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 在你注册它时立即调用回调。

关于javascript - 在 IE 9 中设置对象 "Object doesn' t 支持此操作”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15283892/

相关文章:

javascript - 在 ng-repeat 中使用选择值

javascript - 多响应 AJAX 请求

html - 表与位置 : absolute in IE (not Chrome) 不对齐

internet-explorer - IE9 @font-face 遇到未知错误

javascript - 使用javascript计算下载时间

javascript - 使用 RESOLVE 的路由不会等待完整结果即可开始使用第二个 reolve 函数

javascript - 悬停时暂停以实现简单的 jquery 轮播

javascript - 使用 jQuery 更改订单 div

css - 使用模态窗口后 IE8 中的 @font-face 问题

javascript - AngularJS 中的日期时间格式