在完成随机字符串生成器 后,实现一个密码生成器似乎是件没有难度的事情,但我还是想得太简单了。
首先是获得url中的参数,可以参考获取URL中的查询参数 。实际上,并不需要这么复杂的处理。这里只需要取得url中?之后的查询部分,简单粗暴用url = location.search.substr(1)就可以了。考虑到url中也可能没有查询部分,所以还得有判断和默认的逻辑。
然后是将生成的密码写到网页中去,这个用JS操作DOM并没有难度。考虑到可能有临时编辑的需要,宜用input或textarea标签。
再就是复制的功能,可以直接调用比较完善clipboard.js 。文档介绍了两种方式,其他元素中用data-clipboard-target,自身属性用data-clipboard-text。文案写得清晰易懂,实现点击复制并不难。但我花了很多时间去思考实现自动复制。一个密码生成之后,除非需要编辑修改,否则当然就是复制。省事的做法是,密码生成后就自动复制到剪切板中去。所以要实现一个生成复制的函数。
起初,我用的是data-clipboard-target,无论是onLoad还是onClick都无法实现自动复制,也没有相关参考。直到在文档中看到动态设置文本用到getAttribute,我才反想到setAttribute。换用data-clipboard-text终于实现了我需要的功能。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 html <!DOCTYPE html><html><head><meta charset="utf-8" /> <meta name="viewport" content="width=device-width,user-scalable=no,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0"> <title>PSWD</title> </head><body > <input type="text" id="target" /> <button type="button" id="genCopy_" onclick='genCopy(this)' >genCopy</button> <button type="button" id="gen_" onclick='gen()'>gen</button> <button type="button" id="copy_" onclick='copy(this)'>copy</button> <button type="button" id="save_" onclick='save(this)'>save</button> <br /> <textarea id="target2" cols="30" rows="30"> </textarea> </body></html> <script type="text/javascript" src="randstr.js"></script> <script type="text/javascript" src="pswd.js"></script> <script type="text/javascript" src="clipboard.min.js"></script> js /** pswd.js Ande.Studio v3 20190826 **/ target = document.getElementById("target"); target2 = document.getElementById("target2"); function gen(args='nul8'){//密码生成 if(url = location.search){ args = url.substr(1); str = randstr(args); }else{ str = randstr(args); } target.value = str;//将str写入目标元素赋值 target2.value = str + '\n' + target2.value;//将str追加写入目标文本域 console.log(str); return str; } function copy(obj){//复制 var clipboard = new ClipboardJS("#"+obj.id); document.getElementById(obj.id).setAttribute("data-clipboard-target","#target");//data-clipboard-target,复制可见 } function genCopy(obj){//生成加复制 gen(); copy(obj); //document.getElementById(obj.id).setAttribute("data-clipboard-text",gen());//data-clipboard-text,复制过程不可见。假设在这条代码之前执行gen();copy(obj);会gen()2次,但只会copy最后一次gen() //data-clipboard-target和data-clipboard-text同时存在的话,text将优先target会失效。 } function save(){//保存 } window.onload = function(){//载入调用 str = gen(); target2.value = '';//清空gen()设置的target2值,以显示占位符 ph = str + `\n\n\n pswd.html?nul8 默认参数nul8,生成8位随机字符串,包含大小写字母数字 s:special character特殊字符 n:number 数字 u:upper case大写字母 l:lower case小写字母 数字用作控制生成随机字符的长度`//占位符 //target2.setAttribute("placeholder",ph); target2.placeholder=ph; /** var obj = new Object(); obj['id']= 'genCopy_' genCopy(obj); 手工构造一个obj,指定obj['id']='genCopy_'或者obj.id='genCopy_',以期在载入时调用genCopy(obj),实际上确实调用了且生成了密码且没有报错,但却不会实现复制。 这是值得注意的问题,具体的机制有待研究。 **/ }
Todo
js save()
相关代码已放在github。