Uncaught SyntaxError: неожиданный токен) - PullRequest
0 голосов
/ 29 марта 2012

* ПРИМЕЧАНИЕ. - Этот код принадлежит стороннему расширению.Я не участвовал в его создании, и несколько лет назад при его использовании это было единственное расширение, доступное в то время.Поэтому, хотя я ценю ваше мнение, я надеюсь, что все комментарии могут быть только для предложений по решению.Спасибо!

У нас на многих сайтах запущен компонент Google Maps для CMS, который позволяет клиентам добавлять маркеры и контуры (полигоны) в свои Карты Google.

Это работает годами.Отметим, что он использует Google Maps JS API 2, который был прекращен, а не API 3. Однако Google отметил, что API 2 все еще будет хорошо работать в 2013 году, так что это не проблема.Однако они, должно быть, что-то изменили, потому что на днях на всех наших сайтах, хотя на Картах появляются маркеры, а на полигонах нет.Они находятся на разных серверах.

Раньше не было ошибок, но теперь в Chrome написано:

"Uncaught SyntaxError: Unexpected token)" для строки 1669 в файле JS.Вы можете увидеть файл в следующей Gist:

https://gist.github.com/2238148

Как вы можете видеть, здесь нет пропущенного ")", и код почти года работал без изменений на почти 100 сайтах, поэтомупредположим, что что-то в конце Google, должно быть, изменилось.Но есть ли что-то, что мы можем приспособить к этому коду, чтобы помочь противостоять изменениям?-Обновление 25 марта, когда все это сломалось, Google сделал обновление своего API Карт Google 2.

Поиск в Интернете, и вот пример сайта, использующего тот же компонент с той же ошибкой: http://goo.gl/GMgOs

Эта проблема, кажется, близка к следующему:

// extract current digraph from overlay function
    var digraph = GMap.addOverlay.toString().replace(/\s/g,'').replace(/.push\([^{]+\);a.initialize\([^{]+\);a.redraw\([^{]+\).+$/,'').replace(/^.+\./,'');
    // add multiple overlays at once (api hack to improve loading speed)
    GMap2.prototype.addOverlays = function(a) {
        var b = eval('this.' + digraph);
        var i = a.length;
        while (i--) {
            b.push(a[i]);
            a[i].initialize(this);
            a[i].redraw(true);
        }
    }

Если этот код нужно изменить, может ли кто-нибудь опубликовать модифицированную версию в Gist или Pastie?

Другое обновление - этот кодв вышеупомянутом выше я прокомментировал, так как это, предположительно, не было необходимости, был взломать, чтобы ускорить вещи.Тем не менее получает ошибку, однако отмечается в комментариях.Однако я заметил здесь: https://developers.google.com/maps/documentation/javascript/v2/reference#GMap2.Methods.Overlays, что он вызывает код «addOverlay», а не «addOverlays», поэтому задаюсь вопросом, может быть, s был снят в последнем обновлении API Google.Удаление s во всех трех местах просто выдает новую ошибку, которая повторяет [объект] много раз.

Ответы [ 4 ]

2 голосов
/ 04 апреля 2012

Код, который вы разместили, основан на внутренних деталях реализации для GMap2.prototype.addOverlay, которые могут быть изменены в любое время.

Лучше было бы полагаться только на внешний интерфейс для GMap2. Вы можете реализовать метод addOverlays как таковой:

GMap2.prototype.addOverlays = function(overlays) {
  for (var i = 0, I = overlays.length; i < I; ++i) {
    this.addOverlay(overlays[i]);
  }
};

Можете ли вы заменить фрагмент кода из своего поста этим и посмотреть, работает ли он?

2 голосов
/ 04 апреля 2012

Код - мерзость, на самом деле я не видел худшего дополнения за пять лет работы с Версией 2 и помощи пользователям. Она перезаписывает GMap (часть API Версии 2 для обеспечения совместимости с Версией 1).) без переобъявления.Ошибка, которую вы получаете, является прямым результатом взлома минимизированного кода: в какой-то момент она неизбежно потерпела неудачу и никогда не должна была быть реализована.* line, а затем переопределите новый метод GMap2.prototype.addOverlays, который следует за ним.Это позволит коду использовать функцию API addOverlay() и устранит проблему.

GMap2.prototype.addOverlays = function(a) {
        var i = a.length;
        while (i--) {
             this.addOverlay(a[i]);
        }

Похоже, что addOverlays() принимает массив оверлеев.Существующий метод пытается добавить их непосредственно во внутренний массив , который был перемещен.Предлагаемый метод просто использует собственный метод GMap2 addOverlay() для добавления каждого члена массива объектов.Таким образом, мы используем открытый метод и не пытаемся взломать минимизированный код API - если мы сделаем это снова, он почти наверняка снова сломается.


GMarker.prototype.openInfoWindowFX и GMarker.prototype.updateInfoWindowдополнения к GMarker и вряд ли вызовут проблемы (особенно если они в настоящее время работают), хотя даже они используют свойства GMarker - который на самом деле не рекомендуется.

1 голос
/ 03 апреля 2012

Очевидно, что определение функции GMap.addOverlay было изменено, и ваш взлом RegExp в его исходном коде больше не работает.Функция и то, что ваши регулярные выражения делают с ней.

Почему именно вам нужно на месте изменить их код, в любом случае?Почему вы просто не скопировали определение функции, которую хотели, внесли изменения, а затем использовали эту версию?(Без необходимости eval, либо.)

1 голос
/ 29 марта 2012

Этот код ужасен. Вы делаете GMap.addOverlay.toString(), заменяете что-то регулярными выражениями и затем выполняете это с помощью eval.

Зачем вам нужно что-то заменить в коде функции? Что такое код GMap.addOverlay? Если вы сможете ответить на эти вопросы, вы сможете понять, почему ваше регулярное выражение больше не работает и возвращает неверный код.

...