Select to view content in your preferred language

4.0 Beta 2 Home Button strange behavior

4506
20
Jump to solution
11-25-2015 08:56 AM
DavidChrest
Deactivated User

The Home widget was added in 4.0 Beta 2. It's dead simple to add and the provided example code is a simple, minimal page of just a Scene and the Home Button. However, when I add the Home Button widget to my page which utilizes some other widgets (not sure if this has anything to do with it) my map view literally pans down and zooms in a bit on a nonstop repeating loop right on startup. Has anybody else seen this? Looks like some kind of Beta 2 bug.

David

20 Replies
MikeCrook
Regular Contributor

I just zoomed in on the map and clicked then Home Button. Nothing is being logged to the console. Sorry I cant be more helpful.

0 Kudos
DavidChrest
Deactivated User

I get a warning that says this:

"js.arcgis.com/4.0beta2/init.js:823 Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check http://xhr.spec.whatwg.org/."

0 Kudos
DavidChrest
Deactivated User

Although, the same message appears on my other Beta 2 pages that work fine and do not have the Home Button so this really doesn't mean much in this case.

0 Kudos
YueWu1
by Esri Regular Contributor
Esri Regular Contributor

Hi David,

the issue is you didn't declare the body css well enough, missing a comma after body {}

you missing #viewDiv, and #homediv

I based on your code and tweak this two thing and it works normal now.

Hope this can help.

body{ 

  padding: 0; 

  margin: 0; 

  },

  #viewDiv {

      padding: 0;

      margin: 0;

      height: 100%;

    }

 

  #homediv { 

  position: absolute; 

  top: 120px; 

  left: 10px; 

  z-index: 50; 

  } 

DavidChrest
Deactivated User

This still does not work and am getting the same strange behavior. I had already had the "#homediv" in my CSS but did add the comma after body{} and added the "#viewDiv" but am still getting the repeated pan, zoom loop. The home button does not even appear on my page as well. See my code below. Would it be possible another widget is interfering?

<!DOCTYPE html>
<html>


