JavaScript Beispiele Teil 3

JavaScript Beispiele Teil 3 zur Lösung von Anforderungen mit den Frontend Webassets

Hinweis: Diese Features sind Teil der Visforms Subscription und in der freien Visforms Version nicht enthalten.

Altersüberprüfung

Themen

Die folgenden Themen sind im Beispiel enthalten:

  • Code erst dann ablaufen lassen, nachdem das Formular seitens Visforms initialisiert wurde.
  • Auf Änderungen durch den Benutzer reagieren.
  • Ermitteln des Datums-Wertes als Text von einem Datums-Feld.
  • Rechnen mit Datums-Wert als Text und einem Datum-Objekt.
  • Berechnung des Alters in Jahren unter Berücksichtigung der Schaltjahre mit Schalttagen.
  • Betroffene Felder anhand ihrer Feld-ID ansprechen.
  • Ein Listbox-Feld unsichtbar machen.
  • Setzen von Optionen eines Listbox-Feldes.
  • Abwahl der aktuellen Option eines Listbox-Feldes.

Beschreibung

Der Benutzer wählt ein Geburtsdatum aus. Ja nachdem, ob das sich dadurch ergebende Alter eine Volljährigkeit bedeutet oder nicht, werden unterschiedliche weitere Felder angezeigt. Ist kein Datum ausgewählt, so sind keine zusätzlichen Felder zu sehen. Die jeweils zusätzlichen Felder für Volljährigkeit und Minderjährigkeit sind alles Bedingte Felder.

Die Anzeige dieser Bedingten Felder wird durch die Auswahl in einem später unsichtbaren Steuer-Feld vom Typ Listbox gesteuert:

  • Bei keiner Auswahl werden keine zusätzlichen Felder angezeigt.
  • Bei Auswahl der Option 0 mit Wert 0 werden die Felder zur Minderjährigkeit angezeigt.
  • Bei Auswahl der Option 1 mit Wert 1 werden die Felder zur Volljährigkeit angezeigt.

Die Auswahl des unsichtbaren Steuer-Feldes vom Typ Listbox wird durch den JavaScript-Code durchgeführt. Der JavaScript-Code berechnet das Alter anhand des gewählten Geburtsdatums und setzt die entsprechende Option des Steuer-Feldes. Ist kein Geburtsdatum gesetzt oder wird es durch den Benutzer zurückgesetzt, so wird die Steuer-Listbox auf keine Auswahl gesetzt.

Es können beliebig viele Bedingte Felder mit dieser Logik (Volljährigkeit oder Minderjährigkeit oder keine Angabe) angezeigt und ausgeblendet werden.

Die Formular-Felder

Das Formular hat folgende 4 Felder:

  • birth-date: Feld vom Typ Datum: Auswahl des Geburtsdatums.
  • select-helper’: Feld vom Typ Listbox:
    Listbox als Steuer-Feld mit den 3 Zuständen:
    • Nichts ausgewählt.
    • 0 ausgewählt.
    • 1 ausgewählt.
  • text-minor: Feld vom Typ Text:
    Texteingabe für den Fall ‘minderjährig’. Bedingtes Feld, erscheint nur für Listbox = 0.
  • text-adult: Feld vom Typ Text:
    Texteingabe für den Fall ‘Erwachsener’. Bedingtes Feld, erscheint nur für Listbox = 1.

Das Formular

Das Formular ohne Konfiguration und ohne eigenen JavaScript-Code

Das Formular ohne Konfiguration und ohne eigenen JavaScript-Code

Das Formular mit Konfiguration aber ohne eigenen JavaScript-Code

Das Steuer-Feld ist noch sichtbar. Die Optionen im Steuer-Feld werden noch manuell ausgewählt. Später führt der JavaScript-Code führt die Auswahl der Optionen anhand des gewählten Geburtsdatums automatisch durch.

Kein Wert im Steuer-Feld ausgewählt. Weder Feld text-minor noch Feld text-adult sind sichtbar. Das Formular mit Konfiguration und ohne eigenen JavaScript-Code Wert 0 im Steuer-Feld ausgewählt. Das Feld text-minor ist sichtbar. Wert '0' im Steuer-Feld ausgewählt Wert 1 im Steuer-Feld ausgewählt. Das Feld text-adult ist sichtbar. Wert '1' im Steuer-Feld ausgewählt

