2012-03-29 25 views
-1

* Hinweis - Dieser Code stammt von einer Drittanbietererweiterung. Ich hatte keinen Teil davon und vor einigen Jahren war es die einzige Erweiterung, die zu dieser Zeit verfügbar war. So, während ich Ihre Meinungen schätze, hoffe ich, dass alle Kommentare nur für Vorschläge auf einer Entschlossenheit sein können. Vielen Dank!Uncaught SyntaxError: Unerwartetes Token)

Wir haben viele Websites, die eine Google Maps-Komponente für ein CMS ausführen, mit der Kunden Markierungen und Umrisse (Polygone) zu ihren Google Maps hinzufügen können.

Dies funktioniert seit Jahren. Zu beachten ist, dass Google Maps JS API 2 verwendet wird, das nicht API 3, sondern Google eingestellt wurde. Allerdings hat Google festgestellt, dass API 2 auch 2013 noch gut funktionieren wird. Das ist nicht das Problem. Allerdings müssen sie etwas geändert haben, denn auf den anderen Seiten erscheinen die Karten und Polygone auf allen unseren Seiten. Sie sind auf verschiedenen Servern.

Bevor es keine Fehler war, aber jetzt in Chrome heißt es:

"Uncaught Syntaxerror: unerwartetes Token)" für die Linie 1669 in einer JS-Datei. Sie können die Datei im folgenden Gist sehen:

https://gist.github.com/2238148

Wie Sie sehen nicht es fehlt „)“ und der Code ist seit Jahren auf fast 100 Standorten unmodifizierten arbeiten, also davon ausgehen, etwas auf Googles Ende Muss habe sich geändert. Aber können wir uns an diesen Code anpassen, um dem Wandel entgegenzuwirken? -Update am 25. März, wenn alle diese brach Google ein Update für ihre Google Maps API 2.

das Web durchsucht gemacht und hier ist ein Beispiel-Website die gleiche Komponente mit dem gleichen Fehler mit: http://goo.gl/GMgOs

Dieses Problem erscheint in der Nähe sein:

 
// 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); 
     } 
    } 

Wenn dieser Code die geänderte Version auf einem Kern oder pastie jemand veröffentlichen werden muss alterted könnte?

Ein weiteres Update - Dieser Code in der oben genannten ich auskommentiert, da es nicht benötigt wird, war ein Hack, um die Dinge zu beschleunigen. Immer noch ein Fehler wird jedoch in den Kommentaren vermerkt. Ich habe jedoch hier bemerkt: https://developers.google.com/maps/documentation/javascript/v2/reference#GMap2.Methods.Overlays, dass es den Code "addOverlay" anstatt "addOverlays" nennt, also frage mich, ob vielleicht das s im letzten API Google Update entfernt wurde. Das Entfernen der s an allen drei Stellen schießt einfach einen neuen Fehler hervor, der [Objekt] viele Male wiederholt.

+0

Ich würde JSLint vorschlagen, da Aptana viele Fehler zeigt, wenn die JSLint-Validierung aktiv ist. So finden Sie Ihr Problem sicher. – helly0d

+1

@ helly0d: Der SyntaxError scheint in einem Eval zu passieren. Ich denke, JSLint kann das nicht finden, es würde nur sagen "Benutze eval nicht" :-) – Bergi

+0

@Bergi Zunächst einmal heißt es eigentlich "eval is evil", zweiter Punkt, trotzdem solltest du JSLint es denn haben eine Menge Fehler, und nicht zuletzt versuchen, den Code für eval zu sehen und zu debuggen, wenn es Bugs hat, machen Sie entweder ein Reparatur-Tool für unerledigten JS-Code oder überzeugen Sie Google von JSLint ihren Code: p. Am Ende gibt es nichts, was Sie tun können, um einen Fehler zu melden, wenn Sie sicher sind, dass es nicht Ihr Code ist. Viel Glück. – helly0d

Antwort

2

