Ứng dụng bản đồ yêu cầu làm mới để khởi tạo


9

Tôi đã thử câu hỏi này trên StackOverflow nhưng không nhận được câu trả lời nào. Hy vọng tất cả các bạn có thể có thể giúp đỡ.

Tạo một ứng dụng bản đồ web trong Javascript / Dojo:

Khi tôi tải ứng dụng trong trình duyệt, nó tải các phần tử html nhưng sau đó dừng xử lý. Tôi phải làm mới trình duyệt để tải nó xuống phần còn lại của trang và javascript.

Tôi đã thực hiện kiểm tra và gỡ lỗi cả ngày và phát hiện ra rằng tôi có các tệp JS bên ngoài của mình ở sai vị trí (Tôi là một tân binh). Đã sửa lỗi đó và ứng dụng tải rất nhiều ... NGOẠI TRỪ một trong những tệp của tôi không được đọc chính xác, hoặc tất cả.

Khi tôi di chuyển nội dung của tệp JS bên ngoài được đề cập đến mã chính theo mặc định, chức năng mà chúng chứa, hoạt động tốt ... NHƯNG bản đồ yêu cầu làm mới lại.

Bối rối. Dưới đây là mã trong tệp JS bên ngoài gây ra sự cố của tôi. Tôi không thể hiểu tại sao nó là một vấn đề bởi vì các chức năng hoạt động như mong đợi khi nó không phải là bên ngoài.

Bất kỳ trợ giúp nào cũng được đánh giá rất cao.

//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);

Đây là phần trước của mã của tôi

<!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");

EDIT 2 Tôi đã viết lại hoàn toàn ứng dụng đặt tất cả mã (trừ css) vào tệp default.html chính. Tôi đã thử nghiệm từng mảnh để đảm bảo nó hoạt động như tôi muốn. Thêm mã toggles là mã duy nhất ném nó và gây ra sự làm mới thêm.

Vì vậy, bây giờ tôi đang sử dụng dijit.TitlePane để giữ các phần tử thả xuống (bộ sưu tập bản đồ cơ sở, các lớp, chú giải). Tuy nhiên với điều này, bạn không thể thay đổi giao diện để biến chúng thành hình ảnh, đó là mục tiêu cuối cùng của tôi.

Bất cứ ai cũng có thể đề xuất một giải pháp thay thế để tôi có thể sử dụng 3 hình ảnh khác nhau để khi bạn nhấp vào hình ảnh và trình đơn thả xuống sẽ mở thư viện cơ sở, danh sách lớp và chú giải?


Tôi không thấy thẻ head / body ở đây, tất cả mã javascript của bạn có được tải trong tiêu đề hay không?
Glenn Plas

Lấy làm tiếc. Đã sửa nó. Bằng cách nào đó nó đã được định dạng khi tôi bắt đầu bài viết.
Craig


đã thử nó, nhưng không có gì. Tôi gần như chắc chắn vấn đề là với các hàm dojo.fx.Toggler của tôi. Tất cả các tập tin js bên ngoài khác của tôi hoạt động hoàn hảo. Không chắc chắn tại sao tôi gặp rắc rối. Đã liên lạc với ESRI và họ đang xem xét nó, vì vậy hy vọng tôi sẽ sớm có giải pháp.
Craig

Bạn đã thử sử dụng một cái gì đó như các công cụ dành cho nhà phát triển Chrome để xem các tệp bên ngoài nào đang thực sự được tải chưa? Điều này ít nhất có thể cho bạn biết trang của bạn đang tải các tệp đến đâu và có bất kỳ lỗi nào.
pecoanddeco

Câu trả lời:


7

Tôi sẽ hợp nhất tất cả các cuộc gọi dojo.addOnLoad () đó. Tôi nghi ngờ một cái gì đó không được tải trước khi một chức năng được gọi.

Loại bỏ tất cả các cuộc gọi dojo.addOnLoad khỏi tất cả các tệp javascript bên ngoài của bạn và gói chúng thành một cuộc gọi trong tệp HTML chính của bạn. Đặt tất cả các chức năng bạn muốn kích hoạt tải vào một chức năng mới ở cuối javascript của bạn như thế này:

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

Điều này sẽ đảm bảo rằng mọi thứ đã được tải trước khi thử tắt bất kỳ chức năng nào.


5

Nếu bạn muốn kiểm tra / kiểm tra điều này sâu hơn, bên ngoài bất kỳ khuôn khổ nào (jquery / dojo) phải bắt đầu điều này. Bạn có thể thử thư viện nhỏ này:

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();
};

Và sau đó sử dụng nó như thế này:

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

Về cơ bản những gì bạn làm là nói: chờ đợi để làm công cụ cho đến khi div này tồn tại. Nó hoạt động khác với tài liệu. Đã sẵn sàng, 'bắn' một chút sau đó. Vì vậy, đối với bạn, bạn sẽ đặt mã dojo.*ở đây.

Đây là một thử nghiệm tuyệt vời để xem bạn có bị cắn bởi thứ tự tải của một số mã javascript không. Tôi đang đưa ra điều này bởi vì nó đã được sử dụng tốt để (khắc phục sự cố) loại bỏ các loại vấn đề này.


Tôi đã thử kết hợp đề xuất của bạn với mã của tôi mà không gặp may mắn. Bạn có thể giúp giải thích thêm về nơi mà điều này sẽ đi trong mớ hỗn độn hiện tại của tôi?
Craig

đặt khối trên cùng vào tệp js riêng biệt, bao gồm nó trong tiêu đề, sau đó kiểm tra các phần tử dom mà bạn hành động, trong mã của bạn: onAvailable('basemapToggle', function () { dojo.addOnLoad(basemapToggle); });Đây không phải là giải pháp trực tiếp nhưng nó sẽ giúp bạn hiểu vấn đề về thứ tự tải của mình
Glenn Plas

3

Có vẻ như bạn đang gặp vấn đề về thứ tự kịch bản. Toggles.js của bạn phụ thuộc vào võ đường đang được tải. Tuy nhiên, trong html của bạn, bạn đang gọi toggles.js trước khi tải api javascript của ESRI, tải võ đường. Đây là một gợi ý về cách bạn có thể sắp xếp lại các tập lệnh của mình.

...
<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>
    ...

Tôi đã thử đặt hàng lại các kịch bản. Khi tôi đặt các tập lệnh bên ngoài sau tập lệnh API, chỉ tải html (tiêu đề, logo, tiêu đề phụ). Sau đó tôi phải làm mới để tải javascript.
Craig

Tôi chỉnh sửa câu trả lời cuối cùng của tôi. Hãy thử đặt tập lệnh dojo.requires trước các tệp bên ngoài của bạn. Ngoài ra, bạn có thể xem xét việc di chuyển các tập lệnh bên ngoài của mình xuống dưới cùng của thân html, để đảm bảo rằng tất cả các thành phần DOM đã được tải trước khi các tập lệnh đó chạy.
raykendo

cả hai tùy chọn chỉnh sửa của bạn đều dẫn đến cùng một lỗi, cần phải làm mới để tải js.
Craig
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.