Das Formular mit eigenem JavaScript-Code

Das Steuer-Feld wird durch den JavaScript-Code versteckt. Der JavaScript-Code führt die Auswahl der Optionen im Steuer-Feld anhand des gewählten Geburtsdatums automatisch durch.

Kein Geburtsdatum ausgewählt.
Weder Feld text-minor noch Feld text-adult sind sichtbar. Kein Geburtsdatum ausgewählt Ein junges Geburtsdatum ausgewählt.
Das Feld text-minor ist sichtbar. Ein junges Geburtsdatum ausgewählt Ein älteres Geburtsdatum ausgewählt.
Das Feld text-adult ist sichtbar. EEin älteres Geburtsdatum ausgewählt

Die Formular-Konfiguration

Der JavaScript-Code wird in der Formular-Konfiguration, Reiter Frontend Webassets auf dem Unter-Reiter Formular in das Options-Feld JavaScript eingetragen:

  • Formular-Konfiguration » Reiter: Frontend Webassets » Unter-Reiter Formular

    Parameter: JavaScript = Der JavaScript-Code.

Formular-Konfiguration

Der JavaScript-Code

// console.log('FEWA script loaded');
document.addEventListener('visformsInitialised', () => {
    // console.log('visformsInitialised')
    const dateFieldID   = '103'; // Visforms date field ID of field list
    const selectFieldID = '104'; // Visforms select field ID of field list
    const dateField = document.getElementById(`field${dateFieldID}`);
    const selectFieldContainer = document.querySelector(`div.field${selectFieldID}`);
    const selectField = document.getElementById(`field${selectFieldID}`);
    const options = selectField.options;
    const count = options.length;
    selectFieldContainer.classList.add('visinvisible');
    dateField.addEventListener('change', (e) => {
        let value = e.target.value;
        if('' === value) {
            for (let i = 0; i < count; i++) {
                selectField.options[i].selected = false;
            }
            selectField.dispatchEvent(new Event('change'));
            return;
        }
        let verify  = 18;
        let reached = minage(value, null, {minage : verify});
        if(reached) {
            selectField.value = 1;
        }
        else {
            selectField.value = 0;
        }
        selectField.dispatchEvent(new Event('change'));
    })
});

function minage(value, element, options) {
    let check = false, minage = "", age = "", format, i = 0, fmt = {}, valueParts, years, now = new Date();
    // a date is selected
    if (value) {
        // no minage set
        if (options.minage) {
            minage = options.minage;
        } else {
            return true;
        }
        // get year, month and day from selected date in the currently used format
        format = (value.indexOf(".") > -1) ? "dd.mm.yyyy" : ((value.indexOf("/") > -1) ? "mm/dd/yyyy" : "yyyy-mm-dd");
        format.replace(/(yyyy|dd|mm)/g, function (part) {
            fmt[part] = i++;
        });
        valueParts = value.match(/(\d+)/g);
        value = new Date(valueParts[fmt["yyyy"]], valueParts[fmt["mm"]] - 1, valueParts[fmt["dd"]], 0, 0, 0, 0);
        // get the difference between the year of now and the selected date
        years = now.getFullYear() - value.getFullYear();
        // set year in selected date to current year
        value.setFullYear(value.getFullYear() + years);
        // if the selected date is then in the future, subtract 1 from years, because the last year is not yet completed
        if (value > now) {
            years--;
        }
        check = years >= minage;
        return check;
    }
}

Folgende Anpassungen an Ihre Situation sind notwendig:

  • const dateFieldID = ‘103' Die Visforms Datums-Feld-ID aus der Feldliste.
  • const selectFieldID = ‘104' Die Visforms Listbox-Feld-ID aus der Feldliste (Steuer-Feld).
  • let verify = 18 Das Alter auf das geprüft werden soll.
    Im Falle von Volljährigkeit oder Minderjährigkeit ist keine Änderung notwendig.

Die Funktion ‘minage()’ ist eine direkte Kopie aus dem Visforms-Code zur Validierung. Diese Funktion ist ab der Visforms Version 5.1.0 im Code von Visforms enthalten.

Der obige JavaScript-Code

  • Versteckt die Listbox select-helper.
  • Steuert die Listbox select-helper entsprechend der Angabe des Datums in Feld birth-date.

