Функция Javascript работает с FF и Chrome, но не с браузером дяди Билла - PullRequest
1 голос
/ 15 февраля 2010

У меня есть следующая функция, которую я использую (к счастью, как хак, поскольку я до сих пор не понял правила области видимости переменных bizzare javascript), чтобы извлекать все глобальные переменные с известным префиксом из скрипта.

Функция хорошо работает с FF и Google Chrome (предположительно, она будет работать со всеми производными браузерами Moz). Тем не менее, я только что протестировал его в IE8 (он же браузер дяди Билла [как в Билле Гейтсе]), и (возможно, не удивительно) эта функция не работала. Я отладил функцию, и оказалось, что глобальные переменные хранятся в другом объекте (я могу ошибаться, я читал на JS только пару дней). В любом случае, вот функция, которая корректно работает в браузерах на основе Moz:

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 ]

2 голосов
/ 15 февраля 2010

Это известная проблема, IE не предоставляет глобальные переменные для цикла for-in над объектом окна (несмотря на тот факт, что доступ к глобальным переменным напрямую, как window.globalVar работает) Возможный обходной путь - объявить глобальные переменные явно как члены объекта окна, например:

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

Объявляя переменные таким образом в начале скрипта, вы сделаете их доступными для цикла for-in.

Лучшее решение, конечно, это избежать глобальных переменных :-) Или, по крайней мере, сохраняя их все в отдельной переменной, которую вы можете потом просматривать без хаков.

0 голосов
/ 15 февраля 2010

В IE обязательно храните свои свойства там, где вы хотите, чтобы они были прочитаны.

0 голосов
/ 15 февраля 2010

global на самом деле не a Зарезервированное слово JavaScript .

Попробуйте это вместо того, что у вас есть (прокомментировал возможные проблемы, с которыми ваш код, вероятно, сталкивается в 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 голосов
/ 15 февраля 2010

похоже, это должно работать, глобальное ключевое слово? попробуйте использовать что-нибудь еще или просто переменную windows напрямую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...