맵 응용 프로그램을 초기화하려면 새로 고침이 필요합니다


9

이 질문을 StackOverflow에서 시도했지만 아무런 대답도 얻지 못했습니다. 모두가 도울 수 있기를 바랍니다.

Javascript / Dojo에서 웹 맵핑 애플리케이션 작성 :

브라우저에 앱을로드하면 html 요소가로드되지만 처리가 중지됩니다. 나머지 페이지와 자바 스크립트를로드하려면 브라우저를 새로 고쳐야합니다.

나는 하루 종일 테스트와 디버깅을 수행했으며 외부 JS 파일이 잘못된 위치에 있음을 알았습니다 (나는 신인입니다). 내 파일 중 하나가 올바르게 읽히지 않거나 전혀 읽히지 않는 것을 수정하고 앱이 크게로드되는 것을 수정했습니다.

문제가있는 외부 JS 파일의 내용을 기본 코드의 기본 코드로 이동하면 포함 된 기능이 정상적으로 작동합니다 ...하지만 맵을 다시 새로 고쳐야합니다.

우연히. 아래는 내 문제를 일으키는 외부 JS 파일의 코드입니다. 함수가 외부에 있지 않을 때 예상대로 작동하기 때문에 왜 문제인지 알 수 없습니다.

도움을 주시면 감사하겠습니다.

//Toggles
function basemapToggle() {
            basemaptoggler = new dojo.fx.Toggler({
                node: "basemaptoggle",
                showFunc : dojo.fx.wipeIn,
                showDuration: 1000,
                hideDuration: 1000,
                hideFunc : dojo.fx.wipeOut
            })
        }
        dojo.addOnLoad(basemapToggle);

        function layerToggle() {
            layertoggler = new dojo.fx.Toggler({
                node: "layertoggle",
                showFunc : dojo.fx.wipeIn,
                showDuration: 750,
                hideDuration: 750,
                hideFunc : dojo.fx.wipeOut
            })
        }
        dojo.addOnLoad(layerToggle);

        function legendToggle() {
            legendtoggler = new dojo.fx.Toggler({
                node: "legendtoggle",
                showFunc : dojo.fx.wipeIn,
                hideFunc : dojo.fx.wipeOut
            })
        }
        dojo.addOnLoad(legendToggle);

여기 내 코드의 앞 부분이 있습니다

<!DOCTYPE HTML> 
  <html>  
  <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=7, IE=8, IE=9" />
    <meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no"/>
    <title> 
        Zoning Classifications
    </title> 
        <link rel="Stylesheet" href="ZoningClassifications.css" />
    <link rel="stylesheet" type="text/css" href="http://serverapi.arcgisonline.com/jsapi/arcgis/3.0/js/dojo/dijit/themes/claro/claro.css">
        <link rel="stylesheet" type="text/css" href="http://serverapi.arcgisonline.com/jsapi/arcgis/3.0/js/esri/dijit/css/Popup.css">
        <link rel="stylesheet" type="text/css" href="http://serverapi.arcgisonline.com/jsapi/arcgis/3.0/js/dojo/dojox/grid/resources/Grid.css">
    <link rel="stylesheet" type="text/css" href="http://serverapi.arcgisonline.com/jsapi/arcgis/3.0/js/dojo/dojox/grid/resources/claroGrid.css">
    <style type="text/css"> 
    </style> 

        <script src="JS/layers.js"></script>
        <script src="JS/search.js"></script>
        <script src="JS/basemapgallery.js"></script>

        <script src="JS/identify.js"></script>
        <script src="JS/toggles.js"></script>
        <script type="text/javascript"> 
      var djConfig = {
        parseOnLoad: true
      };
    </script> 
    <script type="text/javascript" src="http://serverapi.arcgisonline.com/jsapi/arcgis/?v=3.0"></script>
    <script type="text/javascript"> 

            dojo.require("dijit.dijit"); // optimize: load dijit layer
      dojo.require("dijit.layout.BorderContainer");
      dojo.require("dijit.layout.ContentPane");
      dojo.require("esri.map");
      dojo.require("dijit.TitlePane");
      dojo.require("esri.dijit.BasemapGallery");
      dojo.require("esri.arcgis.utils");
            dojo.require("esri.tasks.locator");
            dojo.require("esri.dijit.Legend");
            dojo.require("esri.dijit.Popup");
            dojo.require("dijit.form.Button");
            dojo.require("dojo.fx");
            dojo.require("dijit.Dialog");
            dojo.require("dojo.ready");
      dojo.require("dijit.TooltipDialog");
            dojo.require("dojox.grid.DataGrid");
      dojo.require("dojo.data.ItemFileReadStore");
      dojo.require("esri.tasks.find");