Reset-Button mit Abfrage

Themen

Die folgenden Themen sind im Beispiel enthalten:

  • Code erst dann ablaufen lassen, nachdem das Formular seitens Visforms initialisiert wurde.
  • Auf Button-Klick durch den Benutzer reagieren.
  • Betroffene Felder anhand ihrer Feld-ID ansprechen.
  • Dem Reset-Button einen zusätzlichen OnClick-Button-Handler hinzufügen.
  • Den zusätzlichen OnClick-Button-Handler an die erste Position innerhalb der OnClick-Button-Handler-Liste des Reset-Buttons setzen.
  • Den Benutzer durch eine Abfrage mittels Ja-Nein-Dialog entscheiden lassen.
  • Auf die Ja-Nein-Entscheidung des Benutzers reagieren.
  • Die Ausführung aller anderen OnClick-Button-Handler des Reset-Buttons unterbinden.

Beschreibung

Es ist möglich dem Formular einen Reset-Button hinzuzufügen. Dem Formular wird ein Reset-Button hinzugefügt, indem das Formular ein Feld mit Feld-Typ Reset Button erhält. Ein Feld mit Feld-Typ Reset Button wird im Formular automatisch an die richtige Stelle platziert, zusammen mit den anderen Buttons des Formulars. Ein Feld mit Feld-Typ Reset Button erhält seine Aufschrift aus der Angabe seines Feld-Labels.

Durch Klick auf den Reset-Button werden alle bisherigen Eingaben gelöscht. Zwischen dem Klick auf den Reset-Button und dem Löschen aller bisherigen Eingaben soll eine zusätzliche Abfrage erfolgen. Die zusätzliche Abfrage stellt sicher, dass der Benutzer seine gemachten Eingaben nicht aus Versehen löscht.

Das Formular

Der Benutzer hat Eingaben in den Feldern First Name und Last Name gemacht. Anschließend klickt der Benutzer bewusst oder aus Versehen auf den Button Reset.

Reset-Button im Formular

Nach Klick auf den Button Reset erhält der Benutzer die Möglichkeit, das Reset seiner Angaben zu verhindern. Nach Klick auf den Button Abbrechen erscheint das Formular ohne Änderungen an den bereits gemachten Angaben. Nach Klick auf den Button OK werden alle bisherigen Angaben gelöscht und es erscheint das leere Formular.

Reset-Button mit Abfrage

Der JavaScript-Code

Der JavaScript-Code verwendet für dieses Beispiel die verbreitetet JavaScript-Bibliothek jQuery aus dem folgenden Grund.

Um das gleiche Verhalten mit reinem JavaScript zu erreichen, gibt es eine wichtige Einschränkung: Standard-JavaScript bietet keinen direkten Zugriff auf eine Liste der registrierten Event-Listener. jQuery erreicht das über seine eigene interne _data() Funktionalität.

Um dieses Problem zu lösen, muss die native Methode addEventListener erweitert werden (patchen), um die registrierten Funktionen in einem eigenen Array mitzuverfolgen. Diese Lösung in reinem JavaScript ist für dieses Beispiel unverhältnismäßig aufwendig. Außerdem gibt es keine Garantie dafür, dass nicht gleichzeitig anderer JavaScript-Code existiert, der die Events ursprünglich registriert. In dem Fall müssten darüber hinaus alternative Ansätze wie Event-Capturing oder das Klonen des Elements eingesetzt werden.

Hinweis: Es sind in der Regel für diesen Beispiel-Code keine Anpassungen an Ihre Situation notwendig. Der Reset-Button wird anhand seines Input-Types unabhängig von seiner Feld-ID erkannt.

// console.log('FEWA script loaded');
document.addEventListener('visformsInitialised', () => {
    // console.log('visformsInitialised')
    // timeout: make sure all foreign event listener handlers are attached
    window.setTimeout(function () {
        // button click handler has to be at the top of click event listener list to get called first
        // add own event handler as last in the event listener list
        const button = jQuery("input[id^='field'][type='reset']");
        button.on('click', function(event) {
            if (!confirm('Clear all inputs?')) {
                event.stopImmediatePropagation();
                return false;
            }
        });
        // move own event handler from last in list to top of the list
        let eventList = jQuery._data(button[0], "events");
        eventList.click.unshift(eventList.click.pop());
    }, 500);
});