google浏览器插件开发-控制vue页面input框的自动填充

868 阅读2分钟

1.创建谷歌插件必要的项目文件 1.1 使用treer生成文件夹目录,在项目的上级目录执行以下指令,查看插件开发目录

pnpm install treer -g
treer -d chrome-plugin -e treer.md -i "/node_modules|.git/"

生成的目录结构如下

chrome-plugin
├─background.js
├─manifest.json
├─popup.html
├─js
| ├─content-script.js
| └popup.js
├─images

manifest.json文件的内容

popup.html文件的内容

点击展开显示内容
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>popUp弹窗</title>
  <style>
    button {
      width: 100px;
    }
    button~button {
      margin-top: 10px;
    }

    table {
      width: 100%;
      border: 1px solid #666666;
      font-family: verdana, arial, sans-serif;
      font-size: 11px;
      color: #333333;
      border-collapse: collapse;
    }

    table tr {
      width: 100%;
    }

    table tr th {
      border: 1px solid #666666;
      padding: 8px;
      background-color: #dedede;
    }

    table tr td {
      width: 50%;
      text-align: center;
      vertical-align: center;
      padding: 8px;
      border-style: solid;
      border-color: #666666;
      background-color: #ffffff;

    }
  </style>
  <script src="js/popup.js"></script>
</head>

<body>
  <div class="bg-color">
    <textarea name="" id="inputLine" cols="30" rows="10" placeholder="在此区域按ctrl+v或command+v"></textarea>
    <div>
      <button id="btnTransfer">转换格式</button>
      <button id="btnClean">清空</button>
      <button id="btnPaste">粘贴</button>
      <p>转换后的数据</p>
      <div id="table">
      </div>
    </div>
  </div>
</body>
</html>

在扩展程序里面只要添加这个文件夹,则加载这个插件成功

image.png

图1.1加载插件的入口或者访问此链接chrome://extensions/

image.png

图1.2加载的过程

image.png

图1.3加载成功的截图

image.png

图1.4设置快捷方式

2.获取pop弹窗里面的值

点击展开显示内容
document.addEventListener("DOMContentLoaded", () => {
  console.log('processing。。。。。。。。。')
  const btnPaste = document.getElementById("btnPaste")
  const inputLine = document.querySelector("#inputLine")
  const btnTransfer = document.querySelector("#btnTransfer")
  const btnClean = document.querySelector("#btnClean")
  const table = document.getElementById('table')
  const win = chrome.extension.getBackgroundPage()
  //填充历史数据
  // if (win.data) {
  //   fillTable(win.data)
  // }

  let timer = null
  btnPaste.onclick = function () {
    if (!win.data) return
    chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) {
      // 第一个激活的tab
      chrome.tabs.sendMessage(tabs[0].id, {
        action: "filling",
        data: win.data,
      });
    });
    console.log('biubiubiubu~~~~');
    // if (timer) return
    // timer = setTimeout(() => {
    //   timer.clearTimeout()
    //   timer = null
    //   btnPaste.click()
    // }, 200)
  };


  // 数据转换
  btnTransfer.addEventListener('click', () => {
    let copyData = inputLine.value + ""
    win.data = copyData;
    fillTable(copyData)
    chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) {
      // 发送一个transfer消息出去
      chrome.tabs.sendMessage(tabs[0].id, { action: "transfer", data: copyData }, function (response) {
      })
    });
  })

  // 清空数据
  btnClean.addEventListener('click', () => {
    inputLine.value = null
    table.innerHTML = null
    win.data = null
  })

})

