2

这是我在 Windows XP 和 Windows 2003 上使用 JavaScript 和 IE8 时遇到的一个有趣问题。我在页面上创建了一个对象,然后检索有关该对象的信息(例如,它的版本)。尝试获取版本时,我正在运行以下代码:

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

有趣的是,除了 Windows XP 和 2003 上的 IE8 之外,此代码适用于所有单个浏览器。我已经进行了一些调试,这就是事情变得有趣的地方。

myObject为空,但 myObject.version 未定义。所以我所做的是我在两者之间添加了一个警报,所以现在的代码如下:

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

警报导致“未定义”,但是,console.log 现在生成实际版本。如果我在此警报之前添加警报(假设警报(“某事”)),那么第二个警报现在具有实际版本。我假设这是一个时间问题(由于某种原因,对象需要某个时间才能提供存储在其中的数据?)但我不确定这是什么类型的时间问题或如何解决它。

抱歉,描述太长了,但感谢您提供任何帮助。

4

2 回答 2

0

document.getElementById 不返回对象。它返回一个 DOM 元素。因此,您希望在 DOM 元素中看到 .version 属性,而官方 W3C 规范缺少该属性(或者至少我不知道这一点)。

我不确定您希望在 .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);
});

您可以在函数中添加 setTimeout 直到 .version 属性存在。

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 回答
0

如果将<script>...</script>带有js代码的标签放在html文件的末尾会发生什么?在我看来,代码是在 DOM 未准备好时执行的。如果你把它放在最后,那么它将在加载后执行。

于 2013-01-07T09:16:05.823 回答