Greetings traveller. Won't you tell me your name? It's <form><input onkeydown = 'if (event.keyCode === 13) {$.e("name")}' type="text" id="first_name"></input> <input onkeydown = 'if (event.keyCode === 13) {$.e("name")}' type="text" id="last_name"></input></form>? (click: "name")[ (set: $first_name to document.getElementById("first_name").value) (set: $last_name to document.getElementById("last_name").value) (goto: "check-name") ] { <!-- Comments in javascript blocks like this can cause problems. --> (set: $error to (function() { var first_name = $first_name.toLowerCase(); var last_name = $last_name.toLowerCase(); if (first_name.length === 0 || last_name.length === 0) return "Sorry, I didn't quite catch that. [[What's your name|whats-your-name]]?"; if (first_name === "twine") return "That's a ridiculous name. [[What's your real name|whats-your-name]]?"; return ""; })()) (if: $error's length > 0)[ (print: $error) ](else:)[ (goto: "display-name") ] } It's good to finally meet you, $first_name $last_name. Feel like a test? (click: "test")[ (print:"We just called into twine logic from JavaScript!") ] (set: $dummy to $.e("test"))