2014-01-09 11 views
10

Ich verwende das Autocomplete-Steuerelement Google Places, und es erstellt ein Element für das Dropdown mit einer Klasse pac-container.Google platziert Autocomplete, wie pac-Container zu bereinigen?

Ich benutze die Autovervollständigung in einer Ember App, und wenn ich damit fertig bin, wird das DOM-Element die Autovervollständigung wird entfernt, aber das pac-container Element bleibt, auch wenn es versteckt ist. Wenn ich das nächste Mal eine neue Autovervollständigung instanziiere, wird eine neue pac-container erstellt und die alte bleibt erhalten. Ich kann anscheinend nichts wie eine dispose-Methode in der API finden, also gibt es eine Möglichkeit, dies richtig zu tun? Wenn nicht, dann sollte ich jQuery benutzen, um die Elemente aufzuräumen.

Antwort

5

Ich hatte das gleiche Problem, und hoffentlich Google bietet schließlich ein offizielles Mittel zur Aufräumung, aber im Moment konnte ich das Problem lösen, indem Sie manuell das pac-container-Objekt entfernen, eine Referenz, die in der gefunden werden kann Automatische Vervollständigung Klasse zurückgegeben von:

autocomplete.gm_accessors_.place.Mc.gm_accessors_.input.Mc.L 

Was ich einfach aus dem DOM in meinem Widget destructor entfernt:

var autocomplete = new google.maps.places.Autocomplete(element, options); 

der Verweis auf das pac-Container-Element finden Sie unter

$(autocomplete.gm_accessors_.place.Mc.gm_accessors_.input.Mc.L).remove(); 

Hoffe das hilft.


aktualisieren

Ich bin nicht sicher, wie Googles Verschleierungs funktioniert, aber Teile der oben scheinen verschleiert, und scheitern wird offensichtlich, wenn die Verschleierung oder inneren Strukturen des API ändern. Sie können nicht viel über Letzteres tun, aber für Ersteres könnten Sie zumindest die Objekteigenschaften nach erwarteten Kriterien durchsuchen. Wie wir sehen können, sind einige der Eigenschaftsnamen nicht verschleiert, während einige wie "Mc" und "L" zu sein scheinen. Um dies etwas robuster, schrieb ich den folgenden Code:

var obj = autocomplete.gm_accessors_.place; 
$.each(Object.keys(obj), function(i, key) { 
    if(typeof(obj[key]) == "object" && obj[key].hasOwnProperty("gm_accessors_")) { 
    obj = obj[key].gm_accessors_.input[key]; 
    return false; 
    } 
}); 
$.each(Object.keys(obj), function(i, key) { 
    if($(obj[key]).hasClass("pac-container")) { 
    obj = obj[key]; 
    return false; 
    } 
}); 
$(obj).remove(); 

Der Code die allgemeine Struktur erwartet dies auch bleiben, obwohl sie nicht auf der (möglicherweise) unter Berufung verschleierten Namen „Mc“ und „L“. Hässlich, ich weiß, aber hoffentlich behebt Google dieses Problem bald.

1

Dies funktioniert jetzt , bis Google den Klassennamen ändert.

autocomplete.addListener('place_changed', function() { 

    $('.pac-container').remove(); 

}); 
Verwandte Themen