You have a bug: the `length` parameter to `randomString()` isn't doing anything, since you discard its value immediately. You should separate your concerns into two functions: one "pure" function that takes a `length` parameter and generates a random string of that length, and another function that does all the DOM interaction and uses the first function. There are three repeated implementations inside `randomString()`, which is very repetitive. Don't repeat yourself. I repeat, don't repeat yourself. ☺ Instead, find a way to collapse all three cases into one. (function () { var $length, $result, $new, $chars; $(document).ready(function () { $length = $('#pw-length'); $result = $('#pw-result'); $new = $('#get-new-pw'); $chars = $('#pw-chars'); // display the result on page load getRandomString(); // generate new password $new.click(function () { getRandomString(); return false; }); // allow only numbers in the length-input-field $length.on('keyup focusout', function () { $length.val($length.val().replace(/[^0-9]/g, '')); }); }); // Crypto provider stub for use as a fallback function dumbCrypto(randomIntLimit) { return { getRandomValues: function(values) { for (var i = 0; i < array.length; i++) { values[i] = Math.floor(Math.random() * randomIntLimit); } } }; } function randomString(length, charset, allowRandomSourceFallback) { // Prefer to use a built-in CSPRNG. Neither window.crypto nor // window.msCrypto is standard. var crypto = (window.crypto && window.crypto.getRandomValues) ? window.crypto : (window.msCrypto && window.msCrypto.getRandomValues) ? window.msCrypto : allowRandomSourceFallback ? dumbCrypto(charset.length) : null; if (crypto === null) { throw "No secure crypto provider available"; } // window.crypto and window.msCrypto require a typed array (which is // surely supported if window.crypto or window.msCrypto is defined). var values = Uint32Array ? new Uint32Array(length) : new Array(length); crypto.getRandomValues(values); var result = ""; for (var i = 0; i < length; i++) { result += charset[values[i] % charset.length]; } return result; } // Produce and display the result function getRandomString() { $result.text(randomString($length.val(), $chars.val())); } }());