как заставить jquery.couch.app.js работать с IE8 - PullRequest
5 голосов
/ 28 апреля 2010

Я проверил это на Windows XP SP3 в IE7 и IE8 (во всех режимах совместимости) и Windows 7 Ultimate в IE8 (во всех режимах совместимости), и он не работает одинаково на обоих. Я использую последнюю версию HEAD из репозитория couchapp . Это отлично работает на моей машине для разработки OSX 10.6.3. Я протестировал с Chrome 4.1.249.1064 (45376) и Firefox 3.6 на Windows 7 Ultimate, и они оба работают нормально. Как и Safari 4 и Firefox 3.6 на OSX 10.6.3

Вот сообщение об ошибке

Сведения об ошибке веб-страницы

Пользовательский агент: Mozilla / 4.0 (совместимый; MSIE 8.0; Windows NT 6.1; Trident / 4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0) Отметка времени: ср, 28 апр 2010 03:32:55 UTC

Сообщение: объект не поддерживает это свойство или метод Строка: 159 символов: 7 Код: 0 URI: http://192.168.0.105:5984/test/_design/test/vendor/couchapp/jquery.couch.app.js

и вот «оскорбительный» фрагмент кода, который отлично работает на Chrome, Firefox и Safari. Если говорит, что ошибка на линии, которая начинается qs.forEach() из файла jquery.couch.app.js

  157 var qs = document.location.search.replace(/^\?/,'').split('&');
  158 var q = {};
  159 qs.forEach(function(param) {
  160   var ps = param.split('=');
  161   var k = decodeURIComponent(ps[0]);
  162   var v = decodeURIComponent(ps[1]);
  163    if (["startkey", "endkey", "key"].indexOf(k) != -1) {
  164     q[k] = JSON.parse(v);
  165   } else {
  166    q[k] = v;
  167   }
  168 });

Ответы [ 2 ]

6 голосов
/ 28 апреля 2010

forEach () - это функция, недавно добавленная в спецификацию JavaScript, поэтому не все браузеры поддерживают ее.

Вы можете прочитать об этом на MDC: https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Array/forEach

В разделе «Совместимость» вы найдете фрагмент, который делает forEach () доступным.

if (!Array.prototype.forEach)
{
  Array.prototype.forEach = function(fun /*, thisp*/)
  {
    var len = this.length >>> 0;
    if (typeof fun != "function")
      throw new TypeError();

    var thisp = arguments[1];
    for (var i = 0; i < len; i++)
    {
      if (i in this)
        fun.call(thisp, this[i], i, this);
    }
  };
}

Итак, скопируйте и вставьте приведенный выше код в ваш скрипт, и forEach () должен работать.

0 голосов
/ 28 апреля 2010

Мне также пришлось добавить indexOf() к объекту Array, чтобы он заработал после исправления проблемы forEach ()

if (!Array.prototype.indexOf)
{
    Array.prototype.indexOf = function(elt)
    {
        var len = this.length >>> 0;

        var from = Number(arguments[1]) || 0;
        from = (from < 0)
                ? Math.ceil(from)
                : Math.floor(from);
        if (from < 0)
            from += len;

        for (; from < len; from++)
        {
            if (from in this &&
                this[from] === elt)
                return from;
        }
        return -1;
    };
}
...