Vue 项目 实现阻止浏览器记住密码功能

前言

通常浏览器会主动识别密码表单,在你登录成功之后提示保存密码 , 密码保存到浏览器的 密码管理器中 ( 如下是谷歌浏览器 )



这种行为是浏览器的行为 ,这种操作也是为了方便用户的使用

现在的一个需求是要阻止这个保存密码的弹窗提示 

实现方法

查找资料发现的一些方法:

  1. 使用 autocomplete="off"(现代浏览器许多都不支持)
  2. 使用 autocomplete="new-password"
  3. 在真正的账号密码框之前增加相同 name 的 input 框
  4. 使用 readonly 属性,在聚焦时移除该属性
  5. 初始化 input 框的 type 属性为 text,聚焦时修改为 password
  6. 使用 type="text",手动替换文本框内容为星号 “*” 或者 小圆点 “●”

可以看到实现这个需求有许许多多的方法,但是实际上确有各种各样的问题,下面是我自己测试的几个方法

方法一

密码框添加 autocomplete="new-password" 属性

index.html 文件添加 meta 元数据 (该步骤可以省略)

密码输入框

  <el-input
      prefix-icon="el-icon-lock"
      type="password"
      name="xxxx"
      placeholder="密码"
      v-model="password"
      autocomplete="new-password"
    >
  </el-input>

index.html 文件 (该步骤可以省略)

<!DOCTYPE html>
<html lang="">
  <head>
   .....
    <meta name="autocomplete" content="off"> 
   .......
  </head>
 ......
  <body>
   ........
  </body>
</html>

 注意

这种方法可以适配 谷歌浏览器 、 Edge 、 IE 浏览器

不兼容 火狐浏览器


方法二

新添加两个输入框 , type 分别设置为 text password

设置 display: none 属性让其隐藏


具体代码

 <div class="login-location">
        <!-- 隐藏的输入框 -->
        <el-input
          style="display: none"
          type="text"
          name="xxxx"
          autocomplete="off"
        >
        </el-input>
        <el-input
          style="display: none"
          type="password"
          name="xxxx"
          autocomplete="off"
        >
        </el-input>
		<!-- 真实输入框 -->
        <el-input
          ref="pass"
          prefix-icon="el-icon-lock"
          @keyup.enter.native="userLogin()"
          v-model="password"
          type="password"
          placeholder="密码"
          name="xxxx"
        >
        </el-input>
  </div>

注意

这种方法可以适配 谷歌浏览器 、 Edge 、 IE 浏览器

不兼容 火狐浏览器


方法三

  • 把密码框的 type 定义为 text ,这样浏览器就无法正确自动识别 密码

  • 给输入框绑定事件 , 每次输入数据触发事件, 把 密码 替换成 圆点 ●

  • 给输入框右侧 小眼睛手动绑定事件 ,控制密码的显示隐藏


具体代码

 <div class="login-location">
            <el-input
              prefix-icon="el-icon-lock"
              v-model="pwdCover"
              type="text"
              name="pwd"
              id="pwd"
              placeholder="密码"
              autocomplete="off"
              @input="setPassword"
              @keyup.enter.native="userLogin()"
            >
              <i
                slot="suffix"
                class="el-icon-view"
                style="margin-top: 10px; margin-right: 10px; font-size: 18px"
                @click="hidePassword"
              ></i>
            </el-input>
     </div>
 // 输入框输入事件