<head>
  <meta charset="utf-8">
  <meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no">
  <title>Day 1 3D</title>
  <style>
  html,
  body {
  padding: 0;
  margin: 0;
  },

  #viewDiv {
  padding: 0;
  margin: 0;
  height: 100%;
  }

  #searchDiv {
  position: absolute;
  z-index: 20;
  top: 15px;
  left: 65px;
  }

  #buttonsDiv {
  position: absolute;
  top: 12px;
  right: 12px;
  padding: 12px;
  background-color: rgba(200, 200, 200, 0.5);
  border: 1px solid black;
  }

  #indicatorSpan {
  display: inline-block;
  vertical-align: middle;
  width: 30px;
  height: 30px;
  background-color: rgba(100, 100, 100, 0.8);
  border: 2px solid #ccc;
  }

  #environmentDiv {
  position: absolute;
  top: 12px;
  right: 140px;
  padding: 2px;
  background-color: rgba(0, 0, 0, 0.5);
  color: white;
  }

  #BasemapToggleDiv {
  position: absolute;
  top: 78px;
  right: 12px;

  #homediv {
  position: absolute;
  top: 120px;
  left: 10px;
  z-index: 50;
  }

  </style>


  <link rel="stylesheet" href="https://js.arcgis.com/4.0beta2/dijit/themes/claro/claro.css">
  <link rel="stylesheet" href="https://js.arcgis.com/4.0beta2/esri/css/main.css">
  <script src="https://js.arcgis.com/4.0beta2/"></script>


  <script>
  var map, view;


  require([
  "esri/Map",
  "esri/Color",
  "esri/widgets/Home",


  "esri/layers/GraphicsLayer",
  "esri/Graphic",
  "esri/geometry/Point",
  "esri/geometry/Polyline",
  "esri/geometry/Polygon",


  "esri/symbols/SimpleMarkerSymbol",
  "esri/symbols/SimpleLineSymbol",
  "esri/symbols/SimpleFillSymbol",


  "esri/PopupTemplate",
  "esri/views/SceneView",
  "esri/widgets/BasemapToggle",
  "esri/widgets/Search",
  "esri/layers/FeatureLayer",
  "esri/symbols/PolygonSymbol3D",
  "esri/symbols/ExtrudeSymbol3DLayer",
  "esri/renderers/SimpleRenderer",
  "esri/symbols/PointSymbol3D",
  "esri/symbols/ObjectSymbol3DLayer",
  "dojo/on",
  "dojo/dom",
  "dojo/domReady!"
            ],


  function (Map, Color, Home, GraphicsLayer, Graphic, Point, Polyline, Polygon, SimpleMarkerSymbol, SimpleLineSymbol, SimpleFillSymbol, PopupTemplate, SceneView, BasemapToggle, Search, FeatureLayer, PolygonSymbol3D, ExtrudeSymbol3DLayer, SimpleRenderer, PointSymbol3D, ObjectSymbol3DLayer, on, dom) {


  var objectSymbol, objectSymbolRenderer, day1Activities;


  //Create Map
  map = new Map({
  basemap: "topo"
  });




  //Create SceneView and set viewpoint
  view = new SceneView({
  container: "viewDiv",
  map: map,
  scale: 15000,
  center: [-77.009, 38.889]
  })

  var homeBtn = new Home({
  view: view
  }, "homediv");
  homeBtn.startup();


  //<<<ENVIRONMENT - SHADOWS>>>
  //Set the environment in SceneView
  view.environment = {
  lighting: {
  directShadows: true,
  date: new Date("Sun Mar 15 2015 09:00:00 GMT-0500 (EST)")
  }
  };


  //Register the events to controls
  on(dom.byId("timeOfDaySelect"), "change", updateTimeOfDay);
  on(dom.byId("directShadowsInput"), "change", updateDirectShadows);


  //Create the event's callback functions
  function updateTimeOfDay(ev) {
  var select = ev.target;
  var date = select.options[select.selectedIndex].value;
  view.environment.lighting.date = new Date(date);
  }


  function updateDirectShadows(ev) {
  view.environment.lighting.directShadows = !!ev.target.checked;
  }
  //<<<ENVIRONMENT - SHADOWS>>>




  //<<<DAY 1 ACTIVITIES>>>
  //Create objectSymbol for Day 1 Activities and add to renderer
  objectSymbol = new PointSymbol3D({
  symbolLayers: [new ObjectSymbol3DLayer({
  width: 15,
  height: 15,
  anchor: "bottom",
  resource: {
  primitive: "sphere"
  },
  material: {
  color: "purple"
  }
  })]
  });
  objectSymbolRenderer = new SimpleRenderer({
  symbol: objectSymbol
  });


  //Create the Day 1 Activities PopupTemplate
  var template = new PopupTemplate({
  title: "D.C. Day 1 GPS Readings", //description is the text in the popup. {fieldName} can be used to reference the value of the selected feature
  content: "<b> Date: {Day1Date} </b>" +
  "<br><b>Time:</b> {TimeofDay}" +
  "<br><b>Latitude:</b> {Latitude}" +
  "<br><b>Longitude:</b> {Longitude}"
  });


  //Request Day 1 Activities featureLayer and overwrite renderer
  day1Activities = new FeatureLayer({
  url: "http://sushi:6080/arcgis/rest/services/DavidC/MovesDCDay1/MapServer/2",
  outFields: ["*"],
  popupTemplate: template,
  renderer: objectSymbolRenderer,
  //Ensure that all features are shown at all scales
  maxScale: 0,
  minScale: 0
  });
  map.add(day1Activities);


  day1Activities.renderer = objectSymbolRenderer;




  //<<<STARBUCKS>>>
  //Create objectSymbol for Starbucks and add to renderer
  objectSymbolSB = new PointSymbol3D({
  symbolLayers: [new ObjectSymbol3DLayer({
  width: 15,
  height: 50,
  anchor: "bottom",
  resource: {
  primitive: "cylinder"
  },
  material: {
  color: ([115, 0, 0, 0.5])
  }
  })]
  });
  objectSymbolSBRenderer = new SimpleRenderer({
  symbol: objectSymbolSB
  });


  //Create the Starbucks PopupTemplate
  var templateSB = new PopupTemplate({
  title: "Starbucks  {Name}", //description is the text in the popup. {fieldName} can be used to reference the value of the selected feature
  content: "<b>Store Number: {Store_Number}</b>" +
  "<br><b>Name:</b> {Name}" +
  "<br><b>Ownership:</b> {Ownership_Type}" +
  "<br><b>Products:</b> {Features_Products}" +
  "<br><b>Services:</b> {Features_Service}" +
  "<br><b>Phone:</b> {Phone}" +
  "<br><b>Address:</b> {Street_Address}" +
  "<br><b>City:</b> {City}" +
  "<br><b>State:</b> {State}" +
  "<br><b>Zip:</b> {Zip}" +
  "<br><b>Latitude:</b> {Latitude}" +
  "<br><b>Longitude:</b> {Longitude}"
  });


  //Request Starbucks featureLayer and overwrite renderer
  starbucks = new FeatureLayer({
  url: "http://sushi:6080/arcgis/rest/services/DavidC/MovesDCSBFF/MapServer/0",
  outFields: ["*"],
  popupTemplate: templateSB,
  renderer: objectSymbolSBRenderer,
  //Ensure that all features are shown at all scales
  maxScale: 0,
  minScale: 0
  });
  map.add(starbucks);


  starbucks.renderer = objectSymbolSBRenderer;




  //<<<FAST FOOD>>>
  //Create objectSymbol for Starbucks and add to renderer
  objectSymbolFF = new PointSymbol3D({
  symbolLayers: [new ObjectSymbol3DLayer({
  width: 15,
  height: 50,
  anchor: "bottom",
  resource: {
  primitive: "diamond"
  },
  material: {
  color: ([0, 0, 254, 0.5])
  }
  })]
  });
  objectSymbolFFRenderer = new SimpleRenderer({
  symbol: objectSymbolFF
  });


  //Create the Fast Food PopupTemplate
  var templateFF = new PopupTemplate({
  title: "Fast Food: {CONAME}", //description is the text in the popup. {fieldName} can be used to reference the value of the selected feature
  content: "<b>Location: {ADDR}</b>" +
  "<br><b>City:</b> {CITY}" +
  "<br><b>State:</b> {STATE}" +
  "<br><b>Zip:</b> {ZIP}" +
  "<br><b>Phone:</b> {PHONE}" +
  "<br><b>NAICS Code:</b> {NAICS}" +
  "<br><b>SIC Code:</b> {SIC}" +
  "<br><b>Year Started:</b> {YRSTARTED}" +
  "<br><b>Latitude:</b> {Latitude}" +
  "<br><b>Longitude:</b> {Longitude}"
  });




  //Request Fast Food featureLayer and overwrite renderer
  fastfood = new FeatureLayer({
  url: "http://sushi:6080/arcgis/rest/services/DavidC/MovesDCSBFF/MapServer/1",
  outFields: ["*"],
  popupTemplate: templateFF,
  renderer: objectSymbolFFRenderer,
  //Ensure that all features are shown at all scales
  maxScale: 0,
  minScale: 0
  });
  map.add(fastfood);


  fastfood.renderer = objectSymbolFFRenderer;




  //Create Buildings featureLayer and add to the map
  var buildings3D = new FeatureLayer({
  url: "http://sushi:6080/arcgis/rest/services/DavidC/MovesDCTransit/MapServer/4"
  });
  map.add(buildings3D);


  //Create the Renderer for the buildings,
  var extrudePolygonRenderer = new SimpleRenderer({
  symbol: new PolygonSymbol3D({
  symbolLayers: [new ExtrudeSymbol3DLayer()]
  }),
  visualVariables: [{
  type: "sizeInfo",
  field: "Stories",
  minSize: 30,
  maxSize: 30,
  minDataValue: 8,
  maxDataValue: 8
                    }, {
  type: "colorInfo",
  colors: [
  new Color([190, 210, 255, 0.75])
             ]
            }]
  });


  buildings3D.renderer = extrudePolygonRenderer;


  //Search Widget
  var searchWidget = new Search({
  view: view
  }, "searchDiv");


  searchWidget.startup();




  //<<<EASY NAVIGATION>>>
  //Register events to control
  var rotateAntiClockwiseSpan = dom.byId("rotateAntiClockwiseSpan");
  var rotateClockwiseSpan = dom.byId("rotateClockwiseSpan");
  var indicatorSpan = dom.byId("indicatorSpan");
  on(rotateClockwiseSpan, "click", function () {
  rotateView(1);
  });
  on(rotateAntiClockwiseSpan, "click", function () {
  rotateView(-1);
  });
  on(indicatorSpan, "click", tiltView);


  //Watch the change on view.camera
  view.watch("camera", updateIndicator);


  //Create the event's callback functions
  function rotateView(direction) {
  var heading = view.camera.heading;


  // Set the heading of the view to the closest multiple of 90 degrees,
  // depending on the direction of rotation
  if (direction > 0) {
  heading = Math.floor((heading + 1e-3) / 90) * 90 + 90;
  } else {
  heading = Math.ceil((heading - 1e-3) / 90) * 90 - 90;
  }
  view.animateTo({
  heading: heading
  });
  }


  function tiltView() {
  // Get the camera tilt and add a small number for numerical inaccuracies
  var tilt = view.camera.tilt + 1e-3;


  // Switch between 3 levels of tilt
  if (tilt >= 80) {
  tilt = 0;
  } else if (tilt >= 40) {
  tilt = 80;
  } else {
  tilt = 40;
  }
  view.animateTo({
  tilt: tilt
  });
  }


  function updateIndicator(camera) {
  var tilt = camera.tilt;
  var heading = camera.heading;


  // Update the indicator to reflect the current tilt/heading using
  // css transforms.
  var transform = "rotateX(" + 0.8 * tilt +
  "deg) rotateY(0) rotateZ(" + -heading + "deg)";


  indicatorSpan.style["transform"] = transform;
  indicatorSpan.style["-webkit-transform"] = transform; //Solution for Safari
  }
  //^^^EASY NAVIGATION^^^




  //BASEMAP TOGGLE
  var toggle = new BasemapToggle({
  map: map,
  basemap: "hybrid"
  }, "BasemapToggleDiv");
  toggle.startup();




  //<<<GRAPHICS>>>
  graphicsLayer = new GraphicsLayer();
  map.add(graphicsLayer);


  //Add a 3D point graphic
  var point = new Point({
  x: -77.011,
  y: 38.89686,
  z: 650
  }),


  markerSymbol = new SimpleMarkerSymbol({
  color: [69, 150, 255],
  outline: new SimpleLineSymbol({
  color: [255, 0, 0],
  width: 2
  })
  });


  pointGraphic = new Graphic({
  geometry: point,
  symbol: markerSymbol
  });


  graphicsLayer.add(pointGraphic);


  //Add a 3D polyline graphic
  var polyline = new Polyline([
  [-77.011, 38.89686, 0],
  [-77.011, 38.89686, 640]
        ]),


  lineSymbol = new SimpleLineSymbol({
  color: [69, 150, 255],
  width: 4
  });


  polylineGraphic = new Graphic({
  geometry: polyline,
  symbol: lineSymbol
  });


  graphicsLayer.add(polylineGraphic);


  //Add a 3D polygon graphic
  //Ploygon Coordinates taken from digitized KML in Google Earth
  var polygon = new Polygon([
  [-77.01096035528856, 38.8967466432082, 400],
  [-77.01092530398697, 38.89665268015742, 400],
  [-77.0103007644429, 38.89665637370967, 400],
  [-77.01029444259881, 38.89689790704291, 400],
  [-77.0102010903575, 38.89690267859739, 400],
  [-77.01020040140389, 38.8972096365415, 400],
  [-77.01157574798415, 38.89720378112004, 400],
  [-77.01147251335793, 38.89690596573629, 400],
  [-77.01139745184112, 38.89691800587753, 400],
  [-77.01130350043968, 38.89665972200029, 400],
  [-77.01096035528856, 38.8967466432082, 400]
        ]),


  //fillSymbol does not seem to work unless polygon covers a very large area
  fillSymbol = new SimpleFillSymbol({
  color: [227, 139, 79],
  outline: new SimpleLineSymbol({
  color: [255, 0, 0, 0.5],
  width: 10
  })
  });


  polygonGraphic = new Graphic({
  geometry: polygon,
  symbol: fillSymbol
  });


  graphicsLayer.add(polygonGraphic);
  //^^^GRAPHICS^^^


  });
  </script>
