【问题标题】:JqvMap onRegionClick (bootstrap) PopOver fires only clicking twiceJqvMap onRegionClick (bootstrap) PopOver 只触发两次点击
【发布时间】:2015-02-05 23:16:45
【问题描述】:

我正在使用 JqvMap,我想点击一个区域,这将提示一个以国家名称为标题的(引导)弹出窗口,内容应该是一些 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>

我目前的问题是我需要在地图上单击两次才能显示弹出窗口。我读了可能是因为它没有初始化,但我似乎无法初始化它(在哪里?如何?)!

有人可以帮我解决这些问题吗?我似乎无法弄清楚问题是什么..

【问题讨论】:

    标签: javascript jquery html twitter-bootstrap jqvmap


    【解决方案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 中输入的代码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-21
        • 1970-01-01
        • 2018-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多