So ganz kommt man um Javascript im Realtime Marketing Formular in Customer Insights nicht rum. Und ich habe bereits ein paar Artikel mit Beispielen geschrieben, aber trotzdem suche ich jedes Mal aufs Neue nach den passenden Skripten. Das kostet Zeit und Nerven. Daher stelle ich hier eine Bibliothek mit Skripten und Anwendungsbeispielen für Marketingformulare zusammen, in der Hoffnung, dass sie uns allen den Alltag etwas erleichtert.
Falls du weitere Ideen oder Anwendungsfälle hast, die wir ergänzen können, melde dich gerne bei mir 🙂
Inhalt
Unterschied Realtime Marketing Formular und Preference Center
Javascript für das Preference Center und das Realtime Marketing Formular in Customer Insights werden unterschiedlich getriggert. Was in Preference Centern funktioniert, funktioniert nicht unbedingt in Marketing Formularen!
Damit das Javascript im Preference Center funktioniert, sieht du unten im Code zwei Möglichkeiten, wie du die Funktion einleiten kannst.
document.addEventListener('DOMContentLoaded', function() {
***add script here***});
ODER
Für Realtime Marketing Formulare können wir die Javascript so nutzen, wie sie in der Dokumentation von Microsoft beschrieben sind: Dokumentation
Je nachdem wann das Javascript laufe soll, kann man verschiedene EventListener verwenden:
- d365mkt-beforeformload
- d365mkt-afterformload
- d365mkt-formrender
- d365mkt-formsubmit
- d365mkt-afterformsubmit
document.addEventListener('d365mkt-afterformload', function () { ***add script here***});
Wo gehört das Javascript hin?
Seit noch gar nicht so langer Zeit verwandelt sich der <script>-Tag in einen <safescript>-Tag.
Ab der Version 1.1.38813.80 oder neuer kannst du den JavaScript-Code in den <body>-Abschnitt des HTML einfügen. Wenn du das Javascript in den <head>-Abschnitt einfügen, wird es automatisch an den Anfang des <body>-Abschnitts verschoben. Der <script>-Tag wird automatisch in <safe-script> umbenannt, um die Ausführung von Skripten im Formulareditor zu verhindern. Der <safe-script>-Tag wird dann im endgültigen HTML-Formular automatisch wieder in <script> umbenannt.
Das Formular HTML hat also folgenden Aufbau:
***meta tags***
Alle Checkboxen auswählen
Über die Funktion Alle Auswählen habe ich bereits einen Blogartikel geschrieben. Der Vollständigkeit ergänze ich dieses Javascript hier auch.
Zuerst baue ich mit HTML eine Select All Checkbox. Diese muss ja kein „echtes“ Feld vom Kontakt sein. Wenn die Checkbox angehakt wird, sollen die beiden Purpose-Felder angehakt werden.
document.addEventListener('d365mkt-afterformload', function () {
const selectAllCheckbox = document.getElementById("selectall");
const consentCheckboxes = document.querySelectorAll('[id^="consent"]');
var l = consentCheckboxes.length;
selectAllCheckbox.addEventListener('change', selectAll);
function selectAll() {
if (selectAllCheckbox.checked === true) {
for (var i = 0; i < l; i++) {
consentCheckboxes[i].checked = true;
}
} else {
for (var i = 0; i < l; i++) {
consentCheckboxes[i].checked = false;
}}}
});
Ein Feld ein- und ausblenden
Als einer meiner ersten Artikel hatte ich ein Beispiel wie man ein Feld ein und ausblendet. Standardmäßig wird das Feld versteckt und nur eingeblendet, wenn eine Checkbox angehakt wird.
In diesem Javascript definiere ich die Variable customer, die ich über den Namen meines Custom Ja/Nein-Felds finden kann. Und wenn das Feld angehakt ist, sucht das Skript nach dem Kundennummer-Feld, ebenfalls über den technischen Namen. Ich könnte stattdessen auch vor der Funktion eine Variable für das Kundennummer definieren. Das zeige ich in dem nächsten Skript.
document.addEventListener('d365mkt-afterformload', function () {
let customer = document.querySelector('input[name="pk_existingcustomer"]');
document.querySelector('input[name="pk_customernumber"]').style.display = 'none';
customer.addEventListener('change', showCustomerNumber);
function showCustomerNumber() {
if (customer.checked === true) {
document.querySelector('input[name="pk_customernumber"]').style.display = 'block';
}
else {
document.querySelector('input[name="pk_customernumber"]').style.display = 'none';
}
}});
Mehrere Felder (Topics) ein- und ausblenden
In diesem Beispiel möchte ich die Topics nur anzeigen, wenn der zugehörige Purpose angehakt wurde. Ich habe mehrere Purposes mit jeweils mehreren Topics.
In diesem Javascript definiere ich zuerst die Variablen für die Purpose und Topic Checkboxen. Das macht die Funktion anschließend übersichtlicher. Immer wenn eins der Purpose Checkboxen angehakt wird, läuft eine forEach Schleife, die die Topics, des jeweilien Purposes anzeigt oder versteckt.
document.addEventListener('d365mkt-afterformload', function () {
const purpose1 = document.getElementById('consentCheckbox-1718980818012');
const purpose2 = document.getElementById('consentCheckbox-1718980833715');
const topicCheckboxes1 = document.querySelectorAll('.topicCheckbox1');
const topicCheckboxes2 = document.querySelectorAll('.topicCheckbox2');
// Function to handle the display of topic checkboxes based on purpose1's state
function handleTopicCheckboxes1() {
topicCheckboxes1.forEach(function (checkbox) {
checkbox.style.display = purpose1.checked ? 'block' : 'none';
});
}
// Function to handle the display of topic checkboxes based on purpose2's state
function handleTopicCheckboxes2() {
topicCheckboxes2.forEach(function (checkbox) {
checkbox.style.display = purpose2.checked ? 'block' : 'none';
});
}
// Attach event listeners
purpose1.addEventListener('change', function(event) {
handleTopicCheckboxes1();
});
purpose2.addEventListener('change', function(event) {
handleTopicCheckboxes2();
});
// Initial hiding of all topic checkboxes
handleTopicCheckboxes1();
handleTopicCheckboxes2();
});
Button aktivieren / deaktivieren (ausgrauen)
Anstelle von Pflichtfeldern, die verhindern, dass man ein Formular abschicken kann, kann man auch den Submit-Button ausgrauen, bis alle erforderlichen Felder ausgefüllt sind.
Dafür musst du zuerst dem Button eine passende id geben und standardmäßig ausgrauen bzw. deakvieren. Im Javascript können dann die Bedingungen eingefügt werden, die den Button wieder aktivieren.
document.addEventListener('d365mkt-afterformload', function () {
const purpose1 = document.getElementById('consentCheckbox-1718980818012');
const submit = document.getElementById("submitButton");
purpose1.addEventListener('change', enableButton);
function enableButton() {
if (purpose1.checked === true) {
submit.disabled = false;
submit.style.backgroundColor = 'green';
}
else {
submit.disabled = true;
submit.style.backgroundColor = 'red';
}}});
Felder aktivieren / deaktivieren (ausgrauen)
Das folgende Javascript definiert, wie man ein Feld bei bestimmten Bedingung ausgraut oder wieder beschreibbar macht. In meinem Beispiel darf man nur eine der Purpose-Checkboxen anhaken.
document.addEventListener('d365mkt-afterformload', function() {
const purpose1 = document.getElementById('consentCheckbox-1718980818012');
const purpose2 = document.getElementById('consentCheckbox-1718980833715');
purpose1.addEventListener('change', handleCheckboxChange);
purpose2.addEventListener('change', handleCheckboxChange);
function handleCheckboxChange(event) {
if (purpose1.checked) {
purpose2.disabled = true;
} else {
purpose2.disabled = false;}
if (purpose2.checked) {
purpose1.disabled = true;
} else {
purpose1.disabled = false;}
}
});
Option Set im Javascript
Häufiger als Lookups kommen Option Sets im Marketing Formular vor. Dieses Javascript blendet Felder ein, wenn ein bestimmter Wert im Option Set ausgewählt wird.
P.S. Danke an Jean-Paul und seinen Kollegen Rob für den Anstoß und das Grundgerüst für das Javascript:)
document.addEventListener("d365mkt-afterformload", function() {
var feedbackRating = document.querySelector('[data-targetproperty="pk_feedbackrating"] select');
var feedbackReason = document.querySelector('[data-targetproperty="pk_feedbackreason"]');
feedbackReason.style.display = 'none';
//function to hide or show the reason field
function toggleFeedbackReason(display) {
feedbackReason.style.display = display ? 'block' : 'none';
}
//Show reason field only when feedback is satisfied
feedbackRating.addEventListener('change', function() {
toggleFeedbackReason(this.value === '125550000');
})});
Option Set Wert im Javascript ausfüllen
Anstelle auf die Änderung eines Option Sets zu reagieren und Felder ein- und auszublenden, kann es auch notwendig sein einen Option Set werden automatisch auszufüllen. In meinem Beispiel möchte ich die Priorätit des Kontakts automatisch auf Basis seines Feedbacks ändern. Wenn das Feedback negativ ist, soll die Priorität hoch sein, wohingegen positiv Feedback keine schnelle Handlung erfordert.
document.addEventListener("d365mkt-afterformload", function() {
// Get the feedback rating and priority select elements
var feedbackRatingSelect = document.getElementById("pk_feedbackrating-1719156066672");
var prioritySelect = document.getElementById("pk_priority-1719157920040");
// Function to update the priority based on the feedback rating
function updatePriority() {
var feedbackRating = feedbackRatingSelect.value;
if (feedbackRating === "125550000") { // Satisfied
prioritySelect.value = "0"; // Low
} else if (feedbackRating === "125550001") { // Neutral
prioritySelect.value = "1"; // Medium (Normal)
} else if (feedbackRating === "125550002") { // Dissatisfied
prioritySelect.value = "2"; // High
} else {
prioritySelect.value = ""; // Default
}
}
// Add event listener to feedback rating select element
feedbackRatingSelect.addEventListener("change", updatePriority);
});
Redirect nach Formularübermitlung
Dieses Skript benötigen wir momentan nur für Preference Center. Im Marketing Formular gibt es zum Glück ein Feld, in dem man einfach die URL eintragen kann. Megan Walker hat einen besseren und ausführlicheren Artikel zu Redirect geschrieben. Den findet ihr hier.
Wichtig ist vorallem die Zeit, wann jemand weitergeleitet wird. In meinem Code sind es 1000 Millisekunden. Mir ist aber aufgefallen, dass z.B. Iphone oder Safari eine längere Wartezeit braucht, damit auch das Formular richtig übermittelt wird. Also am besten gut testen!
document.addEventListener("DOMContentLoaded", function() {
var form = document.querySelector("form");
form.addEventListener("submit", function() {
// Replace the URL with your desired redirect URL
setTimeout(function() {
window.location.href = "https://paulinekolde.info";
}, 1000);
});
});
Redirect nach Formularübermitlung
Dieses Skript benötigen wir momentan nur für Preference Center. Im Marketing Formular gibt es zum Glück ein Feld, in dem man einfach die URL eintragen kann. Megan Walker hat einen besseren und ausführlicheren Artikel zu Redirect geschrieben. Den findet ihr hier.
Wichtig ist vorallem die Zeit, wann jemand weitergeleitet wird. In meinem Code sind es 1000 Millisekunden. Mir ist aber aufgefallen, dass z.B. Iphone oder Safari eine längere Wartezeit braucht, damit auch das Formular richtig übermittelt wird. Also am besten gut testen!
document.addEventListener("DOMContentLoaded", function() {
var form = document.querySelector("form");
form.addEventListener("submit", function() {
// Replace the URL with your desired redirect URL
setTimeout(function() {
window.location.href = "https://paulinekolde.info";
}, 1000);
});
});
Ländervorwahl für Telefonnummern dynamisch ändern
Die Standardfunktionalität für die Landesvorwahl vereinfacht die Eingabe der Rufnummer. Aber: Der Wert der Landesvorwahl ist statisch. Jedes Land hat aber eine eigene Landesvorwahl. Und gerade für internationale Kunden muss es möglich sein, dass sich die Werte je nach Land des Kunden ändern.
Dieses Javascript ändert den Ländercode – je nachdem, welches Land der Kunde auswählt. Das Länderfeld in meinem Beispiel ist ein Optionssatz.
Im HTML des Feldes „Business Phones“ können Sie sehen, dass es zwei Attribute gibt, die den Ländercode enthalten. Wenn ich nur die Klasse phoneCountryCodeLabel über das Javascript ändere, habe ich das Problem, dass der erstellte oder aktualisierte Kontaktdatensatz immer noch +49 im Telefonfeld enthält. Wenn ich also nur das Label ändere, ist das nur eine Änderung im Frontend, es sieht zwar korrekt aus, aber der Wert wird nicht korrekt übertragen. Aus diesem Grund muss das Javascript auch den data-countrycode auf Basis des Landes anpassen.
document.addEventListener("d365mkt-afterformload", function() {
const countrySelect = document.getElementById('pk_countrycode-1719506023770');
const phonePrefixSpan = document.querySelector('.phoneCountryCodeLabel');
const phoneInputDiv = document.querySelector('.phoneFormFieldBlock');
const countryPhonePrefixes = {
'125550000': '+376', // Andorra
'125550001': '+32', // Belgium
'125550002': '+358', // Finland
'125550005': '+33', // France
'125550003': '+49', // Germany
'125550008': '+39', // Italy
'125550010': '+47', // Norway
'125550007': '+351', // Portugal
'125550006': '+34', // Spain
'125550009': '+46', // Sweden
'125550004': '+44' // UK
};
countrySelect.addEventListener('change', function () {
const selectedValue = countrySelect.value;
if (countryPhonePrefixes.hasOwnProperty(selectedValue)) {
const newPrefix = countryPhonePrefixes[selectedValue];
phonePrefixSpan.textContent = newPrefix;
phoneInputDiv.setAttribute('data-countrycode', newPrefix);
} else {
phonePrefixSpan.textContent = ''; // Default to empty if no match found
phoneInputDiv.removeAttribute('data-countrycode');
}
});
});
***Hinweis: Der Inhalt ist zum Zeitpunkt der Erstellung korrekt. Microsoft mag in der Zwischenzeit Änderungen vorgenommen haben.***
Schau dir auch die FAQs in meinem Blog an: Kurze Fragen – schnelle Antworten! Zu den FAQs