Kennen Sie schon unseren Podcast? Thomas Bahn diskutiert mit Gästen aus Wirtschaft und Wissenschaft über Künstliche Intelligenz und Chatbots. Jetzt reinhören

de · en

dojo und Notes: Artikel 8 - dijit.Dialog - Modale Dialoge mit AJAX-Fähigkeiten

von Bernd,
assono GmbH, Standort Hamburg,

Während der letzte Artikel in der dojo-Serie nur eine kleine Anpassung war, beschäftigen wir uns heute mit dijits. Mit dijits bezeichnet man Oberflächenelemente in dojo (dojo interface widgets = dijit). Aus dem vielfältigen Angebot verwenden wir in unserem Beispiel den dijit.Dialog. Der dijit.Dialog erzeugt einen modalen Dialog und ist ein gutes Beispiel für die Genialität von dojo.

Dem dijit.Dialog kann kann der anzuzeigende Inhalt als HTML-Knoten übergeben werden. Wenn statt desen dem Dialog-Objekt eine passende URL übergeben wird, wird der Inhalt automatisch per AJAX nachgeladen und angezeigt. Die ganze Komplexität, die dafür notwendig ist, ist in dem Objekt gekapselt. Als Anwendungsentwickler muss man lediglich das Objekt verwenden. Es ist einfach genial.

In unserer Beispielanwendung wollen wir den Dialog nutzen, um die Daten des Referenten als Dialog darzustellen, sobald auf den Namen des Referenten geklickt wird. Wie immer schauen wir uns erst einmal den dazu notwendigen Code an.//Loads a dialog
dojo.require("dijit.Dialog");

//Prepare the dialog
function prepareDialog(){
//creates a new dialog
var myDijit = new dijit.Dialog({title: "Referent", id:"dialog", style:"width:300px"});
//appends the dialog to an existing DOM node
dojo.byId("sessions").appendChild(myDijit.domNode);
//the dialog is hidden until called
}

function showSpeakerRefByName(speakerNameEncoded){
//get the dialog
var dialogDijit = dijit.byId("dialog");
var path = webPath + "/SpeakerDescriptionByName/" + speakerNameEncoded;
dialogDijit.attr('href', path);
dialogDijit.show();
}
Die erste Zeile sollte inzwischen jeder verstehen. Es wird das dojo-Package für den dijit.Dialog nachgeladen.

Die Funktion prepareDialog() erzeugt zunächst ein neues dijit.Dialog-Objekt. Wie schon häufiger bei dojo-Objekten gesehen, wird als Parameter im Konstruktor des Objektes ein Konfigurationsobjekt erwartet. In unserem Fall spezifisieren wird den Titel, vergeben eine ID und legen die Breite fest.

Die Zeile danach sieht zunächst unscheinbar aus, ist aber für das Funktionieren und insbesondere für das Verständnis von dijits von absoluter Wichtigkeit. Der HTML-Knoten, der für den Dialog erzeugt wurde, hat zunächst keine Verbindung zum aktuellen HTML-Dokument. Erst dadurch, dass er als Kindobjekt an das die Session umschließende Div angehängt wird, besteht eine Verbindung zwischen dem Dialog und dem HTML-Dokument.

Man muss sich immer wieder klar machen, dass alle dijits im Endeffekt nur aus HTML, CSS und JavaScript bestehen. Unser Dialog ist also nur ein absolut positioniertes Div-Element mit dem anzuzeigenden Inhalt, das im Z-Index über allen anderen Elemente der Webseite liegt, und einem zweiten Div-Element, welches sich zwischen der HTML-Seite und dem Dialog-Div legt und so für die Abschattung des Seiteninhaltes sorgt. Wieso ist diese Erkenntnis so wichtig? Weil man bisweilen vor lauter dijits vergisst, dass dojo die Grundprinzipien von Webanwendungen nicht ändern kann.

Die Funktion showSpeakerRefByName() holt sich per dijit.byId über den dijit-Manager zunächst einmal unseren dijit.Dialog. Der Befehl ist nicht zu verwechseln mit dojo.byId, der einen DOM-Knoten anhand einer ID findet. In der Variablen path wird die URL zu der Referentenbeschreibung zusammengestellt. Die URL wird dann in das Attribute "href" geschrieben. Mit der Methode dialogDijit.show() wird der Dialog angezeigt. Das ist auch der Moment in dem per AJAX der anzuzeigende Inhalt geladen wird. Je nachdem wie schnell die Serveranbindung ist, kann man eventuell noch eine kleine "Fortschrittsaninmation" sehen, bis der eigentliche Inhalt angezeigt wird.

Damit auch tatsächlich beim Klick auf den Referentennamen der Dialog angezeigt wird, müssen wir das onClick-Event regisitrieren. Dazu erweiteren wird unsere dojo.addOnLoad-Funktion um die folgenden Zeilen.//add the behavior to the speaker name to show the dialog
dojo.behavior.add({
"div.session span.speakerName": {
onclick: function(evt){
var speakerNameEncoded = evt.target.id;
showSpeakerRefByName(speakerNameEncoded);
}
}
});

//add style to name for pointer
dojo.query("div.session span.speakerName").style("cursor", "pointer");Alle Referentennamen sind in einem Span-Element mit der CSS-Klasse "speakerName" eingeschlossen. Neben der Formatierung hilft uns diese Entscheidung auch dabei, für das dojo.behavior-Objekt alle passenden DOM-Knoten zu finden. Um uns das Leben ein wenig einfacher zu machen, haben die DOM-Knoten mit den Referentennamen als ID den Namen in seiner websicheren Form. Diese ID wird beim Aufruf der showSpeakerByRefName()-Funktion übergeben. Die letzte Zeile sorgt dafür, dass der Referentenname auch wirklich als Link wahrgenommen werden kann.

Wie immer kann man sich das Beispiel live ansehen.

In der zu dieser Artikelserien gehörenden Beispieldatenbank finden sie den Inhalt dieses Artikels in der Maske "webSpeedAgendaing-Step 6|SpeedAgendaing-6" und der JavaScript Bibliothek "SpeedAgendaing-Step6.js".

Beim nächsten Artikel werden wir unser Beispiel dahingehend erweitern, dass beim Klick auf das Referentenbild ebenfalls der Dialog angeziegt wird.

Fachbeitrag HCL Domino JavaScript Entwicklung

Sie haben Fragen zu diesem Artikel? Kontaktieren Sie uns gerne: blog@assono.de

Sie haben Interesse an diesem Thema?

Gerne bieten wir Ihnen eine individuelle Beratung oder einen Workshop an.

Kontaktieren Sie uns

Weitere interessante Artikel

Sie haben Fragen?

Wenn Sie mehr über unsere Angebote erfahren möchten, können Sie uns jederzeit kontaktieren. Gerne erstellen wir eine individuelle Demo für Sie.

assono GmbH

Standort Kiel (Zentrale)
assono GmbH
Lise-Meitner-Straße 1–7
24223 Schwentinental

Standort Hamburg
assono GmbH
Bornkampsweg 58
22761 Hamburg

Telefonnummern:
Zentrale: +49 4307 900 407
Vertrieb: +49 4307 900 411

E-Mail-Adressen:
kontakt@assono.de
bewerbung@assono.de