JqvMap onRegionClick (bootstrap) Всплывающее окно срабатывает только при двойном нажатии

#javascript #jquery #html #twitter-bootstrap #jqvmap

#javascript #jquery — запрос #HTML #твиттер-bootstrap #карта jqvmap #jquery #twitter-bootstrap #jqvmap

Вопрос:

Я использую JqvMap и хочу щелкнуть по региону, и это вызовет всплывающее окно (bootstrap) с названием страны в качестве заголовка, а содержимое должно содержать несколько html-ссылок. Это мой код:

 <script type="text/javascript">
jQuery(document).ready(function() {
        jQuery('#vmap').vectorMap({
        map: 'world_en',
        backgroundColor: '#333333',
        color: '#ffffff',
        hoverOpacity: 0.7,
        selectedColor: '#666666',
        enableZoom: true,
        showTooltip: false,
        values: sample_data,
        scaleColors: ['#C8EEFF', '#006491'],
        normalizeFunction: 'polynomial',
        regionsSelectableOne: 'true',
        onRegionClick: function(element, code, region) {
            $(".popover-title").html(region);
            jQuery('.jvectormap-region').popover({
                placement: 'top',
                container: '#vmap',
                content: '<a href="#">page 1</a></br><a href="#">page 2</a></br><a href="#">page 3</a></br><a href="#">page 4</a></br>',
                trigger: 'click',
                html: 'true',
                title: ' '
            });
        },
        onRegionOver: function (event, code, region) {
            document.body.style.cursor = "pointer";
        },
        onRegionOut: function (element, code, region) {
            document.body.style.cursor = "default";
            $('.jvectormap-region').popover('destroy');
            // $('#vmap').vectorMap('deselect', code);
        }
    });
});
</script>
  

Моя проблема на данный момент заключается в том, что мне нужно дважды щелкнуть по карте, чтобы отобразить всплывающее окно. Я читал, что это может быть связано с тем, что оно не инициализировано, но, похоже, я не могу его инициализировать (где? как?)!

Кто-нибудь может помочь мне с этими проблемами? Кажется, я не могу понять, в чем проблема..

Ответ №1:

Итак, я вроде как исправил это (возможно, неприятным образом, но это делает свое дело). Надеюсь, это поможет кому-то еще.

 <script type="text/javascript">
jQuery(document).ready(function() {
    jQuery('#vmap').vectorMap({
        map: 'world_en',
        backgroundColor: '#333333',
        color: '#ffffff',
        hoverOpacity: 0.7,
        selectedColor: '#666666',
        enableZoom: true,
        showTooltip: false,
        values: sample_data,
        scaleColors: ['#C8EEFF', '#006491'],
        normalizeFunction: 'polynomial',
        regionsSelectableOne: true,
    });
    runPopOver();
});
</script>

<script type="text/javascript">
function runPopOver() {
    var currentRegion;
    jQuery('#vmap').bind('regionMouseOver.jqvmap',
        function(event, code, region) {
            document.body.style.cursor = "pointer";
            currentRegion = region;
        }
    );
    jQuery('#vmap').bind('regionMouseOut.jqvmap',
        function(event, code, region) {
            document.body.style.cursor = "default";
        }
    );
    jQuery('#vmap').bind('regionClick.jqvmap',
        function(event, code, region) {
            if ($('#vmap [id^="popover"]').length > 1) {
                $('#vmap [id^="popover"]').first().remove();
            }
            var snapshot_url = "http://www.business-anti-corruption.com/country-profiles/europe-central-asia/"   region   "/snapshot.aspx";

            $(".popover-title").html(region);
            $(".popover-content").html('<a href='   snapshot_url   ' target="_blank">Snapshot</a></br><a href="#">page 2</a></br><a href="#">page 3</a></br><a href="#">page 4</a></br>');
        }
    );

    jQuery('.jvectormap-region').popover({
        placement: 'left',
        container: '#vmap',
        html: 'true',
        title: ' '
    });
}
</script>
  

Итак, в основном, когда я нажимаю на регион, если есть более 1 всплывающего окна (даже для открытия) Я получаю список всех всплывающих окон (2), беру первое и удаляю его из DOM (.first().remove()).

Ответ №2:

Вот более постоянное исправление:

в jquery.vmap.js найдите этот фрагмент кода:

   jQuery(params.container).delegate(this.canvas.mode == 'svg' ? 'path' : 'shape', 'click', function (e) {
  if (!params.multiSelectRegion) {
    for (var key in mapData.pathes) {
      map.countries[key].currentFillColor = map.countries[key].getOriginalFill();
      map.countries[key].setFill(map.countries[key].getOriginalFill());
    }
  }

  var path = e.target;
  var code = e.target.id.split('_').pop();

  jQuery(params.container).trigger('regionClick.jqvmap', [code, mapData.pathes[code].name]);
  if (!regionClickEvent.isDefaultPrevented()) {
    if (map.selectedRegions.indexOf(code) !== -1) {
      map.deselect(code, path);
    } else {
      map.select(code, path);
    }
  }

  //console.log(selectedRegions);

});
  

Замените его этим:

         jQuery(params.container).delegate(this.canvas.mode == 'svg' ? 'path' : 'shape', 'mousedown mouseup', function (e) {

            var PageCoords;
            if (e.type == 'mousedown') {
                pageCoords = event.pageX   "."   event.pageY;
            }
            if (e.type == 'mouseup') {
                var pageCoords2 = event.pageX   "."   event.pageY;

                if (pageCoords == pageCoords2) {

                    //we have a click. Do the ClickEvent
                    if (!params.multiSelectRegion) {
                        for (var key in mapData.pathes) {
                            map.countries[key].currentFillColor = map.countries[key].getOriginalFill();
                            map.countries[key].setFill(map.countries[key].getOriginalFill());
                        }
                    }

                    var path = e.target;
                    var code = e.target.id.split('_').pop();

                    regionClickEvent = $.Event('regionClick.jqvmap');

                    jQuery(params.container).trigger('regionClick.jqvmap', [code, mapData.pathes[code].name]);

                    if (!regionClickEvent.isDefaultPrevented()) {
                        if (map.selectedRegions.indexOf(code) !== -1) {
                            map.deselect(code, path);
                        } else {
                            map.select(code, path);
                        }
                    }
                } 

            }
  

Вместо немедленного запуска щелчка, скрипт теперь проверяет, является ли это щелчком или перетаскиванием. Если это щелчок, он запускает код, который вы ввели в наш onRegionClick.