</head>


<body>
  <div id="searchDiv"></div>

  <div id="viewDiv">
    <div id="homediv"></div>
  </div>
  
  <div id="BasemapToggleDiv"></div>
  <div id="buttonsDiv">
  <button id="rotateAntiClockwiseSpan" title="Rotate 90°">↻</button>
  <button id="indicatorSpan"></button>
  <button id="rotateClockwiseSpan" title="Rotate 90°">↺</button>
  </div>
  <div id="environmentDiv">
  <table>
  <tr>
  <td>Time of day:</td>
  <td>
  <select id="timeOfDaySelect">
  <option value="Sun Mar 15 2015 09:00:00 GMT-0500 (EST)">Morning</option>
  <option value="Sun Mar 15 2015 12:00:00 GMT-0500 (EST)">Noon</option>
  <option value="Sun Mar 15 2015 16:00:00 GMT-0500 (EST)">Afternoon</option>
  <option value="Sun Mar 15 2015 18:00:00 GMT-0500 (EST)">Evening</option>
  </select>
  </td>
  </tr>
  <tr>
  <td>Direct shadows:</td>
  <td>
  <input id="directShadowsInput" type="checkbox" checked="yes">
  </td>
  </tr>
  </table>
  </div>


</body>


</html>
0 Kudos
RickeyFight
MVP Regular Contributor

David,

I copied your code into jsbin and added Yue Wu css and it worked.

JS Bin - Collaborative JavaScript Debugging

DavidChrest
Deactivated User

Ah, there it is, now I see what happened. Just by moving my #homediv to the top of my CSS section, placing it right after body{} and #viewDiv, this fixed it. Not only did I need to add #viewDiv, but I had #homediv at the end of my CSS section. This caused the strange behavior. Thanks so much everyone for your timely help! It is incredibly appreciated.

David

0 Kudos
KenBuja
MVP Esteemed Contributor

You're missing the closing } in  #BasemapToggleDiv

  1. #BasemapToggleDiv { 
  2.   position: absolute; 
  3.   top: 78px; 
  4.   right: 12px; 
DavidChrest
Deactivated User

Yes, I caught that too. Thanks so much.

0 Kudos
YueWu1
by Esri Regular Contributor
Esri Regular Contributor

Hi David,

Make sure the css order is like this body {...},

#viewDiv {

      padding: 0;

      margin: 0;

      height: 100%;

    }

   

  #homediv {

      position: absolute;

      top: 120px;

      left: 10px;

      z-index: 50;

    }