// 填充数据表格
function fillTable(copyData) {
  if (!copyData) return
  table.innerHTML = null
  var copyDataArr = copyData.split(' \n')
  const tbody = document.createElement('table')
  const tr1 = document.createElement('tr')
  const th1 = document.createElement('th')
  const th2 = document.createElement('th')
  th1.innerHTML = '字段名称'
  th2.innerHTML = '字段值'
  tr1.appendChild(th1)
  tr1.appendChild(th2)
  tbody.appendChild(tr1)
  copyDataArr && copyDataArr.map((el, idx) => {
    const key = el.split(':')[0]
    const value = el.split(':')[1]
    const tr = document.createElement('tr')
    const td1 = document.createElement('td')
    const td2 = document.createElement('td')
    td1.innerHTML = key
    td2.innerHTML = value
    tr.appendChild(td1)
    tr.appendChild(td2)
    tbody.appendChild(tr)
  })
  setTimeout(() => {
    table.appendChild(tbody)
  }, 300)
}

3.在chrome-plugin更改vue里面的值

点击展开显示内容
    //监听消息
chrome.extension.onMessage.addListener(
  function (request, sender, sendResponse) {
    const copyData = request.data
    switch (request.action) {
      case 'filling':
        //粘贴
        const forms = document.getElementsByTagName("form")
        let targetForm
        if (forms?.length) {
          for (let i = 0; i < forms.length; i++) {
            const labels = forms[i].getElementsByTagName('label')
            if (labels?.length) {
              for (let j = 0; j < labels.length; j++) {
                if (labels[j].innerHTML === '姓名') {
                  targetForm = forms[i]
                  fillTargetForm(targetForm, copyData)
                }
              }
            }
          }
        }
        break
      case 'transfer':
        // 转换数据
        if (sendResponse) {
          console.log('发送消息')
          sendResponse('接收消息')
        }
        break
      default:
        console.log('接收到数据')
        break
    }
  }
)

function dealData(copyData) {
  if (!copyData) return
  const inputEle = ['现居住地址', '联系人手机号码', '配偶姓名', '监护人姓名', '监护人电话', '交通工具', '车牌号', '单位/学校名称', '单位地址', '配偶证件号码', '监护人证件号码', '户籍详址', '其他联系方式', '姓名', '证件号码', '手机号码']
  // '拟离开时间',
  const selectEle = ['民族', '居住事由', '户籍地']
  // , '文化程度', '政治面貌', '婚姻状况', '配偶证件种类', '监护人证件种类', '与房主关系'
  // const selectEle = ['民族', '居住事由', '文化程度', '政治面貌', '婚姻状况', '配偶证件种类', '监护人证件种类', '与房主关系']
  const defaultVal = ['出生日期']
  const radioEle = ['性别', '是否户籍人员', '居住类型',]
  const inputMap = {}
  const selectMap = {}
  const radioMap = {}
  const defaultMap = {}
  const copyDataArr = copyData.split(' \n')
  copyDataArr && copyDataArr.map((el, idx) => {
    const key = el.split(':')[0]
    const value = el.split(':')[1]
    if (inputEle.includes(key)) {
      inputMap[key] = value
    } else if (selectEle.includes(key)) {
      selectMap[key] = value
    } else if (radioEle.includes(key)) {
      radioMap[key] = value
    } else if (defaultVal.includes(key)) {
      defaultMap[key] = value
    }
  })
  return [inputMap, selectMap, radioMap, defaultMap]
}


