0 votes
in SoSci Survey (dt.) by s068944 (400 points)

Ich möchte den zu Befragenden eine Bild-Datei (z.B. im jpg-Format), genauergesagt ein Digramm, vorgeben, in das sie etwas zeichnen können sollen (eine Linie mit individuellem Verlauf). Geht das?
Für Ihre Hilfe besten Dank im Voraus !

1 Answer

0 votes
by SoSci Survey (305k points)

Sie finden beim Anlegen einer neuen Frage in der Kategorie Funktionale Bausteine ganz unten eine Vorlage Einfache Zeichenfläche.

Basierend darauf können Sie auch eine Grafik vorgeben, die dann bemalt werden kann. Details gerne auf Nachfrage.

by s068944 (400 points)
Vielen Dank für die Antwort. Wie kann ich denn die vorgegebene Grafik einfügen? Vmtl. irgendwo im HTML-Code? Ich habe sie hier als jpg-Datei vorliegen.
by SoSci Survey (305k points)
In dem JavaScript-Code der Zeichenfläche finden Sie eine Funktion
function onUndo()

Dort ist im Prinzip der Code, den Sie benötigen. Kopieren Sie die Funktion, geben Sie ihr einen neuen Namen und dort wo steht

canvasPic.src = recent;

für Sie statt recent den Datenamen des Bildes ein, das Sie laden möchten, also z.B.

canvasPic.src = "bild-beispiel.jpg";

Vor der letzten schließenden geschweiften Klammern fügen Sie dann einen Aufruf auf Ihre neu angelegte Funktion ein.
by s068944 (400 points)
Hi,
vielen Dank für die Antwort. Den ersten Teil habe ich, glaube ich verstanden und umsetzen können (ich habe den Bildnamen in Anführungszeichen gesetzt so wie von Ihnen oben beschrieben. Ich hoffe, das ist richtig so oder lasse ich die Anführungszeichen weg?)
Den letzten Satz von Ihrem Kommentar (Vor der letzten schließenden geschweiften Klammern fügen Sie dann einen Aufruf auf Ihre neu angelegte Funktion ein.) verstehe ich leider nicht. Wie kann ich das machen?
by SoSci Survey (305k points)
Die Anführungszeichen benötigen Sie, sonst denkt JavaScript, Sie meinen eine Variable und keinen Dateinamen.

Wie heißt denn Ihre neue Funktion, die Sie definiert haben? ("Kopieren Sie die Funktion")
by s068944 (400 points)
Ich weiß ehrlich gesagt nicht, was da alles zur Funktion gehört:

    });
    ctx.clearRect(0, 0, canvas.width, canvas.height);
    canvasPic.src = "Lebenskurve.jpg";
  }

Ich vermute: "canvasPic.src = "Lebenskurve.jpg""? Das würde ich dann einfach nochmal vor der letzten geschweiften schließenden Klammer einfügen?

Ist es richtig, dass ich das Bild dafür unter "Bilder und Mediendateien" hochladen muss?
by SoSci Survey (305k points)
Eine Funktion fängt mit function() an und endet, wenn genauso viele geschweifte Klammern geschlossen wie geöffnet wurden.

Ob es schon reicht, die eine Zeile in der Funktion zum Zurücksetzen der Zeichenfläche einzuarbeiten oder nicht, das müssen wir uns dann live ansehen.

> Ist es richtig, dass ich das Bild dafür unter "Bilder und Mediendateien" hochladen muss?

Ja, sonst hat das JavaScript (das ja bei der Nutzer:in im Browser läuft) keinen Zugriff auf das Bild.
by s068944 (400 points)
Hallo, ich fürchte, ich begreife es einfach nicht. Ich füge Ihnen mal den HTML-Code ein, so wie ich ihn jetzt angepasst habe:

<div style="text-align: center;">
  <canvas id="%q.id%canvas" width="300" height="300" style="border: 1px solid #CCCCCC;"></canvas>
</div>
<!-- Note: Remove buttons as required -->
<div style="display: flex; justify-content: space-between; width: 300px; margin: 1em auto 2em;">
    <button type="button" id="%q.id%btnUndo" title="Rückgängig">◀</button>
    <button type="button" id="%q.id%btnClear" title="Bild löschen">Nochmal von vorne</button>
    <button type="button" id="%q.id%btnSend">Fertig, Weiter</button>
</div>

