开发者

Javascript function works with FF and Chrome, but not uncle Bill's browser

I have the following function, which I use (admitedly, as a hack, since I still havent understood javascript's bizzare variable scoping rules), to fetch all global 开发者_JS百科variables with a known prefix, from within a script.

The function works well with FF and Google Chrome (presumbaly it would work with all Moz derivative browsers). However, I just tested it in IE8 (aka Uncle Bill [as in Bill Gates] browser), and (perhaps unsuprisingly), the function did not work. I debugged the function and it appears that global variables are stored in another object (I could be wrong, I've only been reading on JS for a couple of days now). In any case, here is the function, which works correctly in '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
}

Do I need a conditional branch (and a test to see if running under IE)?


It's known issue, IE does not expose global variables for for-in loop over window object (inspite that fact that accessing global variables directly like window.globalVar works). The possible workaround is to declare global variables explictly as members of window object, like:

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

By declaring variables in such way in the beginning of script you'll make them accessible for for-in loop.

The better solution of course is to avoid global vars :-) Or at least keeping all them in separate variable which you can later traverse without hacks.


it looks like it should work, is global a keyword? try using something else or just the windows variable directly.


In IE be sure to also store your properties where you want them to be upon read.


global is actually not a JavaScript reserved word.

Try this instead of what you have (commented for potential problems your code is likely running into on 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
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