ie9中的设置对象“对象”不支持此操作

Setting object in IE 9 "Object doesn't support this action"

本文关键字:对象 不支持 操作 设置 ie9      更新时间:2023-09-26

尝试将对象的属性设置为新对象,IE 9给了我一个奇怪的错误"Object Doesn't support this action"我不明白为什么只有这个浏览器在抱怨。

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()尚未定义。

如果你改变左面板为"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调用回调立即当你注册它

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

假设$()是一个异步方法。然而,实际上,如果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(); 
});

试试这个,它应该工作得很好,问题是你正在调用一个对象上的函数,然后它被定义。

这里是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 ...');
};
})