Interaktive jQuery-Karte

moshpanda

Experte
Thread Starter
Mitglied seit
30.12.2014
Beiträge
750
Ort
Hörstel
Servus,

Ich will in jQuery eine Karte bauen, in der sich ohne Probleme weitere Kontaktinformationen hinzufügen lassen. Als Kartenmaterial nutze ich die jVector Map, welche den einzelnen Ländern das Attribut 'data-code="XX"' mitgibt. Nun will ich einen HTML-Container haben, in den ich die Kontaktinfos einfüge, in etwa so:

Code:
<div class="country-info" data-country="DE">
  <h3>Deutschland</h3>
</div>

Kann ich bei klick auf ein Land mit dem data-code schauen, ob es eine Box mit dem selben Value in der data-country gibt und dann diesen einblenden lassen?

Vielleicht hat aber auch jemand eine andere Idee... Im Grunde will ich einfach nur, dass bei Klick auf ein Land dementsprechende Kontaktinformationen in einem außerhalb der Karte liegenden Container angezeigt werden. :confused:
 
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
Gibt es irgendwo den kompletten Code? Das ganze ist natürlich möglich aber ohne den Code dann doch relativ schwer zu erraten.


Gesendet von iPad mit Tapatalk Pro
 
Die Karte nutze ich
Europe

HTML
Code:
<div id="info-text">
        <div id="data-country-elements">
          <span>LOREM IPSUM</span>
          <div class="country-info" data-country="IT">
            <h3>Italien</h3>
          </div>
          <div class="country-info" data-country="DE">
            <h3>Deutschland</h3>
          </div>
        </div>
      </div>

jQuery
Code:
var countryInfo = $(".country-info").attr("data-country");
      var countryContentInfo = $(".country-info").html();

      $("#world-map path").click(function(){
        if($(this).attr("data-code") == $(".country-info").attr("data-country")){
          $("#info-text").html(countryContentInfo);
        } else {
          $("#info-text").html("Keinen Händler gefunden");
        }
      });

