Как сгенерировать пароль на JS

Заполнение поля с эффектом печатающегося текста:

В старых браузерах нет поддержки Web Cryptography, поэтому для них всё-таки придется использовать Math.random().
$("#input-generate").click(function(){
var $input = $("#input-password");
$input.val('');
var pass = generatePassword();
var txt = pass.split("");
var interval = setInterval(function(){
if(!txt[0]){
clearInterval(interval);
} else {
$input.val($input.val() + txt.shift());
}
}, 50);
return false;
});
function generatePassword(){
var length = 8,
charset = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz~!@-#$";
if(window.crypto && window.crypto.getRandomValues) {
return Array(length)
.fill(charset)
.map(x => x[Math.floor(crypto.getRandomValues(new Uint32Array(1))[0] / (0xffffffff + 1) * (x.length + 1))])
.join('');
} else {
res = '';
for (var i = 0, n = charset.length; i < length; ++i) {
res += charset.charAt(Math.floor(Math.random() * n));
}
return res;
}
}