繁体   English   中英

在没有jQuery的情况下切换Google Maps标记

[英]Toggling google maps markers without jQuery

我正在使用Google Maps API v.3从XML文件显示位置标记和有关位置的信息,该XML文件是在从MySQL数据库加载页面时构建的(mysql-> xml-> Google Maps API)。

我需要知道的是如何根据我的复选框的ID是否与该行上定义的变量的值匹配来打开/关闭标记

var nom = markers[i].getAttribute("nom");

仅使用纯JavaScript而不使用jQuery。 这是我正在使用的完整脚本:

//main function
function load() {
  var map = new google.maps.Map(document.getElementById("map"), {
    center: new google.maps.LatLng(15.31,32.35),
    zoom: 2,
    mapTypeId: 'terrain',
    panControl: false,
    streetViewControl: false
  });
  var infoWindow = new google.maps.InfoWindow;

//calls a php script that builds the xml file from the database and prepares the map -- see below in the question
downloadUrl("phpToXML.php", function(data) {
    var xml = data.responseXML;
    var markers = xml.documentElement.getElementsByTagName("marker");
    for (var i = 0; i < markers.length; i++) {
      var nom = markers[i].getAttribute("nom");
      var lieu = markers[i].getAttribute("lieu");
      var date = markers[i].getAttribute("date");
      var dateFin = markers[i].getAttribute("dateFin");
      var descCas = markers[i].getAttribute("descCas");
      var type = markers[i].getAttribute("type");
      var point = new google.maps.LatLng(
          parseFloat(markers[i].getAttribute("lat")),
          parseFloat(markers[i].getAttribute("lng")));
      var html = "<strong>"  + nom + " > " + lieu + "</strong><br />" + date + " - " + dateFin + "<p>" + descCas + "</p>";
      var icon = customIcons[type] || {};
      var marker = new google.maps.Marker({
        map: map,
        position: point,
        icon: icon.icon
      });
      bindInfoWindow(marker, map, infoWindow, html);
    }
  });
}

function bindInfoWindow(marker, map, infoWindow, html) {
  google.maps.event.addListener(marker, 'click', function() {
    infoWindow.setContent(html);
    infoWindow.open(map, marker);
  });
}

function downloadUrl(url, callback) {
  var request = window.ActiveXObject ?
      new ActiveXObject('Microsoft.XMLHTTP') :
      new XMLHttpRequest;

  request.onreadystatechange = function() {
    if (request.readyState == 4) {
      request.onreadystatechange = doNothing;
      callback(request, request.status);
    }
  };

  request.open('GET', url, true);
  request.send(null);
}

function doNothing() {}

我想我必须创建一个数组来存储标记,并在循环内使用一个函数来遍历所有标记,并仅更改与与复选框ID匹配的变量NOM值关联的实例的可见性值。 问题很简单,就是我不知道该怎么做。

总结一下,这里是HTML的基本结构

<div id="selecteur">
<form id="selection" action="#">
<li><input type="checkbox" name="entreprises" id="NAME#1 SOME JS FUNCTION HAS TO BE CALLED HERE I GUESS></li>           
</form>
</div>

XML输出通常类似于:

<markers>
  <marker nom="Nestl&#xE9;" lieu="Colombie" date="1986" dateFin="2012" lat="4.115673" lng="-72.930130" type="victHu" victNHu="0" descCas="&lt;p&gt;Entre 1986 et 2009, 13 syndicalistes sont assassin&amp;eacute;s, dont, en 2009, Gustavo Gomez, suite &amp;agrave; une p&amp;eacute;tition du syndicat contre Nestl&amp;eacute; Purina Colombie et en 2007 Jos&amp;eacute; de Jesus Marin Vargas. De m&amp;ecirc;me en 2005, Gustavo Romero, de Nestl&amp;eacute; Cicolac, est assassin&amp;eacute; apr&amp;egrave;s avoir d&amp;eacute;couvert que Nestl&amp;eacute; utilise du lait p&amp;eacute;rim&amp;eacute; pour produire son fameux produit Milo.&lt;/p&gt;&#13;&#10;&lt;hr /&gt;&#13;&#10;&lt;p&gt;Nestl&amp;eacute; rejette toutes les accusations d'intimidation et de tout comportement anti-syndical. Il reviendrait aux filiales et aux autorit&amp;eacute;s locales de r&amp;eacute;soudre les questions de s&amp;eacute;curit&amp;eacute; et de conflit.&lt;/p&gt;&#13;&#10;&lt;hr /&gt;&#13;&#10;&lt;p&gt;Sources:&lt;/p&gt;&#13;&#10;&lt;ul&gt;&#13;&#10;&lt;li&gt;ALLIANCE SUD (2011)&lt;/li&gt;&#13;&#10;&lt;li&gt;MULTIWATCH (2011)&lt;/li&gt;&#13;&#10;&lt;li&gt;MULTIWATCH(2007)&lt;/li&gt;&#13;&#10;&lt;li&gt;ILRF (2006)&lt;/li&gt;&#13;&#10;&lt;li&gt;MULTIWATCH (2012b)&lt;/li&gt;&#13;&#10;&lt;li&gt;MULTIWATCH (2012)&lt;/li&gt;&#13;&#10;&lt;/ul&gt;"/>
  <marker nom="Nestl&#xE9;" lieu="Suisse" date="2003" dateFin="2008" lat="46.480400" lng="8.133600" type="victHu" victNHu="0" descCas="&lt;p&gt;Deux cas d'infiltration et d'espionnage du groupe altermondialiste Attac qui menait une enqu&amp;ecirc;te sur Nestl&amp;eacute; afin de publier un livre sur l'entreprise.&lt;/p&gt;&#13;&#10;&lt;hr /&gt;&#13;&#10;&lt;p&gt;L'organisation Attac, selon Peter Brabeck-Letmathe (PDG de Nestl&amp;eacute; entre 1997 et 2008), se montre violente et repr&amp;eacute;sente donc une menace r&amp;eacute;elle pour Nestl&amp;eacute;. La d&amp;eacute;marche n'avait, selon lui, rien d'illicite et fut men&amp;eacute;e &amp;agrave; titre pr&amp;eacute;ventif contre la menace potentielle d'une guerre id&amp;eacute;ologique men&amp;eacute;e par Attac contre Nestl&amp;eacute;.&lt;/p&gt;&#13;&#10;&lt;hr /&gt;&#13;&#10;&lt;p&gt;Sources:&lt;/p&gt;&#13;&#10;&lt;ul&gt;&#13;&#10;&lt;li&gt;ATTAC (2012)&lt;/li&gt;&#13;&#10;&lt;li&gt;MULTIWATCH (2010d)&lt;/li&gt;&#13;&#10;&lt;/ul&gt;"/>
  <!-- ... --?
</markers>
  1. 将所有标记放入一个数组中(我将其命名为gmarkers
  2. 添加“ nom”属性作为标记(gmarkers [i] .nom)的属性,更改:

      var marker = new google.maps.Marker({ map: map, position: point, icon: icon.icon }); 

至:

    var marker = new google.maps.Marker({
        nom: nom,
        map: map,
        position: point,
        icon: icon.icon
    });
  1. 创建一个函数以运行复选框的onclick,该函数将适当地显示或隐藏标记:

function displayNom(nom, checkbox) {
    var inputs = document.getElementsByTagName("input"); //or document.forms[0].elements;
    var cbs = []; //will contain all checkboxes
    var checkboxes = [];
    for (var i = 0; i < inputs.length; i++) {
        if (inputs[i].type == "checkbox") {
            cbs.push(inputs[i]);
            checkboxes[nodeValue(inputs[i].parentNode).trim()] = inputs[i];
        }
    }
    for (var i = 0; i < gmarkers.length; i++) {
        if (checkboxes[gmarkers[i].nom].checked) {
            if (gmarkers[i].getMap() === null) gmarkers[i].setMap(map);
        } else {
            if (gmarkers[i].getMap() != null) gmarkers[i].setMap(null);
        }
    }
}

html来调用上述代码:

<li><input type="checkbox" name="entreprises" id="NAME#1" onclick="displayNom('Nestl&#xE9;', this)" />Nestl&#xE9;</li>
<li><input type="checkbox" name="entreprises" id="NAME#2" onclick="displayNom('Novartis', this)" />Novartis</li>
<li><input type="checkbox" name="entreprises" id="NAME#2" onclick="displayNom('Vitol', this)" />Vitol</li>
<!-- etc. -->

工作提琴 (“代码段”中的代码过多)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM