2

これは、私が Windows XP と Windows 2003 で JavaScript と IE8 を使用して直面している興味深い問題です。ページ上にオブジェクトを作成し、そのオブジェクトに関する情報 (たとえば、そのバージョン) を取得します。バージョンを取得しようとすると、次のコードを実行しています。

var myObject = document.getElementById(objectId);
console.log(myObject.version);

興味深いのは、このコードが Windows XP および 2003 上の IE8 を除くすべてのブラウザーで機能することです。デバッグを行ったところ、興味深いことがわかりました。

myObject はnull ではありませんが、myObject.version は未定義です。そこで、間にアラートを追加したので、コードは次のようになりました。

var myObject = document.getElementById(objectId);
alert(myObject.version);
console.log(myObject.version);

アラートは「未定義」になりますが、console.log は実際のバージョンになります。この何かのアラートの前にアラートを追加すると (たとえば、alert("something"))、2 番目のアラートには実際のバージョンが含まれます。これはタイミングの問題だと思います (何らかの理由で、オブジェクトに保存されているデータを提供できるようにするために、オブジェクトがいつか必要になるのでしょうか?) しかし、これがどのようなタイミングの問題なのか、どのようにアプローチすればよいのかわかりません。

長い説明で申し訳ありませんが、助けていただければ幸いです。

4

2 に答える 2

0

<script>...</script>htmlファイルの最後にjsコードのタグを付けるとどうなりますか?私の意見では、コードはDOMの準備ができていないときに実行されます。最後に置くと、ロード後に実行されます。

于 2013-01-07T09:16:05.823 に答える
0

document.getElementById はオブジェクトを返しません。DOM 要素を返します。したがって、公式の W3C 仕様では欠落している .version プロパティが DOM 要素に表示されることが予想されます (または、少なくとも私はこれについて知りません)。

.version で何を期待しているのかわかりませんが、それが何かカスタムである場合は、次のようなカスタム オブジェクトを作成する必要があります。

var o = { version: "..." }
console.log(o);

これは時間の問題かもしれないとあなたは言いました。そうであれば、DOM が完全にロードされた後に .version プロパティにアクセスすることをお勧めします。次の目的で jQuery を使用できます。

$(document).ready(function() {
   var myObject = document.getElementById(objectId);
   alert(myObject.version);
   console.log(myObject.version);
});

.version プロパティが存在するまで、関数に setTimeout を追加できます。

var f = function(callback) {

   var check = function() {
       var myObject = document.getElementById(objectId);
       alert(myObject.version);
       console.log(myObject.version);
       if(typeof myObject.version !== "undefined") {
           callback(myObject.version);
       } else {
           setTimeout(check, 1000);
       }
   }

   setTimeout(check, 1000);

}
于 2013-01-07T08:16:19.640 に答える