편집 2 모든 코드 (css 제외)를 기본 default.html 파일에 배치하여 앱을 완전히 다시 작성했습니다. 원하는 방식으로 작동하는지 확인하기 위해 하나씩 테스트했습니다. 토글 코드를 추가하는 것은 코드를 던지고 여분의 새로 고침을 일으키는 유일한 코드입니다.

그래서 지금은 dijit.TitlePane을 사용하여 드롭 다운 요소 (베이스 맵 갤러리, 레이어, 범례)를 보유하고 있습니다. 그러나 이것으로 이미지를 만드는 모양과 느낌을 바꿀 수는 없습니다. 이것이 나의 최종 목표입니다.

아무도 대안을 제안하여 3 개의 다른 이미지를 사용할 수 있으므로 이미지를 클릭하면 드롭 다운 메뉴가 기본 맵 갤러리, 레이어 목록 및 범례를 포함하여 열립니다.


여기에 head / body 태그가 표시되지 않습니다. 모든 자바 스크립트 코드가 헤더에로드되어 있습니까?
Glenn Plas

죄송합니다. 고쳤다. 어떻게 든 게시물을 시작할 때 형식이 지정되었습니다.
Craig


그것을 시도했지만 아무것도 없습니다. 내 dojo.fx.Toggler 함수에 문제가 거의 있다고 확신합니다. 다른 모든 외부 js 파일은 완벽하게 작동합니다. 왜 문제가 발생했는지 잘 모르겠습니다. ESRI에 연락하여 조사 중이므로 곧 해결 될 것입니다.
Craig

실제로 어떤 외부 파일이로드되는지 확인하기 위해 Chrome 개발자 도구와 같은 것을 사용해 보셨습니까? 이것은 적어도 페이지가 파일을로드하는 데 걸리는 거리와 오류가있는 위치를 알려줍니다.
pecoanddeco

답변:


7

모든 dojo.addOnLoad () 호출을 통합합니다. 함수가 호출되기 전에 무언가가로드되지 않는 것 같습니다.

모든 외부 자바 스크립트 파일에서 모든 dojo.addOnLoad 호출을 제거하고 기본 HTML 파일에서 하나의 호출로 묶습니다. 로드하려는 모든 함수를 다음과 같이 자바 스크립트 하단의 새 함수에 넣습니다.

function init() {
  basemapToggle();
  layerToggle();
  whatEver();
}
dojo.addOnLoad(init);

이렇게하면 모든 기능을 시작하기 전에 모든 것이로드됩니다.


5

이 프레임 워크 (jquery / dojo)가 이것을 시작하기 전에 이것을 더 세밀하게 제어 / 테스트하려면 이 작은 도서관을 시험해 볼 수 있습니다.

var stack = [],
    interval,
    loaded; // has window.onload fired?

function doPoll() {
  var notFound = [];
  for (var i=0; i<stack.length; i++) {
    if (document.getElementById(stack[i].id)) {
      stack[i].callback();
    } else {
      notFound.push(stack[i]);
    }
  }
  stack = notFound;
  if (notFound.length < 1 || loaded) {
    stopPolling();
  }
}

function startPolling() {
  if (interval) {return;}
  interval = setInterval(doPoll, 10);
}

function stopPolling() {
  if (!interval) {return;}
  clearInterval(interval);
  interval = null;
}

function onAvailable(id, callback) {
  stack.push({id:id, callback:callback});
  startPolling();
}

window.onload = function() {
  loaded = true;
  doPoll();
};

그런 다음 다음과 같이 사용하십시오.

onAvailable('map', function () {
    // Only do stuff here once the map div is available (this always happens after the DOM is ready)
  ....
});

기본적으로 당신이 말하는 것은 :이 div가 존재할 때까지 물건을 기다리십시오. document.ready와는 다르게 동작합니다. 그래서 당신을 위해 dojo.*여기에 코드를 넣을 것 입니다.

자바 스크립트 코드의로드 순서에 물 렸는지 확인하는 훌륭한 테스트입니다. 나는 이런 종류의 문제를 분류하는 데 잘 사용되어 왔기 때문에 이것을주고 있습니다.


운없이 내 코드에 제안을 통합하려고했습니다. 이것이 기존 혼란에서 어디로 가야하는지 더 자세히 설명해 주시겠습니까?
Craig

상단 블록을 별도의 js 파일에 넣고 헤더에 포함한 다음 코드에서 수행하는 dom 요소를 테스트하십시오. onAvailable('basemapToggle', function () { dojo.addOnLoad(basemapToggle); });직접 솔루션은 아니지만로드 순서 문제를 이해하는 데 도움이됩니다.
Glenn Plas

3

스크립트 순서 문제가있는 것 같습니다. toggles.js는로드되는 dojo에 의존합니다. 그러나 HTML에서 ESRI의 자바 스크립트 API를로드하기 전에 toggles.js를 호출하여 dojo를로드합니다. 다음은 스크립트를 재구성하는 방법에 대한 제안입니다.

...
<style type="text/css"></style> 

    <script type="text/javascript"> 
       var djConfig = { parseOnLoad: true };
    </script> 
    <script type="text/javascript" src="http://serverapi.arcgisonline.com/jsapi/arcgis/?v=3.0"></script>
    <script type="text/javascript"> 

        dojo.require("dijit.dijit"); // optimize: load dijit layer
        dojo.require("dijit.layout.BorderContainer");
        dojo.require("dijit.layout.ContentPane");
        dojo.require("esri.map");
        dojo.require("dijit.TitlePane");
        dojo.require("esri.dijit.BasemapGallery");
        dojo.require("esri.arcgis.utils");
        dojo.require("esri.tasks.locator");
        dojo.require("esri.dijit.Legend");
        dojo.require("esri.dijit.Popup");
        dojo.require("dijit.form.Button");
        dojo.require("dojo.fx");
        dojo.require("dijit.Dialog");
        dojo.require("dojo.ready");
        dojo.require("dijit.TooltipDialog");
        dojo.require("dojox.grid.DataGrid");
        dojo.require("dojo.data.ItemFileReadStore");
        dojo.require("esri.tasks.find");
    </script>
    <script src="JS/layers.js"></script>
    <script src="JS/search.js"></script>
    <script src="JS/basemapgallery.js"></script>

    <script src="JS/identify.js"></script>
    <script src="JS/toggles.js"></script>
    ...

스크립트를 다시 주문했습니다. API 스크립트 뒤에 외부 스크립트를 배치하면 html 만로드됩니다 (헤더, 로고, 하위 헤더). 그런 다음 자바 스크립트를로드하려면 새로 고쳐야합니다.
Craig

마지막 답변을 편집했습니다. dojo.requires 스크립트를 외부 파일보다 먼저 배치하십시오. 또한 외부 스크립트를 html 본문의 맨 아래로 이동하여 해당 스크립트가 실행되기 전에 모든 DOM 요소가로드되었는지 확인할 수 있습니다.
raykendo

편집 된 옵션 모두 동일한 오류가 발생하여 js를로드하기 위해 새로 고쳐야합니다.
Craig
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.