Google Maps Funktioniert Nicht in jQuery Tabs
Google maps nicht funktioniert, wenn innerhalb von jQuery-tabs ist eine Frage, die alle über das Internet. In meiner Forschung bisher keine der Lösungen zu funktionieren scheint. Hoffentlich hier jemand helfen kann...
Dies ist ein screenchot der Fehler in Firefox 10, Chrome 17, Safari 5.1.2, Opera 11.61.
http://www.flickr.com/photos/75523633@N04/6932970713/
Der Fehler wird nicht im IE8 und intermittierende in 9. In Firefox, es geht Weg, wenn Sie öffnen FireBug.
Die Seite ist in WordPress 3.3.1 ist die Karte erzeugt/abgerufen über ein plugin. Es scheint nicht egal, welche Karten-plugin ich benutze, der Fehler bleibt der gleiche. Basierend auf meiner Forschung, dies scheint zu sein, js/jQuery-problem zwischen den tabs und die Google-Maps API-javascript, nicht ein WordPress - /plugin-problem.
Hier ist mein code. Jetzt bin ich mit dem wp-gmappity-easy-google-maps-plugin für die maps, aber ich habe auch versucht, das umfassende-google-map-plugin. Beide funktionieren auch Super außerhalb der tabs.
HTML:
//Header calls:
<script type='text/javascript' src='http://maps.google.com/maps/api/js?sensor=false'></script>
<script type='text/javascript' src='http://xxxxxxxxxx.com/wp-content/themes/zzzzzzzzzz/scripts/tabs.min.js'></script>
//HTML Body:
<div class="tabs_framed_container">
<ul class="tabs_framed">
<li><a href="#">Tab 1</a></li>
<li><a href="#">Tab 2</a></li>
<li><a href="#">Tab 3</a></li>
<li><a href="#">Map Tab</a></li>
<li><a href="#">Tab 3</a></li>
</ul>
<div class="tabs_framed_content">
<h2>Tab 1 Content</h2>
<!-- Some Content -->
</div>
<div class="tabs_framed_content">
<h2>Tab 2 Content</h2>
<!-- Some Content -->
</div>
<h2>Tab 3 Content</h2>
<!-- Some Content -->
</div>
<div class="tabs_framed_content">
<div class="map_container">
<div style="width:900px;margin-left:auto;margin-right:auto;">
<div class="wpgmappity_container" id="wpgmappity-map-1" style="width:900px;height:400px;margin-left:auto;margin-right:auto;"></div>
</div>
<script type="text/javascript">
function wpgmappity_maps_loaded1() {
var latlng = new google.maps.LatLng(42.4005322,-71.2750094);
var options = {
center: latlng,
mapTypeId: google.maps.MapTypeId.ROADMAP,
zoomControl : true,
zoomControlOptions :
{
style: google.maps.ZoomControlStyle.SMALL,
position: google.maps.ControlPosition.TOP_LEFT
},
mapTypeControl : true,
mapTypeControlOptions :
{
style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR,
position: google.maps.ControlPosition.TOP_RIGHT
},
scaleControl : true,
scaleControlOptions :
{
position: google.maps.ControlPosition.TOP_LEFT
},
streetViewControl : true,
streetViewControlOptions :
{
position: google.maps.ControlPosition.TOP_LEFT
},
panControl : false, zoom : 14
};
var wpgmappitymap1 = new google.maps.Map(document.getElementById('wpgmappity-map-1'), options);
var point0 = new google.maps.LatLng(42.4005322,-71.2750093);
var marker1_0 = new google.maps.Marker({
icon : 'http://xxxxxxxxxx.com/wp-content/themes/zzzzzzzzzz/images/mapmarker.png',
position : point0,
map : wpgmappitymap1
});
}
jQuery(window).load(function() {
wpgmappity_maps_loaded1();
});
</script>
</div>
</div>
<div class="tabs_framed_content">
<h2>Tab 2 Content</h2>
<!-- Some Content -->
</div>
Ist hier das relevante CSS:
.tabs_framed{padding:0;margin:0;list-style-type:none;clear:left;height:25px;border-bottom:1px solid #E5E5E5;}
.tabs_framed_container{margin-bottom:40px;}
.tabs_framed a{
display:block; position:relative; background:#fafafa; border:1px solid #E5E5E5; padding:7px 30px; margin-right:2px;
font-size:10px; text-decoration:none; text-transform:uppercase; letter-spacing:1px; line-height:10px; color:#777;
opacity:1; -webkit-transition:all .5s ease; -moz-transition:all .5s ease; -o-transition:all .5s ease; transition:all .5s ease;
}
.tabs_framed a:hover{color:#20548B;text-decoration:none;background:#fff;}
.tabs_framed a.current{color:#000;cursor:default;border-bottom:1px solid #fff;background:#fff;}
.tabs_framed li,{padding:0;margin:0;list-style-type:none;float:left;}
.tabs_framed_content{display:none;background-color:#fff;border:1px solid #E5E5E5;border-width:0 1px 1px 1px;padding:30px 30px 15px 30px;}
div.wpgmappity_container img {
background-position: 0% 0%;
background-color: none !important;
max-width: none !important;
background-image: none !important;
background-repeat: repeat !important;
background-attachment: scroll !important;
}
Hier ist ein link zu der Datei, die regelt, dass meine Registerkarten:
http://themes.mysitemyway.com/awake/wp-content/themes/awake/lib/scripts/tabs.min.js
flowplayer.org/tools/forum/25/79274 ist eine Lösung, die ich gefunden (ganz nach unten Blättern). Jedoch, die checkResize und resizeMap nicht mehr funktionieren (siehe api-Referenz an code.google.com/apis/maps/documentation/javascript/reference.html#Map scrollen Sie ein wenig nach unten zu "Events" und findet google.maps.event.trigger(map, 'resize') das ist offenbar der Ersatz-code). www.raymondcamden.com/index.cfm/2009/6/5/jQuery-Tabs-and-Google-Maps ist ein weiteres Dokument verfasst, das ist zu alt.
Habe ich das vorgeschlagen:
jQuery(document).ready(function(){
jQuery('.tabs_container').bind('tabsshow', function(event, ui) {
if (ui.panel.id == "map-tab") {
google.maps.event.trigger(map, 'resize');
}
});
});
aber ich habe keine Ahnung, wie es zu implementieren (versucht, ein paar Möglichkeiten, ohne Erfolg), oder wenn es würde sogar funktionieren.
Aus aller meiner Forschung, es sieht aus wie Sie haben, um die trigger eine Karte resize-Ereignis aus, wenn der tab mit der Karte ausgewählt ist. Bisher hatte ich kein Glück Anpassung eine der Lösungen gibt - espceially da bin ich mot vertraut mit js/jQuery. Es scheint, wie jemand vertraut mit js bzw. jQuery lösen könnte diese.
Bitte helfen Sie mir.
- Verknüpfen Sie die API für das tabs.js? Das würde helfen, uns mehr als die minified Datei selbst.
- es sieht aus wie die minified Datei, die jQuery Tools 1.2.5 Tabs, ist von flowplayer.org/tools/tabs. Download scheint nicht zu funktionieren, aber ich habe diesen link zu Github github.com/jquerytools/jquerytools/tree/master/src/tabs
- Sie können das gleiche erreichen, ohne mit dem schweren Gewicht jQuery-Tools sehr einfach. Haben Sie darüber nachgedacht?
- Ich verwende ein wordpress-theme, die ich nicht ändern kann. Die tabs-Funktion ist eingebaut (shortcode). Wenn Sie wissen, ein weiterer Weg, um diese Arbeit zu machen, lasst es mich bitte wissen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
rogercut Antwort, hab mich, wo ich sein musste. Ich bin mit Bootstrap tabs, verschachtelt, und konnte nicht die Karte zu aktualisieren.
Wenn ich Sie auf die Registerkarte Gruppe 2 (#tg2), die Registerkarte Map (Karte) ist die erste, zu zeigen. Ich musste auch die Feuerwehr die Größe geändert wird, wenn jemand darauf geklickt, wird das zweite level tab (#tab1) innerhalb einer tab-Gruppe 2.
Den click-handler funktioniert, aber das problem ist, dass auf klicken, der tab ist immer noch versteckt... Durch Einstellung einer kleinen Verzögerung, es gibt Zeit für die Registerkarte, um zu zeigen, bevor Sie die Größe ändern feuert ab.
So, wir sagen dem browser zu warten 50ms nach dem klicken zu tun, die Größe ändern. In meinen Tests 50ms war viel Zeit für die Reiter zeigen, aber kurz genug, dass es nicht wirklich spürbar für den Benutzer. In der Tat, meine Prüfung arbeitete mit einer Verzögerung von nur 1 MS auf den 4-5 Maschinen getestet habe ich es auf - sogar ein Hund langsamen laptop hatten wir sitzen in der Lagerung. 50ms ist einfach nur sicher.
Hoffe, dies hilft jemand anderes.
Gab ich die plugins und ging mit den google maps-shortcode, die freigegeben wurde für das theme, das ich verwende. Während ich verlieren die benutzerdefinierte Marker-Funktionalität, die theme-Entwickler waren schließlich in der Lage zu helfen, alle arbeiten. Fügen Sie den folgenden code, um die shortcode PHP-Datei.
Dieser code löst eine Karte neu laden, wenn der tab mit der Karte geklickt wird. Es auch recenters der Karte. Diese Lösung das problem bei mir gelöst und die google-maps zeigt jetzt in der jquery-tabs. Hoffentlich einige der javascript-versierte Benutzer hier (und plugin-Entwickler!!!) anpassen können Sie diese Lösung, um Ihre eigenen Karten-in-tabs Probleme.
Bei der Entwicklung einer website, die enthalten eine Karte, Registerkarte Inhalte, die ich lief in das gleiche Problem.
Die Website ist http://samet.com.ar (in spanischer Sprache, klicken Sie auf das map-Symbol oder der 'ubicacion' link).
Die gleichen Fehler, die Sie erwähnen entstanden, wenn Sie die tab-div geladen, zusammen mit den anderen in der Registerkarte Gruppe.
Ich habe herausgefunden, dass wenn ich verwalten könnte, um ihm einige Zeit zum laden nach dem anderen tabs hat, dann gäbe es kein problem.
Ich mir leisten konnte, das zu tun, weil ich ohnehin gab rund 3,5 Sek für den wrapper zu zeigen, um alle zu erhalten, die hintergrund-Fotos geladen und die Karte ist in einem unsichtbaren tab beim laden, so brauche ich nicht zu zeigen, bis rechts Weg.
Dem Reiter Karte lädt dann als callback-Funktion direkt nach den ganzen wrapper funktioniert.
Wenn Sie untersuchen Sie die Seite, suchen Sie nach id "pane-container'. In 'Scheiben' finden Sie die anzeigen div geladen am Ende.
Den entsprechenden jQuery code, den ich verwende in der index.php Seite ist wie folgt:
Ich hoffe, das hilft irgendwie.
Vergaß zu erwähnen, dass die anzeigen-code eingebettet ist, wie ein Inhalt in einem bestimmten Beitrag.
(BTW, die map-marker befindet sich auf der oberen rechten Absicht zu zeigen, die wichtigsten Zufahrtsstraßen.)
Prost!
Das problem (wie oben erwähnt und an anderen stellen) ist, dass die Karte div sichtbar sein müssen, um zu funktionieren. So laden Sie die Karte in einem tab sichtbar ist. Dann, wenn Sie es wünschen, wechseln Sie zu der Registerkarte, die Sie anzeigen möchten.
Dazu habe ich ein one-time-Ereignis-listener auf die Karte. Innerhalb dieser Funktion wechselte ich auf die erste Registerkarte. Während des Ladens sehen Sie die Karte für etwa eine Sekunde, bevor der tab gewechselt wird. Der Vorteil ist, dass der Benutzer zu tun hat, nichts, um zu arbeiten.
Keine der oben genannten Antworten sind vollkommen korrekt. Das problem tritt auf, weil die map-canvas ist festgelegt width:0; height:0 standardmäßig vor dem laden und dann erwartet, dass Sie entweder übergeben Sie die dimension oder die Dimensionen von den Eltern, so ist dies innerhalb von jQuery-tabs gibt es keine Dimensionen.
Wie oben erwähnt binden Sie das click-Ereignis von Ihrem Reiter und setzen Sie die map_canvas dimension dann rufen Sie die google.maps.event.trigger()
Bevor ich das gleiche problem für die Umsetzung der google-Karte in Tabletten, speziell, wenn die Karte nicht in der ersten Auswahl. Aber ich habe versucht und es funktioniert mit einer einfachen Lösung wie diese :
Machen Sie eine einfache js-Funktion :
Ich löste dieses für die bootstrap-Registerkarte. Es ist nur die Frage der Aufruf von resize map-Funktion direkt nach dem map-container angezeigt.
Ich habe die folgende Seite aus der initialize () - Funktion:
Dies funktioniert möglicherweise nicht für alle!
Eine Lösung, die für mich gearbeitet haben war die verborgene Registerkarten angezeigt, sondern irgendwo "nicht sichtbar" für den Benutzer. Dies wird es erlauben, die Karte zu Rendern, obwohl nicht in der ersten/aktiven tab.
Finden Sie einen Weg, um das Ziel ausgeblendeten Registerkarten NUR:
Karte Breite 100% und nicht eine Feste Breite.
Geben diesem einen Versuch:
Ändern
zu
Dann fügen Sie diese javascript -
In einem script-tag am Anfang der Seite. Was sollte dies für Sie tun:
Indem die
id
- Attribut auf die Registerkarte link, Sie sind explizit angeben, es ist eine Karte drin. Dann sind Sie beim hörenonClick
Veranstaltung durch die jQuery tabs-Bibliothek, die feuert, wenn eine Registerkarte ausgewählt wird, was löst die re-Dimensionierung der Karte.onClick
einfachclick
und sehen, ob das funktioniert. Wenn nicht, würde ich Blick auf die Google-maps-plugin-tool, die Sie verwenden und stellen Sie sicher, dass ermöglicht die normalen API zu arbeiten.Das problem ist einfach. Karten zu erbringen, die in einem element hat die Maße. Wenn Sie ein tab-system, das blendet die Registerkarte Inhalt, alle Elemente in der Registerkarte Inhalte haben keine Dimensionen, während die Eltern versteckt ist. Wenn jQuery tools css können Sie es tun, legen Sie die "versteckten" Inhalte, die offscreen sind, anstatt versteckt.
In der Reihenfolge zu verwenden:
google.maps.event.trigger(map, 'resize');
Benötigen Sie Zugriff auf die intitial map-Objekt variable "var wpgmappitymap1", sondern bezieht sich im inneren der Karte init-Funktion. Wenn Sie machen es zu einem globalen variable können Sie dann legen Sie Sie in Ihrer Größe ändern trigger
.tabs_framed_content{display:none;...
aus dem code in meiner Frage. Ändern, dassposition: absolute; left: -10000px;
bricht die tabs völlig. Ich schaue durch mein Thema ist php um zu sehen, wenn Sie senden Sie info, um die tabs.js so. Ich weiß nicht, wie man das map-Objekt variable global. Mehr spezifische Beratung würde sehr geschätzt werden. Danke.Ich hatte das gleiche problem und hier meine Lösung.
Habe ich den ajaxComplete-Funktion, die ausgelöst wird, wenn alle ajax-request oder Beiträge fertig sind.
Seine Arbeit für mich erfüllt meine Anforderung, und Sie können verwenden Sie es als Referenz:
Hinweis : Sie können die CSS-Klasse "map-Schaltfläche" für die Positionierung der Taste, wie erforderlich. Legen Sie Ihre eigene Bild-Taste. Ersetzen id="gmap" wie deins. Hoffe es hilft dir.
Versuchen, diese in der css: