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

onload左側のパネルで設定しているため、jsFiddle にはこの順序の問題があります。つまり、呼び出すと次のようになります。

$(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に初期化するコールバックを登録しています。DOM は既に準備ができているため、IE9 は定義のにコールバックを実行していると思います。ViewOneModel

于 2013-03-07T23:32:38.843 に答える
0

$() が非同期メソッドであると想定しています。ただし、実際には、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(); 
});
于 2013-03-07T23:34:35.293 に答える