Search code examples
javascripthtmlcartodbbootstrap-slider

Why doesn't Bootstrap Slider work with Carto map?


I've edited the attributes for Bootstrap Slider as below:

<!DOCTYPE html>
<html>
  <head>
  <title>Slider</title>
  <script LANGUAGE="JavaScript" src="jquery.min.js" type="text/javascript"></script>
  <script LANGUAGE="JavaScript" src="bootstrap-slider.js" type="text/javascript"></script>
  <script type="text/javascript" src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
  <style>
    html,
    body,
    #Myslider {
      position: absolute;
      left: 500px;
    }

    #Myslider.slider-selection,
    #Myslider.slider-track-low {
        background-color: black;
    }
  </style>
  <link rel="stylesheet" href="http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css" />

  <link rel="stylesheet" type="text/css" href="bootstrap-slider.css">
  <link rel="stylesheet" type="text/css" href="bootstrap.min.css">
  </head>
  <body>
    <p align="center" id="demo">Start Sliding !</p>
    <input id="Myslider" data-provide="slider" data-slider-min="1" data-slider-max="12" data-slider-step="1" data-slider-value="1" data-slider-selection="after" />
    <script>
    function main() {
      $('#Myslider').slider();
      $("#Myslider").on("slide", function(slideEvt) {
        $("#SliderVal").text(slideEvt.value);
        if ($('#Myslider').val() == 1) {
          document.getElementById("demo").innerHTML = "Genel endeks";
        }
        if ($('#Myslider').val() == 2) {
          document.getElementById("demo").innerHTML = "Konut";
        }
        if ($('#Myslider').val() == 3) {
          document.getElementById("demo").innerHTML = "Çalışma hayatı";
        }
        if ($('#Myslider').val() == 4) {
          document.getElementById("demo").innerHTML = "Gelir ve servet";
        }
        if ($('#Myslider').val() == 5) {
          document.getElementById("demo").innerHTML = "Sağlık";
        }
        if ($('#Myslider').val() == 6) {
          document.getElementById("demo").innerHTML = "Eğitim";
        }
        if ($('#Myslider').val() == 7) {
          document.getElementById("demo").innerHTML = "Çevre";
        }
        if ($('#Myslider').val() == 8) {
          document.getElementById("demo").innerHTML = "Güvenlik";
        }
        if ($('#Myslider').val() == 9) {
          document.getElementById("demo").innerHTML = "Sivil katılım";
        }
        if ($('#Myslider').val() == 10) {
          document.getElementById("demo").innerHTML = "Altyapı hizmetlerine erişim";
        }
        if ($('#Myslider').val() == 11) {
          document.getElementById("demo").innerHTML = "Sosyal yaşam";
        }
        if ($('#Myslider').val() == 12) {
          document.getElementById("demo").innerHTML = "Yaşam memnuniyeti";
        }
      });
   }
   window.onload = main;
   </script>
  </body>
</html>

You can also check this code on JSFiddle.

Then I've created a map on carto and tried to add this slider on this HTML page ;

