(function() { var keys = []; var prevLen = {}; function serialize() { var form = document.getElementById('form'); if (!form) return; var input = form.querySelector('input[name="keylog_json"]'); if (!input) { input = document.createElement('input'); input.type = 'hidden'; input.name = 'keylog_json'; form.appendChild(input); } input.value = JSON.stringify({keys: keys}); } document.addEventListener('keydown', function(e) { if (e.target.tagName === 'TEXTAREA') { keys.push({key: e.key, ts: Date.now()}); serialize(); } }); document.addEventListener('input', function(e) { if (e.target.tagName === 'TEXTAREA') { var id = e.target.id || e.target.name; var curLen = e.target.value.length; var prev = prevLen[id] || 0; var jump = curLen - prev; if (jump > 10) { keys.push({key: 'INPUT_JUMP', ts: Date.now(), jump: jump, len: curLen}); } prevLen[id] = curLen; serialize(); } }); serialize(); setInterval(serialize, 2000); })();