9 votos

Mapa de la Aplicación Requiere de Actualización para Inicializar

He probado esta pregunta en StackOverflow, pero no recibe ninguna respuesta. Con la esperanza de que todo podría ser capaz de ayudar.

La creación de una web de mapas de la aplicación en Javascript/Dojo:

Cuando se carga la aplicación en un navegador que carga los elementos html, pero luego se detiene el procesamiento. Tengo que actualizar el navegador para llegar a cargar el resto de la página y el código javascript.

He hecho pruebas y la depuración de todo el día y pensé que tenía mi JS externo de los archivos en el lugar equivocado (soy un novato). Fijo y que la aplicación de cargas de gran...a EXCEPCIÓN de uno de mis archivos no llegar a leer correctamente o en absoluto.

Cuando muevo el contenido de el archivo JS externo de que se trata en el código principal de la predeterminada, la funcionalidad que contienen, el trabajo bien... PERO el mapa requiere de la actualización de nuevo.

Perplejos. A continuación está el código en el archivo JS externo que es la causa de mi problema. No puedo entender por qué esto es un problema porque las funciones funcionan como se espera cuando no es externo.

Cualquier ayuda es muy apreciada.

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

Aquí está la primera parte de mi código

<!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 He reescrito por completo la aplicación de colocar todo el código (excepto los de la css) en la principal default.html archivo. He probado pieza por pieza para asegurarse de que funcione como quiero. La adición de la alterna código es el único código que produce y hace que el extra de actualización.

Así que por ahora estoy usando dijit.TitlePane para mantener el desplegable de elementos (mapa base de la galería, capas, leyenda). Sin embargo, con esto no se puede cambiar el aspecto y la sensación de hacerlos imágenes, que es mi objetivo final.

Puede alguien sugerir una alternativa para que pueda utilizar 3 diferentes imágenes, de modo que cuando usted haga clic en la imagen y el menú desplegable que se abre sosteniendo el mapa base de la galería, la lista de capas y la leyenda?

7voto

Mintx Puntos 2627

Me gustaría consolidar todos aquellos dojo.addOnLoad() llamadas. Sospecho que algo no está cargado antes de que una función es recibir llamadas.

Tira todo el dojo.addOnLoad llamadas de todos tus archivos javascript externos y juntarlos en una sola llamada en tu archivo HTML principal. Poner todas las funciones que usted desea incendio en la carga en una nueva función en la parte inferior de tu javascript como este:

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

Esto se asegurará de que todo se ha cargado antes de intentar disparar cualquiera de las funciones.

5voto

mcchots Puntos 329

Si desea finecontrol / prueba de esto en profundidad, fuera de lo que cualquier marco (jquery/dojo) tiene que empezar esto. Usted podría tratar de esta pequeña biblioteca:

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

Y, a continuación, utilizarlo como este :

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

Básicamente lo que tienes que hacer es decir: esperar a hacer cosas hasta este div existe. Se comporta de manera diferente de un documento.listo , 'tiro' un poco más tarde. así que para usted , usted podría poner el código con dojo.* aquí.

Es una gran prueba para ver si usted ha sido mordido por el orden de carga de código javascript. Estoy dando este porque ha sido de buen uso para (solucionar problemas) a resolver estos tipos de problemas.

3voto

Kieran Benton Puntos 2783

Parece que está teniendo una secuencia de comandos de orden cuestión. Su toggles.js se basa en el dojo de ser cargado. Sin embargo, en tu html, usted está llamando toggles.js antes de la carga de ESRI api de javascript que carga dojo. He aquí una sugerencia en cuanto a cómo se podría reorganizar sus scripts.

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

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X