Umfrage auf Ihrer eigenen Website einbetten
Grober Ablauf
- Aktivieren Sie die Einbettung in den Kanaleinstellungen
- Erstellen Sie einen iframe auf Ihrer Seite und laden Sie die Kanal-URL
- Warten Sie auf eine Post Message mit dem Ladestatus der Umfrage und entscheiden Sie, ob Sie den iframe anzeigen möchten oder nicht
- Wenn der Benutzer das Formular abgeschlossen hat, erhalten Sie eine weitere Post Message, damit Sie den iframe ausblenden können
Informationen, die Sie in die URL einfügen können (optional)
Die folgenden Einstellungen können der Kanal-URL als Suchparameter hinzugefügt werden
Parameter | Werte | Beschreibung |
---|---|---|
language | en, et, de, fr | Wenn nicht angegeben, wird standardmäßig internationales Englisch verwendet |
theme | light, dark | Wenn nicht angegeben, wird die Browser-Einstellung des Benutzers berücksichtigt |
transparent | true, false | Wenn wahr (true), wird der Seitenhintergrund transparent |
payload | string | Weitere Informationen finden Sie in der Dokumentation zu sicheren Links |
Nachrichten, die wir empfangen können
{
"message": "theme-change",
"theme": "light" // "light", "dark"
}
Nachrichten, die wir senden
{
"message": "survey-ready"
}
{
"message": "survey-completed"
}
Vereinfachtes Beispiel für React
import { cn } from "@workspace/ui/lib/utils";
import { useCallback, useEffect, useRef, useState } from "react";
import * as v from "valibot";
const PostMessages = v.variant("message", [
v.object({
message: v.literal("survey-ready"),
}),
v.object({
message: v.literal("survey-completed"),
}),
]);
export function EmbeddedWidget() {
const [visible, setVisible] = useState(false);
const surveyRef = useRef<HTMLIFrameElement>(null);
const theme = useTheme();
// Nachrichten vom iframe verarbeiten
const handlePostMessage = useCallback((event: MessageEvent) => {
if (event.origin !== "https://youropinion.is") {
return null;
}
const message = v.parse(PostMessages, event.data);
if (message.message === "survey-ready") {
setVisible(true);
} else if (message.message === "survey-completed") {
setVisible(false);
}
}, []);
// Auf Nachrichten vom iframe lauschen
useEffect(() => {
window.addEventListener("message", handlePostMessage);
return () => {
window.removeEventListener("message", handlePostMessage);
};
}, []);
// Beispiel, wie eine Nachricht an den iframe gesendet wird
useEffect(() => {
if (surveyRef.current) {
surveyRef.current.contentWindow?.postMessage({ message: "change-theme", theme }, "*");
}
}, [theme]);
return (
<div
className={cn(
"h-[400px] w-[400px] fixed right-24 bottom-24 opacity-0 transition-opacity duration-1000",
{
"opacity-100": visible,
}
)}
>
<iframe
src={`https://youropinion.is/snap/xxx/c/yyy?theme=${theme}&transparent=true`}
className="w-full h-full"
ref={surveyRef}
/>
</div>
);
}