Javascript功能适用于FF和Chrome,但不适用于Bill叔叔的浏览器

时间:2010-02-14 22:10:22

标签: javascript cross-browser

我有以下函数,我使用(作为一个hack,因为我还没有理解javascript的bizzare变量作用域规则),从脚本中获取具有已知前缀的所有全局变量。

该功能适用​​于FF和谷歌浏览器(预测它适用于所有Moz衍生浏览器)。但是,我刚刚在IE8(也就是比尔盖茨的比利时)中测试了它,并且(也许是不可思议的),该功能无法正常工作。我调试了函数,似乎全局变量存储在另一个对象中(我可能错了,我现在只读了几天JS)。在任何情况下,这是函数,它在'Moz bazed browsers:

中正常工作
function getGlobalProperties(prefix) {
  var keyValues = [], global = window; // window for browser environments
  for (var prop in global) {
    if (prop.indexOf(prefix) == 0) // check the prefix
      keyValues.push(prop + "=" + global[prop]);
  }
  return keyValues.join('&'); // build the string
}

我是否需要条件分支(以及测试是否在IE下运行)?

4 个答案:

答案 0 :(得分:2)

已知问题,IE不会为窗口对象上的for-in循环公开全局变量(尽管直接访问全局变量就像window.globalVar一样)。 可能的解决方法是将全局变量明确地声明为window对象的成员,如:

window.globalVar = 1;
...
alert(globalVar); // = 1
globalVar = 'xxx';
alert(window.globalVar); // = xxx

通过在脚本开头以这种方式声明变量,您可以使它们可以进行for-in循环。

更好的解决方案当然是避免全球变种:-) 或者至少将它们保存在单独的变量中,以后可以在没有黑客的情况下进行遍历。

答案 1 :(得分:0)

它看起来应该有效,是全局关键字吗?尝试直接使用其他东西或只使用windows变量。

答案 2 :(得分:0)

在IE中,请务必将您的属性存储在您希望它们阅读的位置。

答案 3 :(得分:0)

global实际上不是 a JavaScript reserved word

尝试使用此代替您拥有的内容(评论您的代码可能会在IE上遇到的潜在问题):

function getGlobalProperties(prefix) {
  var keyValues = [], global = window; // window for browser environments
  for (var prop in global) {
    if (prop.indexOf(prefix) == 0) { // check the prefix
      try {
        // this implicitly converts a window property to a string, which might fail
        keyValues.push(prop + "=" + global[prop]);
      } catch (e) {
        // in case string conversion blows up
        // do something about it here
      }
    }
  }
  return keyValues.join('&'); // build the string
}