Search code examples
javascriptarcgisinfowindowesriarcgis-js-api

InfoWindowLite not appearing


I am trying to implement an InfoWindowLite Javascript function on my map. However, everything else is working i.e. legend, scalebar, featurelayer. Below is the code for reference:

<!DOCTYPE html>
<html>
<head>
    <!-- add in meta elements -->
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no">
    <title>Map</title>
    <!-- reference styles -->
    <link rel="stylesheet" href="http://js.arcgis.com/3.9/js/esri/css/esri.css">
    <link rel="stylesheet" href="http://js.arcgis.com/3.9/js/dojo/dijit/themes/claro/claro.css">
    <!-- reference arcGIS javascript -->
    <script src="http://js.arcgis.com/3.9/"></script>
    <style>
        html, body {
            height: 97%;
            width: 98%;
            margin: 1%;
        }

        #rightPane {
            width: 20%;
        }

        #legendPane {
            border: solid #97DCF2 1px;
        }
    </style>
    <!-- javascript -->
    <script>
     var map;
     require([
     "esri/map", "esri/dijit/InfoWindowLite",
     "esri/InfoTemplate", "esri/layers/FeatureLayer", "esri/dijit/Legend",
     "dojo/_base/array", "dojo/parser", "esri/dijit/Scalebar",
     "dijit/layout/BorderContainer", "dijit/layout/ContentPane",
    "dijit/layout/AccordionContainer",  "dojo/dom-construct", "dojo/domReady!"
     ], function(
     Map, InfoWindowLite, InfoTemplate, FeatureLayer, Legend,
     arrayUtils, parser,  Scalebar, domConstruct
     ) {
     parser.parse();
     map = new Map("map", {
     basemap:"topo",
     center: [-98.416, 39.781],
     zoom: 6
     });

      // scalebar
      var scalebar = new Scalebar({
          map: map,
          // "dual" displays both miles and kilmometers
          // "english" is the default, which displays miles
          // use "metric" for kilometers
          scalebarUnit: "dual", attachTo:"bottom-center"

        });

     // feature layer
    var featureLayer = new
     FeatureLayer("http://sampleserver6.arcgisonline.com/arcgis/rest/services/Census/MapServer/3", {
     mode: FeatureLayer.MODE_ONDEMAND,
     outFields:["STATE_NAME", "SUB_REGION", "STATE_ABBR"]
     });
     map.addLayer(featureLayer);


     //add the legend
     map.on("layers-add-result", function (evt) {
     var layerInfo = arrayUtils.map(evt.layers, function (layer, index) {
     return {layer:layer.layer, title:layer.layer.name};
     });
     if (layerInfo.length > 0) {
     var legendDijit = new Legend({
     map: map,
     layerInfos: layerInfo
     }, "legendDiv");
     legendDijit.startup();
     }
     });
     map.addLayers([featureLayer]);


     var legendFeature = new
    FeatureLayer("http://www.onemap.sg/ArcGIS/rest/services/TOC/MapServer/6", {
     mode: FeatureLayer.MODE_ONDEMAND,
     outFields:["*"]
     });

     // infoWindow
     var infoWindow = new InfoWindowLite(null, domConstruct.create("div", null, null,
    map.root));
     infoWindow.startup();
     map.setInfoWindow(infoWindow);
     var template = new InfoTemplate();
    template.setTitle("<b>State name ${STATE_NAME} - State abbr ${STATE_ABBR}</b>");
    template.setContent("${SUB_REGION} is in district ${STATE_NAME}.");

    map.infoWindow.resize(200,75);
     });

      function init() {
     dojo.connect(map,"onLoad", function(map) {map.infoWindow.resize(200, 90);} );
     dojo.connect(map, "onClick", addPoint);
     }
     function addPoint(evt) {
     map.infoWindow.setTitle("Coordinates");
     map.infoWindow.setContent("lat/lon : " + evt.mapPoint.y + ", " + evt.mapPoint.x);
     map.infoWindow.show(evt.screenPoint,map.getInfoWindowAnchor(evt.screenPoint));
     }
     dojo.addOnLoad(init);
    </script>

</head>

<body class="claro">
    <div id="content" data-dojo-type="dijit/layout/BorderContainer" data-dojo-props="design:'headline', gutters:true" style="width: 100%; height: 100%; margin: 0;">
        <div id="rightPane" data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region:'right'">
            <div data-dojo-type="dijit/layout/AccordionContainer">
                <div data-dojo-type="dijit/layout/ContentPane" id="legendPane" data-dojo-props="title:'Legend', selected:true">
                    <div id="legendDiv"></div>
                </div>
                <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="title:'Pane 2'">
                    This pane could contain tools or additional content
                </div>
            </div>
        </div>
        <div id="map" data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region:'center'" style="overflow:hidden;">

        </div>

    </div>
</body>
</html>

I was thinking maybe the sequence in which the codes are placed is the reason why it isn't appearing. But when I move the codes under //infoWindow before the other functions like //legend etc., the other functions will not be displayed when I run it in chrome.