async function fillTargetForm(targetForm, copyData) {
  const [inputMap, selectMap, radioMap, defaultMap] = await dealData(copyData)
  const inputKeyArr = Object.keys(inputMap)
  const selectKeyArr = Object.keys(selectMap)
  const radioKeyArr = Object.keys(radioMap)
  const defaultArr = Object.keys(defaultMap)
  console.log('inputKeyArr>>>>', inputKeyArr);
  const labels = targetForm.getElementsByTagName('label')
  if (labels?.length) {
    for (let j = 0; j < labels.length; j++) {
      if (inputKeyArr.includes(labels[j].innerHTML)) {
        // console.log('labels[j].innerHTML>>>>>', labels[j].innerHTML);
        // input输入框
        const inputWraper = labels[j].nextElementSibling
        const inputEles = inputWraper.getElementsByTagName('input')

        if (inputEles?.length) {
          let inputEle
          if (inputEles.length === 1) {
            inputEle = inputEles[0]
          } else if (inputEles.length === 2) {
            inputEle = inputEles[1]
          }

          inputEle.value = (inputMap[labels[j].innerHTML]).trim()

          if (labels[j].innerHTML === '拟离开时间') {
            inputEle.innerText = (inputMap[labels[j].innerHTML]).trim()
            const event1 = document.createEvent('HTMLEvents')
            event1.initEvent('click', false, true)
            event1.initEvent('input', false, true)
            event1.initEvent('change', false, true)
            inputEle.dispatchEvent(new Event('input'))
            inputEle.dispatchEvent(new Event('click'))
            inputEle.dispatchEvent(new Event('change'))
            inputEle.dispatchEvent(event1)
            // console.log('event1>>>', event1);
            // setTimeout(() => {
            // }, 800)
          } else {
            const event = document.createEvent('HTMLEvents')
            event.initEvent('input', false, true)
            inputEle.dispatchEvent(event)
          }
        }
      } else if (defaultArr.includes(labels[j].innerHTML)) {
        // 默认div值
        const inputWraper1 = labels[j].nextElementSibling
        const inputWraper2 = inputWraper1.firstChild
        const inputEle = inputWraper2.firstChild
        const event = document.createEvent('HTMLEvents')
        event.initEvent('onchange', false, true)
        inputEle.dispatchEvent(event)
        inputEle.innerHTML = defaultMap[labels[j].innerHTML]
      } else if (selectKeyArr.includes(labels[j].innerHTML)) {
        // 选择下拉框
        const inputWraper = labels[j].nextElementSibling
        const inputEle = inputWraper.getElementsByTagName('input')[0]
        inputEle.value = selectMap[labels[j].innerHTML]
        const event = document.createEvent('HTMLEvents')
        event.initEvent('click', false, true)
        // event.initEvent('select', false, true)
        // const event = document.createEvent('MouseEvents')
        // event.initEvent('click', true, true)
        inputEle.dispatchEvent(event)
        inputEle.click()
      } else if (radioKeyArr.includes(labels[j].innerHTML)) {
        // radio选择值
        const inputWraper = labels[j].nextElementSibling
        const inputWraper2 = inputWraper.children[0]
        if (radioMap[labels[j].innerHTML].indexOf('男') > -1) {
          /**触发事件 */
          if (inputWraper2.firstChild.getAttribute('tabindex' != '0')) {
            const event = document.createEvent('HTMLEvents')
            event.initEvent('click', false, true)
            inputWraper2.firstChild.firstChild.dispatchEvent(event)
          }
          /**触发事件 */
        } else if (radioMap[labels[j].innerHTML].indexOf('女') > -1) {
          if (inputWraper2.firstChild.firstChild.nextElementSibling.getAttribute('tabindex' != '0')) {
            const event = document.createEvent('HTMLEvents')
            event.initEvent('click', false, true)
            inputWraper2.firstChild.firstChild.nextElementSibling.dispatchEvent(event)
          }
        } else {
          /**触发事件 */
          const _labels = inputWraper2.firstChild.getElementsByTagName('label')
          for (let k = 0; k < _labels.length; k++) {
            const labelVal = (_labels[k].getElementsByTagName('span')[2]).innerText
            if (labelVal == radioMap[labels[j].innerText]) {
              if (_labels[k].getAttribute('tabindex') != '0') {
                const labelInput = _labels[k].getElementsByTagName('input')[0]
                if (labelVal === '自住') {
                  labelInput.value = '01'
                } else if (labelVal === '租住') {
                  labelInput.value = '02'
                } else if (labelVal === '寄住') {
                  labelInput.value = '03'
                }

                const event = document.createEvent('HTMLEvents')
                event.initEvent('click', false, true)
                _labels[k].dispatchEvent(event)


                const event2 = document.createEvent('HTMLEvents')
                event2.initEvent('input', false, true)
                labelInput.dispatchEvent(event2)
              }
            }
          }
          /**触发事件 */
        }

      }

    }
  }
}

关键语句