检测登录字段

5 javascript authentication

有没有办法使用 javascript 检测任何网站上的登录字段?IE 和 Firefox 能够“记住”我的用户名和密码。我想创建一个复制该功能的脚本。例如,当显示 GMail 的登录页面时,我如何“找到”用户名和密码字段并获取/设置它们?

Jam*_*mes 5

基本概要:

  1. 收集所有密码字段
  2. 循环遍历所有这些
  3. 在每次迭代中:
    1. 找到密码字段所属的 <form/>
    2. 找到表单中的第一个输入字段,1) 不是密码字段,2) 不是 type="text" 以外的任何内容
  4. 返回所有用户名/密码对的数组

输出示例:

[ [ <input id="username" /> , <input type="password" id="pswd" /> ] ]
Run Code Online (Sandbox Code Playgroud)

它将输出一个对的数组,每对包含一个用户名和密码节点。显然,在大多数页面上,您只会得到一对,因为只有一个登录部分。


这里是:

function getLoginFields() {
    var fieldPairs = [],
        pswd = (function(){
            var inputs = document.getElementsByTagName('input'),
                len = inputs.length,
                ret = [];
            while (len--) {
                if (inputs[len].type === 'password') {
                    ret[ret.length] = inputs[len];
                }
            }
            return ret;
        })(),
        pswdLength = pswd.length,
        parentForm = function(elem) {
            while (elem.parentNode) {
                if(elem.parentNode.nodeName.toLowerCase() === 'form') {
                    return elem.parentNode;
                }
                elem = elem.parentNode;
            }
        };
    while (pswdLength--) {
        var curPswdField = pswd[pswdLength],
            parentForm = parentForm(curPswdField),
            curField = curPswdField;
        if (parentForm) {
            var inputs = parentForm.getElementsByTagName('input');
            for (var i = 0; i < inputs.length; i++) {
                if (inputs[i] !== curPswdField && inputs[i].type === 'text') {
                    fieldPairs[fieldPairs.length] = [inputs[i], curPswdField];
                    break;
                }
            }
        }
    }
    return fieldPairs;
}

// Usage:
var loginFields = getLoginFields()[0]; // or loop through results.
Run Code Online (Sandbox Code Playgroud)

在 Yahoo、Amazon、Google、Youtube...(各种帐户/登录页面)上测试成功


小智 2

一种方法(我几乎确定其中一个浏览器正在使用)是找到第一个 <input type="password">,然后搜索它之前的 <input type="text">。