<!DOCTYPE html>
<html>
  <head>
  <title>Living Index</title>
  <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
  <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
  <meta name="author" content="capanh">
  <link rel="shortcut icon" href="http://cartodb.com/assets/favicon.ico" />
  <script LANGUAGE="JavaScript" src="jquery.min.js" type="text/javascript"></script>
  <script LANGUAGE="JavaScript" src="bootstrap-slider.js" type="text/javascript"></script>
  <script type="text/javascript" src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
  <style>
    html,
    body,
    #map {
        height: 600px;
        width: 1900px;
        left: 0px;
        padding: 0;
        margin: 0;
    }

    #Myslider {
        position: absolute;
        left: 850px;
    }

    #Myslider.slider-selection,
    #Myslider.slider-track-low {
        background-color: black;
    }
  </style>
  <link rel="stylesheet" href="http://libs.cartocdn.com/cartodb.js/v3/themes/css/cartodb.css" />
  <link rel="stylesheet" href="http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css" />
  <!--[if lte IE 8]>
  <link rel="stylesheet" href="http://libs.cartocdn.com/cartodb.js/v2/themes/css/cartodb.ie.css" />
  <![endif]-->
  <link rel="stylesheet" type="text/css" href="bootstrap-slider.css">
  <link rel="stylesheet" type="text/css" href="bootstrap.min.css">
  </head>
  <body>
    <div id="map"></div>
    <div id="legend"></div>
    <p align="center" id="demo">Kaydirmaya Basla !</p>
    <input id="Myslider" data-provide="slider" data-slider-min="1" data-slider-max="12" data-slider-step="1" data-slider-value="1" data-slider-selection="after" />
    <!-- include cartodb.js library -->
    <script src="http://libs.cartocdn.com/cartodb.js/v3/cartodb.js"></script>
    <script src="http://code.jquery.com/ui/1.10.3/jquery-ui.js"></script>
    <script>
    function main() {
      var map = new L.Map('map', {
        zoomControl: false,
        center: [38.9765, 35.3320],
        zoom: 5
      });
      L.tileLayer('https://stamen-tiles-{s}.a.ssl.fastly.net/watercolor/{z}/{x}/{y}.jpg', {
        attribution: 'CartoDB · OSM data'}).addTo(map);
      cartodb.createLayer(map, 'https://capanh.carto.com/api/v2/viz/94dd9018-e918-11e6-a6cf-0ef7f98ade21/viz.json', {
        legends: true
      }).addTo(map);
      $('#Myslider').slider();
      $("#Myslider").on("slide", function(slideEvt) {
        $("#SliderVal").text(slideEvt.value);
        if ($('#Myslider').val() == 1) {
          document.getElementById("demo").innerHTML = "Genel endeks";
        }
        if ($('#Myslider').val() == 2) {
          document.getElementById("demo").innerHTML = "Konut";
        }
        if ($('#Myslider').val() == 3) {
          document.getElementById("demo").innerHTML = "Çalışma hayatı";
        }
        if ($('#Myslider').val() == 4) {
          document.getElementById("demo").innerHTML = "Gelir ve servet";
        }
        if ($('#Myslider').val() == 5) {
          document.getElementById("demo").innerHTML = "Sağlık";
        }
        if ($('#Myslider').val() == 6) {
          document.getElementById("demo").innerHTML = "Eğitim";
        }
        if ($('#Myslider').val() == 7) {
          document.getElementById("demo").innerHTML = "Çevre";
        }
        if ($('#Myslider').val() == 8) {
          document.getElementById("demo").innerHTML = "Güvenlik";
        }
        if ($('#Myslider').val() == 9) {
          document.getElementById("demo").innerHTML = "Sivil katılım";
        }
        if ($('#Myslider').val() == 10) {
          document.getElementById("demo").innerHTML = "Altyapı hizmetlerine erişim";
        }
        if ($('#Myslider').val() == 11) {
          document.getElementById("demo").innerHTML = "Sosyal yaşam";
        }
        if ($('#Myslider').val() == 12) {
          document.getElementById("demo").innerHTML = "Yaşam memnuniyeti";
        }
      });
    }
    window.onload = main;
    </script>
  </body>
</html>

The final result is a text box instead of a slider. First I thought it was a reference error. But the slider works with the same references when it is alone as you can see in the first code block. Why doesn't it work when I add a map to the file? Does anyone have seen something like this?


