Ich habe diese Frage bei StackOverflow ausprobiert, aber keine Antworten erhalten. Ich hoffe, Sie alle könnten helfen.
Erstellen einer Web-Mapping-Anwendung in Javascript / Dojo:
Wenn ich die App in einen Browser lade, werden die HTML-Elemente geladen, die Verarbeitung wird jedoch beendet. Ich muss den Browser aktualisieren, damit er den Rest der Seite und das Javascript lädt.
Ich habe den ganzen Tag getestet und debuggt und herausgefunden, dass ich meine externen JS-Dateien an der falschen Stelle hatte (ich bin ein Neuling). Das wurde behoben und die App wird großartig geladen ... AUSSER eine meiner Dateien wird nicht richtig oder überhaupt nicht gelesen.
Wenn ich den Inhalt der betreffenden externen JS-Datei standardmäßig in den Hauptcode verschiebe, funktioniert die darin enthaltene Funktionalität einwandfrei ... ABER die Karte muss erneut aktualisiert werden.
Verblüfft. Unten finden Sie den Code in der externen JS-Datei, der mein Problem verursacht. Ich kann nicht herausfinden, warum es ein Problem ist, weil die Funktionen wie erwartet funktionieren, wenn sie nicht extern sind.
Jede Hilfe wird sehr geschätzt.
//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);
Hier ist der vordere Teil meines Codes
<!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");
BEARBEITEN 2 Ich habe die App komplett neu geschrieben und den gesamten Code (außer dem CSS) in der Hauptdatei default.html platziert. Ich habe Stück für Stück getestet, um sicherzustellen, dass es so funktioniert, wie ich es will. Das Hinzufügen des Umschaltcodes ist der einzige Code, der ihn auslöst und die zusätzliche Aktualisierung verursacht.
Im Moment verwende ich dijit.TitlePane, um die Dropdown-Elemente (Grundkartengalerie, Ebenen, Legende) zu speichern. Damit kann man jedoch das Erscheinungsbild nicht ändern, um daraus Bilder zu machen, was mein Endziel ist.
Kann jemand eine Alternative vorschlagen, damit ich 3 verschiedene Bilder verwenden kann, sodass beim Klicken auf das Bild und das Dropdown-Menü die Grundkartengalerie, die Ebenenliste und die Legende geöffnet werden?
Antworten:
Ich würde all diese dojo.addOnLoad () -Aufrufe konsolidieren. Ich vermute, dass etwas nicht geladen wird, bevor eine Funktion aufgerufen wird.
Entfernen Sie alle dojo.addOnLoad-Aufrufe von allen externen Javascript-Dateien und bündeln Sie sie in einem Aufruf in Ihrer Haupt-HTML-Datei. Fügen Sie alle Funktionen, die Sie beim Laden auslösen möchten, wie folgt in eine neue Funktion am unteren Rand Ihres Javascript ein:
Dadurch wird sichergestellt, dass alles geladen wurde, bevor versucht wird, Funktionen auszulösen.
quelle
Wenn Sie dies genauer steuern / testen möchten, müssen Sie dies außerhalb eines Frameworks (jquery / dojo) starten. Sie könnten diese kleine Bibliothek ausprobieren:
Und dann benutze es so:
Grundsätzlich sagen Sie: Warten Sie, bis dieses Div existiert. Es verhält sich anders als document.ready und wird etwas später "ausgelöst". Für Sie würden Sie den Code
dojo.*
hier einfügen .Es ist ein großartiger Test, um festzustellen, ob Sie von der Ladereihenfolge eines Javascript-Codes gebissen werden. Ich gebe dies, weil es von Nutzen war, diese Art von Problemen zu beheben.
quelle
onAvailable('basemapToggle', function () { dojo.addOnLoad(basemapToggle); });
direkt : Es ist keine direkte Lösung, aber es hilft Ihnen, Ihr Problem mit derEs sieht so aus, als hätten Sie ein Problem mit der Skriptreihenfolge. Ihre toggles.js ist darauf angewiesen, dass das Dojo geladen wird. In Ihrem HTML-Code rufen Sie jedoch toggles.js auf, bevor Sie die Javascript-API von ESRI laden, mit der das Dojo geladen wird. Hier ist ein Vorschlag, wie Sie Ihre Skripte neu organisieren können.
quelle