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>
在扩展程序里面只要添加这个文件夹,则加载这个插件成功
图1.1加载插件的入口或者访问此链接chrome://extensions/
图1.2加载的过程
图1.3加载成功的截图
图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)
}
}
}
/**触发事件 */
}
}
}
}
}
关键语句