Intenté esta pregunta en StackOverflow pero no obtuve ninguna respuesta. Esperando que todos puedan ayudar.
Crear una aplicación de mapeo web en Javascript / Dojo:
Cuando cargo la aplicación en un navegador, carga los elementos html pero luego detiene el procesamiento. Tengo que actualizar el navegador para que cargue el resto de la página y el javascript.
He hecho pruebas y depuración todo el día y descubrí que tenía mis archivos JS externos en el lugar equivocado (soy un novato). Se corrigió eso y la aplicación se carga muy bien ... EXCEPTO que uno de mis archivos no se lee correctamente, o no se lee.
Cuando muevo el contenido del archivo JS externo en cuestión al código principal predeterminado, la funcionalidad que contienen funciona bien ... PERO el mapa requiere la actualización nuevamente.
Perplejo. A continuación se muestra el código en el archivo JS externo que está causando mi problema. No puedo entender por qué es un problema porque las funciones funcionan como se esperaba 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 parte delantera 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");
EDITAR 2 He reescrito completamente la aplicación colocando todo el código (excepto el css) en el archivo principal default.html. Probé pieza por pieza para asegurarme de que funcionara como quiero. Agregar el código de alternancia es el único código que lo arroja y causa la actualización adicional.
Así que por ahora estoy usando dijit.TitlePane para mantener los elementos desplegables (galería de mapas base, capas, leyenda). Sin embargo, con esto no puede cambiar la apariencia para hacerlas imágenes, que es mi objetivo final.
¿Alguien puede sugerir una alternativa para que pueda usar 3 imágenes diferentes para que cuando haga clic en la imagen y se abra el menú desplegable que contiene la galería del mapa base, la lista de capas y la leyenda?
Respuestas:
Yo consolidaría todas esas llamadas dojo.addOnLoad (). Sospecho que algo no se está cargando antes de que se llame a una función.
Elimine todas las llamadas dojo.addOnLoad de todos sus archivos javascript externos y agrúpelos en una sola llamada en su archivo HTML principal. Ponga todas las funciones que desea activar en la carga en una nueva función en la parte inferior de su javascript como esta:
Esto asegurará que todo se haya cargado antes de intentar activar cualquier función.
fuente
Si desea controlar / probar con mayor profundidad, fuera de lo que cualquier marco (jquery / dojo) tiene que iniciar esto. Puedes probar esta pequeña biblioteca:
Y luego úsalo así:
Básicamente lo que haces es decir: espera para hacer cosas hasta que exista este div. Se comporta de manera diferente a document.ready, 'disparando' un poco más tarde. así que para ti, pondrías el código
dojo.*
aquí.Es una gran prueba para ver si te muerde el orden de carga de algún código JavaScript. Estoy dando esto porque ha sido de gran utilidad (solucionar) resolver este tipo de problemas.
fuente
onAvailable('basemapToggle', function () { dojo.addOnLoad(basemapToggle); });
no es una solución directa, pero lo ayudará a comprender su problema de orden de cargaParece que tienes un problema con el orden del script. Su toggles.js se basa en la carga del dojo. Sin embargo, en su html, está llamando a toggles.js antes de cargar la API de JavaScript de ESRI, que carga dojo. Aquí hay una sugerencia sobre cómo podría reorganizar sus scripts.
fuente