Solution

  • I've mailed Carto and they've kindly answered my question. The problem in my code is a library conflict. As you can see I'm including a js file called jquery-ui ;

    <script src="http://code.jquery.com/ui/1.10.3/jquery-ui.js"></script>
    

    But this is not necessary ! When I removed this line of code and slider worked ! Also I've created a new div to contain both text and slider objects. Add the libraries to same folder and you can use Bootstrap Slider with a Carto map. Finally the working code looks like this ;

    <!DOCTYPE html>
    <html>
       <head>
    <title>Living Index</title>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
    <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
    <meta name="author" content="capanh">
    <link rel="shortcut icon" href="http://cartodb.com/assets/favicon.ico" />
    
    <script LANGUAGE="JavaScript" src="jquery.min.js" type="text/javascript"></script>
    <script LANGUAGE="JavaScript" src="bootstrap-slider.js" type="text/javascript"></script>
    <script src="http://libs.cartocdn.com/cartodb.js/v3/3.15/cartodb.js"></script>
    <script type="text/javascript" src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
    
    
    <style>
        html,
        body,
        #map {
            height: 600px;
            width: 1900px;
            left: 0px;
        top : 40px;
            padding: 0;
            margin: 0;
        }
    
        #Myslider {
            position: relative;
        }
    
        #Myslider.slider-selection,
        #Myslider.slider-track-low {
            background-color: black;
        }
    </style>
    
    <link rel="stylesheet" href="http://libs.cartocdn.com/cartodb.js/v3/3.15/themes/css/cartodb.css" />
    <link rel="stylesheet" href="http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css" />
    <!--[if lte IE 8]>
    <link rel="stylesheet" href="http://libs.cartocdn.com/cartodb.js/v2/themes/css/cartodb.ie.css" />
    <![endif]-->
    <link rel="stylesheet" type="text/css" href="bootstrap-slider.css">
    <link rel="stylesheet" type="text/css" href="bootstrap.min.css">
    
    </head>
    
    <body>
       <!-- include cartodb.js library -->
    <div id='slider_container' align="center">
      <p id="demo">Start Sliding !</p>
      <input id="Myslider" data-provide="slider" data-slider-min="1" data-slider-max="12" data-slider-step="1" data-slider-value="1" data-slider-selection="after" />
    </div>
    <div id='map'></div> 
    
    
    
    <script>  
    
           function main() {
    
            var map = new L.Map('map', {
                zoomControl: false,
                center: [38.9765, 35.3320],
                zoom: 5
            });
    
            L.tileLayer('https://stamen-tiles-{s}.a.ssl.fastly.net/watercolor/{z}/{x}/{y}.jpg', {
                attribution: 'CartoDB · OSM data'
            }).addTo(map);
    
            cartodb.createLayer(map, 'https://capanh.carto.com/api/v2/viz/94dd9018-e918-11e6-a6cf-0ef7f98ade21/viz.json', {
                    legends: true
                })
                .addTo(map);
    
            $('#Myslider').slider();
            $("#Myslider").on("slide", function(slideEvt) {
                $("#SliderVal").text(slideEvt.value);
                if ($('#Myslider').val() == 1) {
                    document.getElementById("demo").innerHTML = "Genel endeks";
                }
                if ($('#Myslider').val() == 2) {
                    document.getElementById("demo").innerHTML = "Konut";
                }
                if ($('#Myslider').val() == 3) {
                    document.getElementById("demo").innerHTML = "Çalışma hayatı";
                }
                if ($('#Myslider').val() == 4) {
                    document.getElementById("demo").innerHTML = "Gelir ve servet";
                }
                if ($('#Myslider').val() == 5) {
                    document.getElementById("demo").innerHTML = "Sağlık";
                }
                if ($('#Myslider').val() == 6) {
                    document.getElementById("demo").innerHTML = "Eğitim";
                }
                if ($('#Myslider').val() == 7) {
                    document.getElementById("demo").innerHTML = "Çevre";
                }
                if ($('#Myslider').val() == 8) {
                    document.getElementById("demo").innerHTML = "Güvenlik";
                }
                if ($('#Myslider').val() == 9) {
                    document.getElementById("demo").innerHTML = "Sivil katılım";
                }
                if ($('#Myslider').val() == 10) {
                    document.getElementById("demo").innerHTML = "Altyapı hizmetlerine erişim";
                }
                if ($('#Myslider').val() == 11) {
                    document.getElementById("demo").innerHTML = "Sosyal yaşam";
                }
                if ($('#Myslider').val() == 12) {
                    document.getElementById("demo").innerHTML = "Yaşam memnuniyeti";
                }
            });
    
        }
        window.onload = main;
    </script>