18910140161

记一次 奇葩的 input 浏览器自动填充失效

2023-03-17 14:21:58

50

今天在做开发的时候,遇到了一个比较奇葩的情况,有一个表单,里面有多个input,大家都知道默认的input都是带有自动填充的功能的,之前项目一直运行的挺好,后来莫名奇妙的这个表单里其中一个input的自动填充就不能用了,后来我检查了一遍,因为在我的记忆里,这个页面的前端我没动过,但是就是莫名奇妙的这个input不能自动填充了,后来百度了一会,发现搜出来的结果都是说怎么禁止让浏览器自动填充,没一个是我需要的回答,然后autocomplete autocomplete="on" 也都试了,name值也是有的,就是不出来看,这就给我整郁闷了,然后各种qq群问也没个正经的回答,最后一赌气直接从数据库查吧,也希望知道原因的大佬指点指点我qq:1687105521

然后也顺便分享一下从数据库获取上一条数据的思路吧!

因为要模拟正常浏览器自动填充的效果,所以做完这个感觉前端还挺有意思的,主要是用的jq,vue的大佬就别看了。


// 因为商品名称input死活不能自动填充所以从后台获取
let titleInput = $('input[name="title"]')
  ,  titleHistory = $('.title-history')
  , titleHistoryText = $('.title-history-text')
  , ogTitle = titleInput.val();
if (!ogTitle){
 // 获得焦点时
 titleInput.on('focus', function (){
  if (!titleInput.val()){
   $.post("{:url('manage/Aut/getLastTitleByUID')}", {}, function (res){
    if (res.code === 200){
     titleHistory.show();
     titleHistoryText.html(res.data.title);
    }
   })
  }
 });
 titleHistoryText.on('click', function (){
  let text = $(this).html();
  titleInput.val(text);
 });
 // 正在输入时
 titleInput.on('input', function (){
  titleHistory.hide();
 });
 // 失去焦点时
 titleInput.on('blur', function (){
  setTimeout(function (){
   titleHistory.hide();
  }, 300);
 });

}else{
 titleHistory.hide();
}

这里有意思的一点是,因为模拟浏览器自动填充的效果,所以当我们点击下拉框中的值之后,下拉框要立即隐藏,所以我在blur监听的时候是直接执行隐藏操作的,但是这样就不能监听到点击这个操作,意思就是,失去焦点和点击监听是有冲突的,所以我在失去焦点的监听时,做了一个300毫秒的延时隐藏,因为你立即隐藏的话就相当于你这个dom已经隐藏掉了,所以你根本点击不到这个dom,所以你就监听不到这个点击事件,这样延时隐藏后,这个点击就能被监听到了,后面的操作就简单了直接将值赋值到input里,好了今天就分享到这里!

我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航