Der Code ist ein Greuel, in der Tat habe ich nicht gesehen ein schlechteres Add-on in fünf Jahren der Arbeit mit und hilft Benutzern der Version 2. Es überschreibt GMap (Teil von die Version 2 API, um die Kompatibilität mit Version 1) ohne erneute Deklaration zu gewährleisten. Der Fehler, den Sie bekommen, ist ein direktes Ergebnis eines Hacks zum minimierten Code: Dieser Fehler musste irgendwann fehlschlagen und sollte niemals implementiert worden sein.

Das Beste, was Sie tun können, ist die var digraph Zeile zu entfernen und dann die neue Methode GMap2.prototype.addOverlays, die darauf folgt, neu zu definieren. Dadurch kann der Code die addOverlay()-Funktion der API verwenden und das Problem beheben.

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

Es scheint, dass addOverlays() eine Reihe von Overlays nimmt. Die vorhandene Methode versucht, sie direkt zu dem internen Array von Überlagerungen hinzuzufügen, das verschoben wurde. Die vorgeschlagene Methode verwendet einfach die eigene addOverlay() Methode von GMap2, um jedes Mitglied des Array von Objekten hinzuzufügen. Daher verwenden wir eine exponierte Methode und versuchen nicht, den minimierten Code der API zu entführen, wenn wir das wieder tun, würde es höchstwahrscheinlich wieder zerbrechen.


GMarker.prototype.openInfoWindowFX und GMarker.prototype.updateInfoWindow sind Ergänzungen GMarker und unwahrscheinlich zu Problemen führen (vor allem, wenn sie zur Zeit arbeiten), obwohl auch sie verwenden Eigenschaften von GMarker - was nicht wirklich recommnded ist.

+0

Hey Andrew, danke wie erwähnt wurde diese Erweiterung nicht von uns entwickelt, also sind alle Kommentare dazu wie gut oder schlecht es leider nicht hilft so hoffentlich kannst du anderen mit dem eigentlichen Problem helfen. Leider war es für das verwendete CMS die einzige verfügbare Erweiterung, die die spezifischen Bedürfnisse des Kunden zu der Zeit erfüllte, eine hartcodierte Lösung war zu dieser Zeit nicht praktikabel. Alle neuen Websites verwenden einfach Google My Maps jetzt eingebettet. Diese Anfrage besteht einfach darin, mehrere 100 existierende Seiten zu reparieren, indem diese eine Datei aktualisiert wird. Statt Wochen damit zu verbringen, die Version von My Maps zu ersetzen. – cchiera

+0

Für Ihren Vorschlag, den Code exercept im ursprünglichen Beitrag, der var Digraph und der gmap2 Abschnitt, versuchten wir, auskommen, aber immer noch fehlerhaft und die poylgons und Marker noch nicht angezeigt. Irgendwelche anderen Gedanken? – cchiera

+0

Um hinzuzufügen, wenn der Code auskommentiert ist der resultierende Fehler: Uncaught TypeError: Object # hat keine Methode 'addOverlays' und es verweist auf den Fehler bei: Zeile 559: GMap.addOverlays (Marker); GMap.addOverlays (Polygone); GMap.addOverlays (Polylinien); (und das sind die Aktionen, die nicht auf der Karte funktionieren. Das ist die Karte zeigt immer gut, es sind nur die Markierungen und Polylinien/Polygone, die nicht angezeigt werden. Lassen Sie mich wissen, wenn Sie andere Ideen haben. Danke – cchiera

1

Dieser Code ist hässlich. Sie tun GMap.addOverlay.toString(), ersetzen Sie etwas mit regulären Ausdrücken und führen Sie es dann mit Eval.

Warum müssen Sie etwas in einem Funktionscode ersetzen? Was ist der Code von GMap.addOverlay? Wenn Sie diese Fragen beantworten können, sollten Sie sehen können, warum Ihre Regexp nicht mehr funktioniert und ungültigen Code zurückgibt.

+0