Solution

  • Well, I found some small faults in above snippet code. Below are the details.

    you forget to add "BorderContainer, ContentPane, AccordionContainer," before domConstruct.

    Below is the working code:

    <!DOCTYPE html>
    <html>
    <head>
        <!-- add in meta elements -->
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no">
        <title>Map</title>
        <!-- reference styles -->
        <link rel="stylesheet" href="http://js.arcgis.com/3.9/js/esri/css/esri.css">
        <link rel="stylesheet" href="http://js.arcgis.com/3.9/js/dojo/dijit/themes/claro/claro.css">
        <!-- reference arcGIS javascript -->
        <script src="http://js.arcgis.com/3.9/"></script>
        <style>
            html, body {
                height: 97%;
                width: 98%;
                margin: 1%;
            }
    
            #rightPane {
                width: 20%;
            }
    
            #legendPane {
                border: solid #97DCF2 1px;
            }
        </style>
        <!-- javascript -->
        <script>
         var map;
         require([
         "esri/map", "esri/dijit/InfoWindowLite",
         "esri/InfoTemplate", "esri/layers/FeatureLayer", "esri/dijit/Legend",
         "dojo/_base/array", "dojo/parser", "esri/dijit/Scalebar",
         "dijit/layout/BorderContainer", "dijit/layout/ContentPane",
        "dijit/layout/AccordionContainer",  "dojo/dom-construct", "dojo/domReady!"
         ], function(
         Map, InfoWindowLite, InfoTemplate, FeatureLayer, Legend,
         arrayUtils, parser,  Scalebar, BorderContainer, ContentPane, AccordionContainer,  domConstruct
         ) {
         parser.parse();
         map = new Map("map", {
         basemap:"topo",
         center: [-98.416, 39.781],
         zoom: 6
         });
    
          // scalebar
          var scalebar = new Scalebar({
              map: map,
              // "dual" displays both miles and kilmometers
              // "english" is the default, which displays miles
              // use "metric" for kilometers
              scalebarUnit: "dual", attachTo:"bottom-center"
    
            });
    
         // feature layer
        var featureLayer = new
         FeatureLayer("http://sampleserver6.arcgisonline.com/arcgis/rest/services/Census/MapServer/3", {
         mode: FeatureLayer.MODE_ONDEMAND,
         outFields:["STATE_NAME", "SUB_REGION", "STATE_ABBR"]
         });
         map.addLayer(featureLayer);
    
    
         //add the legend
         map.on("layers-add-result", function (evt) {
         var layerInfo = arrayUtils.map(evt.layers, function (layer, index) {
         return {layer:layer.layer, title:layer.layer.name};
         });
         if (layerInfo.length > 0) {
         var legendDijit = new Legend({
         map: map,
         layerInfos: layerInfo
         }, "legendDiv");
         legendDijit.startup();
         }
         });
         map.addLayers([featureLayer]);
    
    
         var legendFeature = new
        FeatureLayer("http://www.onemap.sg/ArcGIS/rest/services/TOC/MapServer/6", {
         mode: FeatureLayer.MODE_ONDEMAND,
         outFields:["*"]
         });
    
         // infoWindow
         var infoWindow = new InfoWindowLite(null, domConstruct.create("div", null, null,
        map.root));
         infoWindow.startup();
         map.setInfoWindow(infoWindow);
         var template = new InfoTemplate();
        template.setTitle("<b>State name ${STATE_NAME} - State abbr ${STATE_ABBR}</b>");
        template.setContent("${SUB_REGION} is in district ${STATE_NAME}.");
    
        map.infoWindow.resize(200,75);
         });
    
          function init() {
         dojo.connect(map,"onLoad", function(map) {map.infoWindow.resize(200, 90);} );
         dojo.connect(map, "onClick", addPoint);
         }
         function addPoint(evt) {
         map.infoWindow.setTitle("Coordinates");
         map.infoWindow.setContent("lat/lon : " + evt.mapPoint.y + ", " + evt.mapPoint.x);
         map.infoWindow.show(evt.screenPoint,map.getInfoWindowAnchor(evt.screenPoint));
         }
         dojo.addOnLoad(init);
        </script>
    
    </head>
    
    <body class="claro">
        <div id="content" data-dojo-type="dijit/layout/BorderContainer" data-dojo-props="design:'headline', gutters:true" style="width: 100%; height: 100%; margin: 0;">
            <div id="rightPane" data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region:'right'">
                <div data-dojo-type="dijit/layout/AccordionContainer">
                    <div data-dojo-type="dijit/layout/ContentPane" id="legendPane" data-dojo-props="title:'Legend', selected:true">
                        <div id="legendDiv"></div>
                    </div>
                    <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="title:'Pane 2'">
                        This pane could contain tools or additional content
                    </div>
                </div>
            </div>
            <div id="map" data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region:'center'" style="overflow:hidden;">
    
            </div>
    
        </div>
    </body>
    </html>
    

    This will show you infopopup whenever you will click on the map.

    Hope this will help you :)