<script>
function Scribbler(qID, canvas) {
  var state = "new";  // new, init, changed, sent
  var ctx = canvas.getContext('2d');
  // Start white
  ctx.fillStyle = "#FFFFFF";
  ctx.fillRect(0, 0, canvas.width, canvas.height);
  var isDrawing = false;
  var btnClear = document.getElementById("%q.id%btnClear");
  var btnSend = document.getElementById("%q.id%btnSend");
  var btnUndo = document.getElementById("%q.id%btnUndo");
  var steps = [];

  function getPos(e) {
    var org = SoSciTools.getNodePos(canvas);
    var pos = SoSciTools.getMousePos(e);
    return {
      x : pos.x - org.x,
      y : pos.y - org.y
    };
  }

  function onDown(e) {
    state = "changed";
    storeStep();
    isDrawing = true;
    ctx.beginPath();
    ctx.lineWidth = 5;
    ctx.shadowBlur = 1;
    ctx.lineJoin = ctx.lineCap = 'round';
    ctx.shadowColor = 'rgb(0, 0, 0)';
    var pos = getPos(e);
    ctx.moveTo(pos.x, pos.y);
    // Draw first dot
    onMove(e);
  }

  function onMove(e) {
    if (!isDrawing) {
      return;
    }
    var pos = getPos(e);
    ctx.lineTo(pos.x, pos.y);
    ctx.stroke();
  };

  function onUp() {
    isDrawing = false;
  };

  function onStop() {
    isDrawing = false;
  }

  function onClear() {
    ctx.clearRect(0, 0, canvas.width, canvas.height);
  }

  function storeStep() {
    steps.push(canvas.toDataURL());
  }

  function onUndo() {
    // based on https://www.codicode.com/art/undo_and_redo_to_the_html5_canvas.aspx
    if (steps.length === 0) {
      return;
    }
    var recent = steps.pop();
    var canvasPic = new Image();
    canvasPic.addEventListener("load", function () {
      ctx.drawImage(canvasPic, 0, 0);
    });
    ctx.clearRect(0, 0, canvas.width, canvas.height);
    canvasPic.src = "Lebenskurve.jpg";
}

  // Enable all the events
  if (Modernizr.pointerevents) {
    canvas.addEventListener("pointerdown", onDown, false);
    canvas.addEventListener("pointermove", onMove, false);
    canvas.addEventListener("pointerup", onUp, false);
    canvas.addEventListener("pointerout", onStop, false);
  } else {
    SoSciTools.attachEvent(canvas, ["mousedown", "touchstart"], onDown);
    SoSciTools.attachEvent(canvas, ["mousemove", "touchmove"], onMove);
    SoSciTools.attachEvent(canvas, ["mouseup", "touchend"], onUp);
    SoSciTools.attachEvent(canvas, ["mouseout", "touchcancel"], onStop);
  }

  if (btnClear) {
    btnClear.addEventListener("click", function() {
      if (confirm("Möchten Sie das Bild löschen?")) {
        onClear();
      }
    });
  }

  if (btnUndo) {
    btnUndo.addEventListener("click", onUndo);
  }
  
  // File transfer part
  function sendImage() {
    var imageBlob = canvas.toBlob(%q.id%.sendBLOB);
    state = "sent";
    return true;
  }

  // Function to be called when the blob is to be send
  function blobGetter(blobHandler) {
    // Only send something when changed since init or sent
    if (state !== "changed") {
      return false;
    }
    canvas.toBlob(blobHandler);
    state = "sent";
    return true;
  }

  // Use custom send button
  if (btnSend) {
    // Use custom submit button
    btnSend.addEventListener("click", sendImage);
    // Hide original button
    SoSciTools.submitButtonsHide();
  }

  // Alway send on form submission
  window.addEventListener("load", function() {
    %q.id%.registerOnSubmit(blobGetter);
  });
  function onUndo() {
    // based on https://www.codicode.com/art/undo_and_redo_to_the_html5_canvas.aspx
    if (steps.length === 0) {
      return;
    }
}

new Scribbler("%q.id%", document.getElementById("%q.id%canvas"));
</script>

Können Sie mir da bitte nochmal weiterhelfen, warum es noch nicht funktioniert (weder sehe ich das jpg-Bild, sondern eine weiße Zeichenfläche, noch kann ich etwas einzeichnen)?
by SoSci Survey (305k points)
Posten Sie bitte noch einen Pretest-Link zur betroffenen Seite? Danke.
by SoSci Survey (305k points)
Die Fehlerkonsole im Browser sagt:

Uncaught SyntaxError: missing } after function body

Soweit ich sehe, fehlt einfach eine Klammer bei der letzten Methode in der Klasse:

  function onUndo() {
    // based on https://www.codicode.com/art/undo_and_redo_to_the_html5_canvas.aspx
    if (steps.length === 0) {
      return;
    }

Da muss erst eine geschlossen werden für die Methode, und dann noch eine für Scribbler (von ganz oben).

Aber die Methode `onUndo()` haben Sie ohnehin zweimal im Code, Sie können sie am Ende also m.E. löschen.

Willkommen im Online-Support von SoSci Survey.

Hier bekommen Sie schnelle und fundierte Antworten von anderen Projektleitern und direkt von SoSci Survey.

→ Eine Frage stellen


Welcome to the SoSci Survey online support.

Simply ask a question to quickly get answers from other professionals, and directly from SoSci Survey.

→ Ask a Question

...