您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
take on the world!
// ==UserScript== // @name zentao4HAT-2 // @namespace http://www.akuvox.com/ // @version 1.37 // @description take on the world! // @author andy.wang // @match http://192.168.10.17/zentao/bug-browse*.html* // @match http://192.168.10.17/zentao/bug-view-*.html* // @match http://192.168.10.17/zentao/bug-edit-*.html* // @match http://192.168.10.17/zentao/story-view-*.html* // @match http://192.168.10.17/zentao/build-view-*.html* // @match http://192.168.10.17/zentao/testtask-create*.html* // @match http://192.168.10.17/zentao/testtask-edit*.html* // @match http://zentao.akuvox.local/zentao/bug-browse*.html* // @match http://zentao.akuvox.local/zentao/bug-view-*.html* // @match http://zentao.akuvox.local/zentao/bug-edit-*.html* // @match http://zentao.akuvox.local/zentao/story-view-*.html* // @match http://zentao.akuvox.local/zentao/build-view-*.html* // @match http://zentao.akuvox.local/zentao/testtask-create*.html* // @match http://zentao.akuvox.local/zentao/testtask-edit*.html* // @grant none // @license none // ==/UserScript== (async function () { 'use strict'; if (!window.location.href.includes('bug-edit-')) { await zentaoAssociate().then(async () => { await zentaoScore() }) } zentaoScoreDialog() if (window.location.href.includes('bug-edit-')) { createWriteButton() } })(); async function zentaoAssociate(){ style() if(window.location.href.includes('bug-view-')||window.location.href.includes('story-view-')){ const bugid = document.getElementById('titlebar').querySelector('strong').textContent const post = ()=>{ const needModels = [] const resovedModels = [] const assignedto = userInput.value const title = document.getElementById('titlebar').querySelectorAll('strong')[1].textContent for(let key in result.allcheck){ if(result.allcheck[key]){ needModels.push(key) } } for(let key in result.solved){ if(result.solved[key]&&result.allcheck[key]){ resovedModels.push(key) } } fetch('http://192.168.10.51:63183/postbugctrl', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ bugid, title, url:window.location.href, needModels:needModels.join(','), resovedModels:resovedModels.join(','), assignedto, finish:arraysEqual(needModels,resovedModels) }) }) } const get = async()=>{ const sql = `SELECT * FROM modelctrl WHERE bugid = '${bugid}'` return new Promise(async (resolve)=>{ const result = await fetch(`http://192.168.10.51:63183/getbugctrl`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ sql }) }) try { let res = await result.text() res = res?JSON.parse(res):{} resolve(res) } catch (e) { resolve([]) } }) } const change = async()=>{ const needModels = [] const resovedModels = [] const assignedto = userInput.value for(let key in result.allcheck){ if(result.allcheck[key]){ needModels.push(key) } } for(let key in result.solved){ if(result.solved[key]&&result.allcheck[key]){ resovedModels.push(key) } } const sql = `UPDATE modelctrl SET needModels='${needModels.join(',')}',resovedModels='${resovedModels.join(',')}',assignedto='${assignedto}',finish='${arraysEqual(needModels,resovedModels)}' WHERE bugid = '${bugid}'` return new Promise(async (resolve)=>{ const result = await fetch(`http://192.168.10.51:63183/getbugctrl`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ sql }) }) try { let res = await result.text() res = res?JSON.parse(res):{} resolve(res) } catch (e) { resolve([]) } }) } const deviceListy = ['无需','HA','31','41','42','51','251','52','53','61','161','71','81','1001','933','119'] const container = document.getElementsByClassName('main-side')[0] const tabs = document.createElement('div'); const table = document.createElement('table'); const tr1 = document.createElement('tr'); const td11 = document.createElement('th'); const td12 = document.createElement('td'); td11.textContent = '需管控机型' td11.width="80px" let deviceDom = '' deviceListy.forEach(item=>{ deviceDom+=`<label class="device"><input type="checkbox" name="devices" value="${item}"/><span>${item}</span></label>` }) td12.innerHTML = deviceDom let checkboxs = td12.querySelectorAll("input[name='devices']") let solvedCheckboxs = [] let userInput const sqlresult = await get() let isEdit = !!sqlresult.bugid let result = { allcheck:{}, solved:{}, } if(sqlresult.needModels){ const needModelsArray = sqlresult.needModels.split(',') deviceListy.forEach(key=>{ result.allcheck[key] = needModelsArray.includes(key) }) if(sqlresult.resovedModels){ const resovedModelsArray = sqlresult.resovedModels.split(',') needModelsArray.forEach(key=>{ result.solved[key] = resovedModelsArray.includes(key) }) } } let oldReult const clickEvent = (index)=>{ if(result.allcheck[checkboxs[index].value]){ checkboxs[index].parentNode.style="" checkboxs[index].style="display:none" checkboxs[index].disabled = true }else{ checkboxs[index].parentNode.style="display:none" } checkboxs[index].addEventListener('click', function(e) { result.allcheck[e.target.value] = e.target.checked let solvedDom = '' deviceListy.forEach(key=>{ if(result.allcheck[key]){ solvedDom += `<label class="device"><input type="checkbox" name="solved" value="${key}" ${result.solved[key]?'checked="false"':''}/><span>${key}</span></label>` } }) td22.innerHTML = solvedDom solvedCheckboxs = td22.querySelectorAll("input[name='solved']") const solvedClickEvent = (sIndex)=>{ solvedCheckboxs[sIndex].addEventListener('click', function(se) { result.solved[se.target.value] = se.target.checked }) } for (let i = 0; i < solvedCheckboxs.length; i++) { solvedClickEvent(i) } }); } for (let i = 0; i < checkboxs.length; i++) { clickEvent(i) } tr1.appendChild(td11); tr1.appendChild(td12); table.appendChild(tr1) const tr2 = document.createElement('tr'); const td21 = document.createElement('th'); const td22 = document.createElement('td'); let solvedDom = '' deviceListy.forEach(key=>{ if(result.allcheck[key]){ solvedDom += `<label class="device" style="${result.solved[key]?'':'display:none'}"><input type="checkbox" name="solved" value="${key}" style="display:none" disabled="true"/><span>${key}</span></label>` } }) td22.innerHTML = solvedDom solvedCheckboxs = td22.querySelectorAll("input[name='solved']") const solvedClickEvent = (sIndex)=>{ solvedCheckboxs[sIndex].addEventListener('click', function(se) { result.solved[se.target.value] = se.target.checked }) } for (let i = 0; i < solvedCheckboxs.length; i++) { solvedClickEvent(i) } td21.textContent = '已解决机型' td21.width="80px" tr2.appendChild(td21); tr2.appendChild(td22); table.appendChild(tr2) const tr3 = document.createElement('tr'); const td31 = document.createElement('th'); const td32 = document.createElement('td'); td32.innerHTML = `<label class="user"><input type="text" name="user"/></label>` userInput = td32.querySelector("input[name='user']") userInput.disabled = true userInput.value = sqlresult.assignedto||'' tr3.appendChild(td31); tr3.appendChild(td32); table.appendChild(tr3) //td31.textContent = '负责人' //td31.width="80px" const button = document.createElement('div'); const editButton = document.createElement('span'); const submitButton = document.createElement('span'); const cancelButton = document.createElement('span'); submitButton.style="display:none" cancelButton.style="display:none" button.classList.add('button') editButton.textContent = "编辑" submitButton.textContent = "提交" cancelButton.textContent = "取消" editButton.addEventListener('click', function(e) { editButton.style="display:none" submitButton.style="" cancelButton.style="" userInput.disabled = true oldReult = JSON.parse(JSON.stringify(result)) for (let i = 0; i < checkboxs.length; i++) { checkboxs[i].disabled = false checkboxs[i].parentNode.style="" checkboxs[i].style="" checkboxs[i].checked = result.allcheck[checkboxs[i].value] } for (let i = 0; i < solvedCheckboxs.length; i++) { solvedCheckboxs[i].disabled = false solvedCheckboxs[i].parentNode.style="" solvedCheckboxs[i].style="" solvedCheckboxs[i].checked = result.solved[solvedCheckboxs[i].value] } }) submitButton.addEventListener('click', function(e) { editButton.style="" submitButton.style="display:none" cancelButton.style="display:none" userInput.disabled = true if(isEdit){ change() }else{ post() isEdit = true } for (let i = 0; i < checkboxs.length; i++) { checkboxs[i].disabled = true if(result.allcheck[checkboxs[i].value]){ checkboxs[i].parentNode.style="" checkboxs[i].style="display:none" }else{ checkboxs[i].parentNode.style="display:none" } } for (let i = 0; i < solvedCheckboxs.length; i++) { solvedCheckboxs[i].disabled = true if(result.solved[solvedCheckboxs[i].value]){ solvedCheckboxs[i].parentNode.style="" solvedCheckboxs[i].style="display:none" }else{ solvedCheckboxs[i].parentNode.style="display:none" } } }) cancelButton.addEventListener('click', function(e) { editButton.style="" submitButton.style="display:none" cancelButton.style="display:none" userInput.disabled = true result = JSON.parse(JSON.stringify(oldReult)) for (let i = 0; i < checkboxs.length; i++) { checkboxs[i].disabled = true if(result.allcheck[checkboxs[i].value]){ checkboxs[i].parentNode.style="" checkboxs[i].style="display:none" }else{ checkboxs[i].parentNode.style="display:none" } } for (let i = 0; i < solvedCheckboxs.length; i++) { solvedCheckboxs[i].disabled = true if(result.solved[solvedCheckboxs[i].value]){ solvedCheckboxs[i].parentNode.style="" solvedCheckboxs[i].style="display:none" }else{ solvedCheckboxs[i].parentNode.style="display:none" } } }) button.appendChild(editButton) button.appendChild(submitButton) button.appendChild(cancelButton) tabs.appendChild(button) tabs.appendChild(table) tabs.classList.add("tabs"); tabs.classList.add("associate"); container.appendChild(tabs); }else{ const get = async()=>{ const sql = `SELECT * FROM modelctrl WHERE finish='false' AND ${modelName==='所有机型'?'1=1':`needModels like '%${modelName}%'`}` return new Promise(async (resolve)=>{ const result = await fetch(`http://192.168.10.51:63183/getbugctrl`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ sql }) }) try { let res = await result.text() res = res?JSON.parse(res):[] const resTable = Array.isArray(res)?res:[res] resolve(resTable) } catch (e) { resolve([]) } }) } const modelTable = document.getElementsByClassName('table-borderless')[0] const modelTr = modelTable?modelTable.getElementsByTagName('tr'):[] let modelName = '' for(let i in modelTr){ const item = modelTr[i] if(item.innerText&&item.innerText.includes('所属机型')){ modelName=item.children[1].textContent } } const navTabs = document.getElementsByClassName('nav-tabs')[0] const tabsLi = document.createElement('li'); tabsLi.innerHTML ='<a href="#legacyBugs" data-toggle="tab"><i class="icon-bug red"></i>机型遗留问题</a>' navTabs&&navTabs.appendChild(tabsLi); const tabContent = document.getElementsByClassName('tab-content')[0] const tabPane = document.createElement('div'); tabPane.classList.add('tab-pane') tabPane.id = 'legacyBugs' const table = document.createElement('table'); table.classList.add('table','table-hover','table-condensed','table-striped','tablesorter','table-fixed') const thead = document.createElement('thead'); thead.innerHTML = '<tr><th class="w-id">ID</th>'+ '<th>标题</th>'+ '<th class="w-100px">创建日期</th>'+ '<th class="w-100px">管控机型</th>'+ '<th class="w-100px">已解决机型</th></tr>' const tbody = document.createElement('tbody'); const result = await get() let tbodyhtml = '' result.forEach(item=>{ tbodyhtml += '<tr class="text-center">'+ `<td>${item.bugid}</td>`+ `<td><a href="${item.url}">${item.title}</a></td>`+ `<td>${item.tdate.split('T')[0]}</td>`+ `<td>${item.needModels}</td>`+ `<td>${item.resovedModels}</td></tr>` }) tbody.innerHTML = tbodyhtml table.appendChild(thead); table.appendChild(tbody); tabPane.appendChild(table); tabContent&&tabContent.appendChild(tabPane); } function arraysEqual(arr1, arr2) { if (arr1.length !== arr2.length) { return false; } const set1 = new Set(arr1); const set2 = new Set(arr2); for (const item of set1) { if (!set2.has(item)) { return false; } } return true; } function style(){ const modalStyle = ` .associate{ border: 1px solid #ddd; padding: 10px 10px; } .associate th{ font-weight: normal; color: #444; padding: 3px 8px 3px 0; vertical-align: top; } .device{ margin:0 10px 5px 0 } .device span{ margin-left:5px; display: inline-block; width: 40px; } .user input{ border: none; border-bottom: 1px solid #cfcfcf; padding: 0; width: 200px; max-width: 100%; outline-color: #00000000; } .button{ text-align: right; color: #036; } .button span{ cursor: pointer; } .button span:active{ opacity: .7; } .button span+span{ margin-left:5px; } input:disabled { background: #fff; border: none; color: #141414; font-weight: 700; padding-left: 5px; font-size: 14px; } input[type=checkbox]{ margin-top: 0; position: relative; top: 2px; } `; const styleBlock = document.createElement('style'); styleBlock.textContent = modalStyle; document.head.appendChild(styleBlock); } } async function zentaoScoreDialog(){ const resolve = document.getElementsByClassName('icon-bug-resolve') let isSubmit = false resolve&&resolve.length&&Array.from(resolve).forEach(item=>{ item.parentNode.addEventListener('click', function() { isSubmit = true }); }) // 配置观察器以监视弹窗的添加,然后操作 var observer = new MutationObserver(function(mutationsList, observer) { for (var mutation of mutationsList) { if (mutation.addedNodes) { for (var addedNode of mutation.addedNodes) { if (addedNode.id === "ajaxModal") { observer.disconnect(); iframeInit() break; } } } } }); observer.observe(document.documentElement, { childList: true, subtree: true }); function iframeInit(){ document.getElementById("modalIframe").addEventListener("load", function() { const iframe = document.getElementById("modalIframe").contentWindow.document style(iframe) // 配置观察器以监视子节点button的添加,然后操作 var observer = new MutationObserver(function(mutationsList) { for (var mutation of mutationsList) { if (mutation.type === "childList" && mutation.addedNodes.length > 0) { const button = iframe.getElementById("submit") if (button&&isSubmit) { isSubmit = false setIframe() observer.disconnect(); } break; } } }); observer.observe(iframe, { childList: true, subtree: true }); }); } function setIframe(){ const iframe = document.getElementById("modalIframe").contentWindow.document const commentTr = iframe.getElementById("comment").parentNode.parentNode const nextSibling = commentTr.nextSibling; const parent = commentTr.parentNode const buttonElement = document.createElement("tr"); const buttonThElement = document.createElement("th"); buttonThElement.textContent = "自动关联git链接"; const buttonTdElement = document.createElement("td"); const gitButton = document.createElement("button"); gitButton.textContent = "关联"; gitButton.classList.add("btn"); gitButton.classList.add("btn-primary"); gitButton.addEventListener('click', async(event)=>{ event.preventDefault() const gitUrl = await getGitUrl() if(gitUrl?.result?.length){ const iframe = document.getElementById("modalIframe").contentWindow.document const iframeDocument = iframe.querySelector('.ke-edit').childNodes[0].contentWindow.document const iframDom = iframeDocument.querySelector('body').innerHTML const gitText = gitUrl.result.map(item=>`<p><a href="${item}">${item}</a></p>`).join('') iframeDocument.querySelector('body').innerHTML = iframDom.replace('<p>请在此处描述该bug修复时提交&合并的分支及revision号</p>',gitText) }else{ alert('id未查询到git合并记录!') } }) buttonTdElement.appendChild(gitButton); buttonElement.appendChild(buttonThElement); buttonElement.appendChild(buttonTdElement); if (nextSibling) { parent.insertBefore(buttonElement, nextSibling); } else { parent.appendChild(buttonElement); } const submitButton = iframe.getElementById("submit") submitButton&&submitButton.addEventListener('click', function() { const titlebarElement = document.getElementById("titlebar"); //const inputElement = iframe.getElementById("bugTime"); const repair_time = 0; const valueElement = titlebarElement.querySelector(".prefix strong"); const radioElements = iframe.getElementsByName("bug") let bugid = valueElement.innerText let type = '' let title = '' let score = '' parent.removeChild(buttonElement) }); } const posturl = async(bugid, type, title, score, repair_time)=>{ return new Promise(async (resolve)=>{ const result = await fetch(`http://192.168.10.51:63183/postscoreurl`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ bugid, type, title, score, repair_time }) }) }) } const getGitUrl = async()=>{ return new Promise(async (resolve)=>{ const id = document.querySelector('#titlebar .heading .prefix strong').textContent const result = await fetch(`http://192.168.10.51:51081/api/gitlab/getGitUrl?id=${id}`, { method: 'GET', }) try { let res = await result.json() resolve(res) } catch (e) { resolve('') } }) } function style(iframeDocument){ const modalStyle = ` .bug-label { margin-left:15px } .bug-label input { margin-right:5px; position:relative; top:2px } .bug-list { margin-top:10px } .bug-select { width:100px } .bug-time{ margin:10px } `; const styleBlock = iframeDocument.createElement('style'); styleBlock.textContent = modalStyle; iframeDocument.head.appendChild(styleBlock); } } async function zentaoScore(){ const titlebarElement = document.getElementById("titlebar"); const valueElement = titlebarElement.querySelector(".prefix strong"); const bugid = valueElement.innerText const get = ()=>{ return new Promise(async (resolve)=>{ const result = await fetch(`http://192.168.10.51:63183/getscoreurl?bugid=${bugid}`, { method: 'GET', }) try { let res = await result.text() res = res?JSON.parse(res):{type:0,repair_time:''} const resTable = Array.isArray(res)?res:[res] resolve(resTable.length?resTable:[{type:0,repair_time:''}]) } catch (e) { resolve([{type:0,repair_time:''}]) } }) } const result = await get() const tabs = document.createElement('div'); const container = document.getElementsByClassName('main-side')[0] style() /* tabs.style="border:1px solid #ddd;padding:10px" tabs.innerHTML=` <div style="text-align: right;color: #036;"><span class="scoreButton" style="cursor: pointer;" id="bugSubmit">提交</span></div> <div> BUG原因:<br> <label class="bug-label" for="bug1"><input id="bug1" type="radio" name="bug" value="0" ${result[0].type===0 ? "checked='checked'" : "" } />无特殊原因</label><br> <label class="bug-label" for="bug2"><input id="bug2" type="radio" name="bug" value="1" ${result[0].type===1 ? "checked='checked'" : "" } />需求设计问题</label><br> <label class="bug-label" for="bug3"><input id="bug3" type="radio" name="bug" value="2" ${result[0].type===2 ? "checked='checked'" : "" } />上个版本已存在</label><br> <label class="bug-label" for="bug4"><input id="bug4" type="radio" name="bug" value="3" ${result[0].type===3 ? "checked='checked'" : "" } />无自测条件</label><br> <label class="bug-label" for="bug5"><input id="bug5" type="radio" name="bug" value="4" ${result[0].type===4 ? "checked='checked'" : "" } />外部因素</label><br> <label class="bug-label" for="bug6"><input id="bug6" type="radio" name="bug" value="5" ${result[0].type===5 ? "checked='checked'" : "" } />无测试用例</label><br> <label class="bug-label" for="bug7"><input id="bug7" type="radio" name="bug" value="6" ${result[0].type===6 ? "checked='checked'" : "" } />已知技术风险点</label><br> <label class="bug-label" for="bug8"><input id="bug8" type="radio" name="bug" value="7" ${result[0].type===7 ? "checked='checked'" : "" } />重复bug</label> </div> <div id="list1" class="bug-list"> BUG系数: <select id="select1" class="bug-select"> <option value="0">0</option> <option value="0.1">0.1</option> <option value="0.2">0.2</option> <option value="0.3">0.3</option> <option value="0.4">0.4</option> <option value="0.5">0.5</option> </select> </div> ` container.appendChild(tabs); //const inputElement = document.getElementById("bugTime"); //inputElement.value = result[0].repair_time const bug1 = document.querySelector('#bug1') const bug2 = document.querySelector('#bug2') const bug3 = document.querySelector('#bug3') const bug4 = document.querySelector('#bug4') const bug5 = document.querySelector('#bug5') const bug6 = document.querySelector('#bug6') const bug7 = document.querySelector('#bug7') const bug8 = document.querySelector('#bug8') const list1 = document.querySelector('#list1') const select1 = document.querySelector('#select1') switch(result[0].type){ case 0: list1.style="display:none" break default: list1.style="" select1.selectedIndex = result[0].score*10 break } bug1.addEventListener('click', function() { list1.style="display:none" }); bug2.addEventListener('click', function() { list1.style="" select1.selectedIndex = 0 }); bug3.addEventListener('click', function() { list1.style="" select1.selectedIndex = 0 }); bug4.addEventListener('click', function() { list1.style="" select1.selectedIndex = 0 }); bug5.addEventListener('click', function() { list1.style="" select1.selectedIndex = 0 }); bug6.addEventListener('click', function() { list1.style="" select1.selectedIndex = 0 }); bug7.addEventListener('click', function() { list1.style="" select1.selectedIndex = 0 }); bug8.addEventListener('click', function() { list1.style="" select1.selectedIndex = 0 }); const submitButton = document.getElementById("bugSubmit") submitButton&&submitButton.addEventListener('click', function() { const radioElements = document.getElementsByName("bug") //const inputElement = document.getElementById("bugTime"); const repair_time = 0; let type = '' let title = '' let score = '' for (var i = 0; i < radioElements.length; i++) { if (radioElements[i].checked) { type = radioElements[i].value; switch(type){ case '0': title='无特殊原因' score=1 break case '1': title='需求设计问题' score=select1.value break case '2': title='上个版本已存在' score=select1.value break case '3': title='无自测条件' score=select1.value break case '4': title='外部因素' score=select1.value break case '5': title='无测试用例' score=select1.value break case '6': title='已知技术风险点' score=select1.value break case '7': title='重复bug' score=select1.value break default: } } } posturl(bugid, type, title, score, repair_time) }); */ const button = document.createElement('div'); const posturl = async(bugid, type, title, score, repair_time)=>{ return new Promise(async (resolve)=>{ const result = await fetch(`http://192.168.10.51:63183/postscoreurl`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ bugid, type, title, score, repair_time }) }) const operator = document.getElementById('userMenu').children[0].text.trim() fetch('http://192.168.10.51:63183/postzentao', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ bugid, username: '外部', operator }) }) document.getElementById('distributeName').innerHTML = '外部' alert('提交成功') }) } function style(){ const modalStyle = ` .bug-label { margin-left:15px } .bug-label input { margin-right:5px; position:relative; top:2px } .bug-list { margin-top:10px } .bug-select { width:100px } .scoreButton:active{ opacity: 0.7; } .bug-time{ margin:10px } `; const styleBlock = document.createElement('style'); styleBlock.textContent = modalStyle; document.head.appendChild(styleBlock); } } /** * 创建快捷备注 */ async function createWriteButton() { let nowDom = {} const fileArray = document.getElementsByTagName('fieldset') Object.keys(fileArray).forEach(v => { if (fileArray[v].innerText.includes('备注') && fileArray[v].getElementsByClassName('form-group').length) { nowDom = fileArray[v] } }) const container = document.getElementsByClassName('main-side')[0] const div3 = document.createElement("div") div3.style = "border:1px solid #ccc;padding:10px;width: 340px;margin-top: 10px;" container.appendChild(div3); const button1 = document.createElement("div") button1.innerHTML = ` <span id="aku-button-write" style="padding: 5px;border: 1px solid;cursor: pointer;background: aliceblue;">非研发问题</span> <span id="aku-some-write" style="padding: 5px;border: 1px solid;cursor: pointer;background: aliceblue;">重复bug</span>` div3.appendChild(button1); // 给予点击按钮事件 const akuButtonWrite = document.getElementById('aku-button-write') const akuSomeWrite = document.getElementById('aku-some-write') akuButtonWrite.addEventListener('click', function (e) { nowDom.getElementsByClassName('ke-edit-iframe')[0].contentDocument.body.nextSibling.innerHTML = '' nowDom.getElementsByClassName('ke-edit-iframe')[0].contentDocument.activeElement.innerHTML = '非研发问题,严重等级降为P2' }) akuSomeWrite.addEventListener('click', function (e) { nowDom.getElementsByClassName('ke-edit-iframe')[0].contentDocument.body.nextSibling.innerHTML = '' nowDom.getElementsByClassName('ke-edit-iframe')[0].contentDocument.activeElement.innerHTML = '重复bug,严重程度降为P2' }) }