Mein jQuery Part hängt an der Stelle
Code:
if($(this).attr("data-code") == $(".country-info").attr("data-country")){
Komme aber auch nicht weiter :/
 
Zuletzt bearbeitet:
Das sollte doch gehen, wenn ich jetzt auf den path klicke, dass sich der HTML Container einblende, oder?

CSS
Code:
  .country-info{display:none;}

HTML
Code:
<div id="info-text">
  <div class="country-info" data-country="IT">
    <h3>Italien</h3>
  </div>
  <div class="country-info" data-country="DE">
    <h3>Deutschland</h3>
  </div>
</div>

KARTE
Code:
<path d="HIER KOMMEN ETLICHE KOORDINATEN" [B]data-code="DE"[/B] fill="#8d8d8d" fill-opacity="1" stroke="none" stroke-width="0" stroke-opacity="1" fill-rule="evenodd" class="jvectormap-region jvectormap-element" cursor="pointer"></path>

jQuery
Code:
$("#world-map path").click(function(){
  var countrID = $(this).attr("data-code");
  $(".country-info").fadeOut();
  $(".country-info").attr(countrID).fadeIn();
});
 
Wenn du .attr() benutzt, lasst du dir den Wert zurückgeben der in einem HTML Attribut steht. Was du brauchst ist aber ein Selektor.

Attribute | jQuery API Documentation

Code:
$("#world-map path").click(function(){
  var countryCode = $(this).attr("data-code");
  var $info = $('.country-info[data-country="' + countryCode + '"]');

...

ungetestet versteht sich ;)


abgesehen davon hat die Karte auch eine API, du kannst dir die selbst gebastelten Click Handler auch sparen.

Map
 
abgesehen davon hat die Karte auch eine API

Wäre das dann so richtig?
Habe mich mit der Abfrage / dem Zusammen von Attributen noch nie wirklich auseinandergesetzt
Code:
onRegionClick:{
  var countryCode = $(this).attr("data-code");
  var $info = $('.country-info[data-country="' + countryCode + '"]');
  $(".country-info").fadeOut("slow", function(){
    $($info).fadeIn("slow");
  });
}
 
du kannst auch alles so lassen wie bisher, es war einfach nur ein Hinweis.


das hier:

Code:
$(".country-info").fadeOut("slow", function(){
    $($info).fadeIn("slow");
  });

ist noch etwas falsch. $($info) ist falsch, da nutzt du die jQuery Funktion auf einem jQuery Objekt. $info.fadeIn() reicht.
 
Läuft einwandfrei, Tausend Dank!
Allerdings habe ich da noch ein-zwei Fragen, kann ich dich vielleicht bei irgendeinem Messenger adden? Oder dir das Problem per PN schildern?
 
Schreibe doch einfach hier... dann können dir mehrere Leute helfen...
 
Na gut, ich versuchs mal..

Also mein Code sieht nun so aus:

CSS
Code:
.country-info{display:none;color:#fff;}
.country-info.first{display:block;}

jQuery
Code:
$(function(){
  $('#world-map').vectorMap({
    map: 'europe_mill',
    zoomOnScroll: false,
    zoomMax: 1,
    backgroundColor: '#fdb140',
    regionStyle: {
      initial: {
        fill: 'white',
        "fill-opacity": 1,
        stroke: 'none',
        "stroke-width": 0,
        "stroke-opacity": 1
      },
      hover: {
        "fill-opacity": 0.8,
        cursor: 'pointer'
      },
      selected: {
        fill: 'yellow'
      },
      selectedHover: {
      }
    }
  });

  $("#world-map path").click(function(){
    var countryCode = $(this).attr("data-code");
    var $info = $('.country-info[data-country="' + countryCode + '"]');
    $(".country-info").fadeOut(300);
    $info.delay(400).fadeIn(300);
  });
});

HTML
Code:
<div class="country-info first">
  <p>Steht von Anfang an da</p>
</div>
<div class="country-info fallback">
  <p>Kommt wenn Land keine Box hat</p>
</div>
<div class="country-info" data-country="IT">
  <h3>Italien</h3>
  <p>bubbedi<br />
  babbedi</p>
</div>
<div class="country-info" data-country="DE">
  <h3>Deutschland</h3>
  <p>bubbedi<br />
  babbedi</p>
</div>
<div class="country-info" data-country="ES">
  <h3>Spanien</h3>
  <p>bubbedi<br />
  babbedi</p>
</div>

Er fadet das die alte Infobox aus und die neue mit dem gleichen Attribute-Value ein. Nun würde ich gerne noch eine Art Fallback haben, sprich ich klicke auf ein Land wo keine Box mit entsprechendem Attribute-Value existiert (DIV mit der Klasse "fallback"), dann soll die eingeblendet werden
 
Ganz einfach gesagt musst du nur prüfen ob
if($info.get(0) !== undefined){
// Ausfuhren was passieren soll wenn Element vorhanden
}Else
{
// fallback
}

Das ganze vor das fade out

(Schnell mit dem Handy getippt und ungetestet)
 
Code:
$("#world-map path").click(function(){
  var countryCode = $(this).attr("data-code");
  var $info = $('.country-info[data-country="' + countryCode + '"]');
  var $fallback = $('.country-info.fallback');
  $(".country-info").fadeOut(300);
  if($info.get(0) !== undefined){
    $info.delay(400).fadeIn(300);
  }else{
    $fallback.delay(400).fadeIn(300);
  }
});

Funktioniert einwandfrei, ich danke euch beiden echt vielmals!
Den Rest werde ich sicher über die Maps-API hinkriege, danke :)
 
Das nächste mal darfst du den Code auch gerne bei JsFiddle (oder ähnlich) Posten dann kann man einfach nachschauen :)

Viel Erfolg noch dabei
 
Das hatte ich sogar vor, das Problem war dass ich den Code für die jVectorMap Karte nicht eingebettet gekriegt habe :d
Aber es funktioniert alles wie es soll, besten Dank :)
 
if ($info.length > 0) {
// fade in Info
} else {
// fade in fallback
}

[emoji106]
 
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh