3

Javascript / DojoでのWebマッピングアプリケーションの作成:

ブラウザにアプリをロードすると、html要素がロードされますが、処理が停止します。ページの残りの部分とjavascriptをロードするために、ブラウザーを更新する必要があります。

私は一日中テストとデバッグを行い、外部JSファイルが間違った場所にあることがわかりました(私は新人です)。これを修正すると、アプリの読み込みが向上します...ファイルの1つが正しく読み取られないか、まったく読み取られない場合を除きます。

問題の外部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"/>

        <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/toggles.js"></script>
        <script src="JS/identify.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");

      var map, locator, layer, visible = [];
            var legendLayers = [];
            var resizeTimer;
            var identifyTask,identifyParams;
            var findTask, findParams;
            var basemaptoggler = null;
            var layertoggler = null;
            var legendtoggler = null;
            var findTaskParcel, findParamsParcel;
      // var gridParcel, storeParcel;

編集2

すべてのコード(cssを除く)をメインのdefault.htmlファイルに配置してアプリを完全に書き直しました。私はそれが私が望むように機能することを確認するために少しずつテストしました。トグルコードを追加することは、それをスローし、余分なリフレッシュを引き起こす唯一のコードです。

そのため、今のところ、dijit.TitlePaneを使用して、ドロップダウン要素(ベースマップギャラリー、レイヤー、凡例)を保持しています。しかし、これではルックアンドフィールを変更して画像にすることはできません。これが私の最終目標です。

画像をクリックしてドロップダウンメニューが開き、ベースマップギャラリー、レイヤーリスト、凡例が表示されるように、3つの異なる画像を使用できるように、誰かが代替案を提案できますか?

編集3

トグル関数を呼び出すために使用するコードを表示すると、おそらく役立つでしょう。これが私の問題の原因である可能性があります。

<!--Legend-->
    <div id="subheader">
  <div style="position:absolute; right:60px; top:10px; z-Index:98;">
            <div id="legendbutton">
        <button dojoType="dijit.form.Button" baseClass="tomButton" title="Show Legend">
            <img src="images/Legend.png" />
                <script type="dojo/method" event="onClick">
                    legendtoggler[(dojo.style("legendtoggle","display") == "none") ? 'show':'hide']();
                </script>
        </button>
                <div id="legendtoggle" dojoType="dijit.layout.ContentPane" style="border: 1px solid black; display: none">
                    <div id="legendDiv"></div>
                </div>
            </div>
<!--Layer Toggle-->
            <div id="layerbutton">
                <button dojoType="dijit.form.Button" baseClass="tomButton" border="0" title="Toggle Layers">
                    <img src="images/layers.png"/>
                        <script type="dojo/method" event="onClick">
                            layertoggler[(dojo.style("layertoggle","display") == "none") ? 'show':'hide']();
                        </script>
                </button>
                    <div id="layertoggle" dojoType="dijit.layout.ContentPane" style="border: 1px solid black; display: none">
                        <span id="layer_list"><input type='checkbox' class='list_item' id='0' value=0 onclick='updateLayerVisibility();'
                        </span>
                    </div>
            </div>
<!--Basemap Gallery-->
            <div id="basemapbutton">
                <button dojoType="dijit.form.Button" baseClass="tomButton" title="Switch Basemap">
                    <img src="images/imgBaseMap.png"/>
                        <script type="dojo/method" event="onClick">

                        </script>
                </button>
                    <div id="basemaptoggle" dojoType="dijit.layout.ContentPane" style="#900;display: none;">
                        <span id="basemapGallery">
                        </span>
                    </div>
            </div>
4

2 に答える 2

2

ここでの回避策は、私が行ったのと似ています。

http://www.martindueren.de/paperwriting/

アプリの右側にあるアイコンは、dijit.TitlePanesをワイプインおよびワイプアウトします。これに使用される効果は、次のページにあります。

http://dojotoolkit.org/documentation/tutorials/1.8/effects/

このためのコードは次のようになります。

<button id="slideAwayButton">Slide block away</button>
<button id="slideBackButton">Slide block back</button>

<div id="slideTarget" class="red-block slide">
    A red block
</div>
<script>
    require(["dojo/fx", "dojo/on", "dojo/dom", "dojo/domReady!"], function(fx, on, dom) {
        var slideAwayButton = dom.byId("slideAwayButton"),
            slideBackButton = dom.byId("slideBackButton"),
            slideTarget = dom.byId("slideTarget");

        on(slideAwayButton, "click", function(evt){
            fx.slideTo({ node: slideTarget, left: "200", top: "200" }).play();
        });
        on(slideBackButton, "click", function(evt){
            fx.slideTo({ node: slideTarget, left: "0", top: "100" }).play();
        });
    });
</script>

私のソースコードを見て、そこから何かをコピーしてください!私があなたを正しく理解していれば、これはまさにあなたが必要としているものです。

于 2012-10-25T16:25:12.507 に答える
2

あなたがここに立てた話はかなり、正確に特定するのは難しいですが、あなたの問題が何であるかを正確に説明します。問題は、AMDローダー対応のdojoバージョンからレガシーローダーコードをロールアウトすることです。

私は実際にこれまでコンポーネントを実行したことがないのでesri、これは一種の野蛮な推測です-しかし、私の視点からは、一見の価値があるかもしれません。グーグルマップにはオンロードリスナーがあると確信しています-そして私はesriがこの振る舞いに従うのではないかと思います。

次のように、esriモジュールをロードする前に、アプリケーションのすべてを初期化してみてください。

dojo.addOnLoad(function() {
  basemapToggle();
  layerToggle();
  legendToggle();
  dojo.require("esri.map");
  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("esri.tasks.find");
});

あなたが探している効果については、個人的にdojo.animatePropertyはそれを利用して組み合わせdijit/TooltipDialogます。

このhttp://jsfiddle.net/seeds/a8BBm/2/は、メカニズムを「ハック」する方法を示してonShowおり、オープニングアニメーションでオプションの効果を有効にしています。デフォルトでは、DropDownButtonは単にフェードインします。

tooltipdialogをポップアップする別の方法、つまりdijit.popupクリック/マウスオーバーイベントに接続する方法については、http://livedocs.dojotoolkit.org/dijit/TooltipDialog#programmatic-exampleを参照してください。

于 2012-10-28T10:23:11.990 に答える