setPassword(val) {
      if (this.isShowPassword) {
        this.password = val;
      } else {
        let reg = /[0-9a-zA-Z]/g; // 只允许输入字母和数字
        let nDot = /[^●]/g; // 非圆点字符
        let index = -1; // 新输入的字符位置
        let lastChar = void 0; // 新输入的字符
        let realArr = this.password.split(""); // 真实密码数组
        let coverArr = val.split(""); // 文本框显示密码数组
        let coverLen = val.length; // 文本框字符串长度
        let realLen = this.password.length; // 真实密码长度
        // 找到新输入的字符及位置
        coverArr.forEach((el, idx) => {
          if (nDot.test(el)) {
            index = idx;
            lastChar = el;
          }
        });
        // 判断输入的字符是否符合规范,不符合的话去掉该字符
        if (lastChar && !reg.test(lastChar)) {
          coverArr.splice(index, 1);
          this.pwdCover = coverArr.join("");
          return;
        }
        if (realLen < coverLen) {
          // 新增字符
          realArr.splice(index, 0, lastChar);
        } else if (coverLen <= realLen && index !== -1) {
          // 替换字符(选取一个或多个字符直接替换)
          realArr.splice(index, realLen - (coverLen - 1), lastChar);
        } else {
          // 删除字符,因为 val 全是 ● ,没有办法匹配,不知道是从末尾还是中间删除的字符,删除了几个,不好对 password 处理,所以可以通过光标的位置和 val 的长度来判断
          let pos = document.getElementById("pwd").selectionEnd; // 获取光标位置
          realArr.splice(pos, realLen - coverLen);
        }
        // 将 pwdCover 替换成 ●
        this.pwdCover = val.replace(/\S/g, "●");
        this.password = realArr.join("");
      }
    },
     // 点击右侧小眼睛控制显示隐藏
    hidePassword() {
      if (!this.isShowPassword) {
        // console.log("显示");
        this.isShowPassword = true;
        this.pwdCover = this.password;
      } else {
        // console.log("隐藏");
        this.isShowPassword = false;
        this.pwdCover = this.pwdCover.replace(/\S/g, "●");
      }
    },
     // 登录的逻辑
      userLogin() {
      if (this.account === "admin" && this.password === "admin") {
        this.loading = true;
        setTimeout(() => {
          this.$router.push({ path: "/main" });
        }, 600);
        this.$message.success("登录成功");
      }
    }

注意

这种方法可以适配 谷歌浏览器 、 Edge 、 IE 浏览器

同时兼容 火狐浏览器

目前本地测试暂未发现问题


 补充

通常情况下,密码输入框都是禁用 回退、剪切、复制、粘贴 功能 , 可以给输入框添加 keydown 键盘按下事件

 

 <div class="login-location">
            <el-input
              prefix-icon="el-icon-lock"
              v-model="pwdCover"
              type="text"
              name="pwd"
              id="pwd"
              placeholder="密码"
              autocomplete="off"
              @input="setPassword"
              @keyup.enter.native="userLogin()"
              @keydown.native="onKeydown($event)"
            >
              <i
                slot="suffix"
                class="el-icon-view"
                style="margin-top: 10px; margin-right: 10px; font-size: 18px"
                @click="hidePassword"
              ></i>
            </el-input>
  </div>

  onKeydown(e) {
      // 禁用值的回退、剪切、复制、粘贴功能,即Ctrl+z、Ctrl+x、Ctrl+c、Ctrl+v
      let keycode;
      if (e.ctrlKey) {
        if (window.event) {
          keycode = e.keyCode; // IE
        } else if (e.which) {
          keycode = e.which; // Netscape/Firefox/Opera
        }

        if (
          90 === keycode ||
          88 === keycode ||
          67 === keycode ||
          86 === keycode
        ) {
          e.preventDefault();
          e.stopPropagation();
          return false;
        }
      }
      return true;
    }

文章如有错误,恳请大家提出问题,本人不胜感激 。 不懂的地方可以评论,我都会 一 一 回复

文章对大家有帮助的话,希望大家能动手点赞鼓励,大家未来一起努力 长路漫漫,道阻且长

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Vue 3中,使用Element Plus实现记住密码功能可以通过以下步骤完成: 1. 首先,你需要在登录表单中添加一个复选框,用于用户选择是否记住密码。 ```html <el-form-item label="记住密码"> <el-checkbox v-model="rememberPassword"></el-checkbox> </el-form-item> ``` 2. 在Vue的data选项中添加一个记住密码的变量,并初始化为false。 ```javascript data() { return { rememberPassword: false, // 其他data属性... } }, ``` 3. 在登录表单提交时,将用户是否选择记住密码的状态保存到本地存储(localStorage)中。 ```javascript methods: { login() { // 其他登录逻辑... // 判断用户是否选择了记住密码 if (this.rememberPassword) { localStorage.setItem('username', this.username); localStorage.setItem('password', this.password); } else { localStorage.removeItem('username'); localStorage.removeItem('password'); } } } ``` 4. 在组件的`mounted`钩子函数中,检查本地存储中是否有保存的用户名和密码,并将其绑定到表单上。 ```javascript mounted() { const savedUsername = localStorage.getItem('username'); const savedPassword = localStorage.getItem('password'); if (savedUsername && savedPassword) { this.username = savedUsername; this.password = savedPassword; this.rememberPassword = true; } } ``` 这样,当用户选择记住密码并成功登录后,下次打开页面时用户名和密码会自动填充,并且你可以在登录表单中的复选框中显示选中状态。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

潮汐未见潮落

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值