Ja, der Code ist wahrscheinlich nicht der beste. Es ist eine kostenlose Komponente von Drittanbietern, die vor Jahren entwickelt wurde. Leider ist es die einzige Erweiterung für dieses spezielle CMS, die unsere speziellen Anforderungen erfüllt. Zu bemerken, der Code hat immer auf allen fast 100 Seiten funktioniert, bis zu dem anderen Tag, als sie nicht mehr richtig funktionierten. Wir haben keinen Code geändert, daher muss sich etwas im Google Maps-API geändert haben. Wahrscheinlich beruhte die Erweiterung auf einem Hack, der von Google geändert wurde. Während ich Ihre Fragen zum Code zu schätzen weiß, kann ich keine beantworten. Hoffe einfach auf die beste Auflösung. – cchiera

+0

Auch da es wie gesagt eine Erweiterung zu einem CMS ist, so sind die Inhalte von "Addover" dynamisch. Im CMS hat der Benutzer eine Benutzeroberfläche, mit der er Markierungen oder Polygone (Umrisse) hinzufügen kann. Auf allen separaten über 100 Seiten funktionierte es immer bis zum anderen Tag, als plötzlich die Marker/Polygone von den Karten verschwanden und dieser Fehler in Chrome Console erschien. – cchiera

1

Offensichtlich wurde die GMap.addOverlay Funktionsdefinition geändert und Ihr RegExp-Hacken am Quellcode funktioniert nicht mehr.

alert(GMap.addOverlay.toString()) 

und

alert(digraph) 

Um zu sehen, was die neue Funktion ist und was Ihre reguläre Ausdrücke, um es tun.

Warum genau müssen Sie ihren Code trotzdem ändern? Warum haben Sie nicht einfach die gewünschte Funktionsdefinition kopiert, die Änderungen vorgenommen und dann diese Version verwendet? (Ohne eine eval, entweder.)

+0

Wir sind bereit, Änderungen über diese Website vorzunehmen, die die Funktionalität des CMS nicht beeinträchtigen. Zur Erinnerung, dies ist eine Komponente, die von einer dritten Partei entwickelt wurde, die nicht mehr entwickelt wird. Wir können alles im Komponentencode ändern, solange der Client neue Markierungen/Polygone eingibt, Einstellungen werden korrekt angezeigt. Wir können ändern "GMap.addOverlays (Marker);" zu "warnen (GMap.addOverlays (Markierungen));" sowie für Polygon und Polygon und post für die Ergebnisse hier. Wir können auch "Alarm (Digraph)" hinzufügen. Sollen wir das direkt nach Zeile 1669 hinzufügen? – cchiera

+0

Ersetzt die drei Zeilen mit Warnung (Versionen, aber nichts geändert. Nein Alter Popups, das ist. Könnten Sie mir wissen lassen, was genau geändert werden sollte, um die Informationen für die weitere Diagnose zu erhalten? Vielen Dank im Voraus! – cchiera

+0

Ich habe versucht, Alarm hinzuzufügen (Digraph), und das zeigte eine Änderung, wenn die Seite neu geladen wurde. Es sagte, "Xv (a)); v (dies," adveroverlay ", a)}" – cchiera

2

Der von Ihnen angegebene Code basiert auf internen Implementierungsdetails für GMap2.prototype.addOverlay, die jederzeit geändert werden können.

Es wäre besser, sich nur auf die externe Schnittstelle für GMap2 zu verlassen. Sie können eine addOverlays Methode als solche implementieren:

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

Können Sie den Code-Schnipsel aus Ihrem Post mit diesem ersetzen und sehen, ob es funktioniert?

+0

Hey Dave, ich habe gerade gesehen, dass es sehr ähnlich aussieht wie die andere Commenters-Lösung, die funktioniert hat, habe es nicht versucht, aber es sieht ähnlich aus es würde auch funktionieren, da er 4 Stunden vorher veröffentlicht wurde, und es funktioniert und ihm die Punkte zuweist, aber für andere Leute, die das lesen, könnte diese Lösung effizienter sein. Danke nochmal Dave! – cchiera

Verwandte Themen