您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
在B站笔记中:打开笔记快捷键:Ctrl+Shift+↑,关闭笔记快捷键:Ctrl+Shift+↓,笔记窗口切换到视频窗口:Ctrl+Shift+←,视频窗口切换到笔记窗口:Ctrl+Shift+→,截图+时间戳快捷键:Ctrl+↓,时间戳+截图快捷键:Ctrl+↑,时间戳快捷键:Ctrl+←,截图快捷键:Ctrl+→,下载视频笔记Ctrl+Shift+S
当前为
// ==UserScript== // @name B站笔记快捷键←↓→ // @namespace https://space.bilibili.com/1208812226 // @version 2.7 // @description 在B站笔记中:打开笔记快捷键:Ctrl+Shift+↑,关闭笔记快捷键:Ctrl+Shift+↓,笔记窗口切换到视频窗口:Ctrl+Shift+←,视频窗口切换到笔记窗口:Ctrl+Shift+→,截图+时间戳快捷键:Ctrl+↓,时间戳+截图快捷键:Ctrl+↑,时间戳快捷键:Ctrl+←,截图快捷键:Ctrl+→,下载视频笔记Ctrl+Shift+S // @author 大王鹅鹅鹅 // @match http*://www.bilibili.com/video/* // @match https://www.bilibili.com/medialist/* // @icon https://static.hdslb.com/images/favicon.ico // @grant none // @license AGPL License // ==/UserScript== (function () { "use strict"; // JS监听键盘快捷键事件 document.addEventListener("keydown", function (event) { if (event.shiftKey && event.keyCode == 38) {//打开笔记——快捷键:Ctrl+Shift+↑ if (event.ctrlKey) { document.querySelector("div.note-btn.note-btn__blue").click(); document .querySelector(".operation-desc") .click(); var count = 2; var timeId = setInterval(function () { count--; if (count <= 0) { clearInterval(timeId); } initFocusDown(); }, 600); //固定笔记 var myresize = document.querySelector(".resizable-component"); myresize.style.position = 'fixed'; myresize.style.setProperty('position', 'fixed', 'important'); } } if (event.shiftKey && event.keyCode == 40) {//关闭笔记——快捷键:Ctrl+Shift+↓ if (event.ctrlKey) { document .querySelector(".close-note") .click(); } } if (event.shiftKey && event.keyCode == 37) {//回到视频——快捷键:Ctrl+Shift+← if (event.ctrlKey) { var pNodel = document.querySelector( "div.editor-innter.ql-container.ql-snow > div.ql-editor" ); pNodel.blur(); } } if (event.shiftKey && event.keyCode == 39) {//回到笔记——快捷键:Ctrl+Shift+→ if (event.ctrlKey) { var el = document.querySelector( "div.editor-innter.ql-container.ql-snow > div.ql-editor" ); var scrollHeight = el.scrollHeight; el.scrollTo(0, scrollHeight); el.focus(); if ( typeof window.getSelection != "undefined" && typeof document.createRange != "undefined" ) { var range = document.createRange(); range.selectNodeContents(el); range.collapse(false); var sel = window.getSelection(); sel.removeAllRanges(); sel.addRange(range); } else if (typeof document.body.createTextRange != "undefined") { var textRange = document.body.createTextRange(); textRange.moveToElementText(el); textRange.collapse(false); textRange.select(); } } } if (event.ctrlKey && event.keyCode == 37) {//时间戳——快捷键:Ctrl+← if (!event.shiftKey) { document.querySelector("i.bili-note-iconfont.iconicon_flag_L").click(); setTimeout(function () { document .querySelector( "div.dialog-btn.tag-dialog__btn--confirm:nth-child(2)" ) .click(); }, 5 * 100); } } if (event.ctrlKey && event.keyCode == 38) {//时间戳+截图——快捷键:Ctrl+↑ if (!event.shiftKey) { imageAfterTime(); } } if (event.ctrlKey && event.keyCode == 39) {//截图——快捷键:Ctrl+→ if (!event.shiftKey) { document.querySelector("i.bili-note-iconfont.iconcapture-app").click(); setTimeout(function () { var parentNode = document.querySelector( "div.editor-innter.ql-container.ql-snow > div.ql-editor" ); var scrollHeight = parentNode.scrollHeight; parentNode.scrollTo(0, scrollHeight); parentNode.focus(); }, 500); } } if (event.ctrlKey && event.keyCode == 40) {//截图+时间戳——快捷键:Ctrl+↓ if (!event.shiftKey) { timeAfterImage(); } } if (event.shiftKey && event.keyCode == 83) {//下载笔记为markdown格式——快捷键:Ctrl+Shift+S if (event.ctrlKey) { openNote(); } } }); function initFocusDown() { document.querySelector("div.note-btn.note-btn__blue:nth-child(2)").click(); document.querySelector("div.note-list-footer > div.note-list-btn").click(); var el = document.querySelector( "div.editor-innter.ql-container.ql-snow > div.ql-editor" ); var scrollHeight = el.scrollHeight; el.scrollTo(0, scrollHeight); el.focus(); if ( typeof window.getSelection != "undefined" && typeof document.createRange != "undefined" ) { var range = document.createRange(); range.selectNodeContents(el); range.collapse(false); var sel = window.getSelection(); sel.removeAllRanges(); sel.addRange(range); } else if (typeof document.body.createTextRange != "undefined") { var textRange = document.body.createTextRange(); textRange.moveToElementText(el); textRange.collapse(false); textRange.select(); } } function openNote() { const editor = document.querySelector(".ql-editor") ? document.querySelector(".ql-editor") : null; if(!editor){alert("请先打开视频笔记,快捷键:Ctrl+Shift+↑");return;} const isBlank = editor && !editor.classList.contains("ql-blank"); if (isBlank) { const noteContent = getNoteContent(editor); downloadMD(noteContent); } else { alert("笔记为空,无法下载"); } } function getNoteContent(editor) { if ( editor.nodeType === 1 && editor.childNodes && editor.childNodes.length > 0 ) { return getNodes2Array(editor.childNodes); } return ""; } function getNodes2Array(nodes) { const contents = []; for (let i = 0; i < nodes.length; i++) { const node = nodes[i]; if (node.nodeType == 1) { if (node.nodeName == "P") { if (node.querySelector('div') || node.querySelector('span') || node.querySelector('strong') || node.querySelector('u') || node.querySelector('s')) { contents.push(node2string(node)); }else{ contents.push(node.innerHTML.replace(/src="(?!https:)(.*?)"/g, 'src="https:$1"').replace(/<br\s*\/?>/gi, "\n")); } } else if (node.nodeName == "OL" || node.nodeName == "UL") { contents.push(getLiContent(node)); } else if (node.nodeName == "DIV") { contents.push(divImgContent(node)); } else { contents.push(node.textContent); } } } return contents; } function getLiContent(node) { let allLiContent = ""; let nodeName = node.nodeName; let liNodes = node.childNodes; let indentLevels = {}; if (liNodes && liNodes.length > 0) { for (let li of liNodes) { let liclass = li.getAttribute("class"); let indentLevel = 0; if (liclass) { let match = liclass.match(/ql-indent-(\d+)/); if (match) { indentLevel = parseInt(match[1]); } } indentLevels[indentLevel] = (indentLevels[indentLevel] || 0) + 1; let indent = ""; for (let i = 0; i < indentLevel; i++) { indent += "\t"; } allLiContent += indent + (nodeName == "OL" ? indentLevels[indentLevel] + ". " : "- ") + node2string(li) + "\n"; } } return allLiContent; } function divImgContent(node) { if (!node.classList || !node.classList.contains("ql-image-preview")) { return; } let img = node.querySelector("img"); let src = img ? "https:" + img.getAttribute("src") : ""; if (!src.includes("http")) { return; } let content = src ? src : ""; if (!content.match(/api.bilibili.com\/x\/note\/image/g)) { content = ""; } return content; } function node2string(node) { debugger; let nodes = node.childNodes; if (!nodes || nodes.length <= 0) return ""; let line = ""; for (let i = 0; i < nodes.length; i++) { let child = nodes[i]; let tag = child.nodeName; let myContents = ""; if ( (child.classList && child.classList.contains("ql-tag-blot")) || tag === "DIV" ) { //时间戳 let timeText = child.querySelector(".time-tag-item__text"); let desc = child.querySelector(".time-tag-item__desc"); let p = child.getAttribute("data-index"); let second = child.getAttribute("data-seconds"); let pUrl = window.location.href; let match = pUrl.match( /(https\:\/\/www.bilibili.com\/video\/)(BV|av)[a-zA-Z0-9]+(?=[\/\?])?/g ); pUrl = match ? match[0] : pUrl; let title = "🚩" + timeText.firstChild.textContent + (desc ? " " + desc.textContent : ""); let time = `${pUrl}?p=${p}&t=${second}`; myContents += `[${title}](${time})`; } else { if (!child.children || child.children.length == 0) { myContents += child.textContent; } else { myContents += node2string(child); } //针对文字ql-bg let className = ""; if (child.classList) { let myClassList = child.classList; for (let a = 0; a < myClassList.length; a++) { if (myClassList[a].match(/ql-bg/)) { className += "background-color:" + myClassList[a].slice(-7) + ";"; } if (myClassList[a].match(/ql-color/)) { className += "color:" + myClassList[a].slice(-7) + ";"; } if (myClassList[a].match(/ql-size/)) { className += "font-size:" + myClassList[a].slice(8, myClassList[a].length) + ";"; } } } if (child.children && child.querySelector('.ql-tag-blot')==null) { let font1 = className != "" ? "<font style='" + className + "'>" : ""; let font2 = className != "" ? "</font>" : ""; myContents = font1 + myContents + font2; if (tag == "U" || tag == "S" || tag == "STRONG") { myContents = "<" + tag.toLowerCase() + ">" + myContents + "</" + tag.toLowerCase() + ">"; } else if (tag == "BR") { myContents += "\n"; } else { myContents += ""; } } } line += myContents; } return line; } function getNowTime(){ var now = new Date(); var year = now.getFullYear(); var month = now.getMonth() + 1; var date = now.getDate(); var hours = now.getHours(); var minutes = now.getMinutes(); var seconds = now.getSeconds(); hours = hours < 10 ? '0' + hours : hours; minutes = minutes < 10 ? '0' + minutes : minutes; seconds = seconds < 10 ? '0' + seconds : seconds; var dateString = year + "-" + month + "-" + date + " " + hours + ":" + minutes + ":" + seconds; return dateString; } function getInfo(){ let allContent =""; try{ const username = document.querySelector(".username").firstChild.textContent.trim(); const pudate_text = document.querySelector(".pudate-text").firstChild.textContent.trim(); const views = document.querySelector("span.view.item").getAttribute("title"); let pUrl = window.location.href; let match = pUrl.match(/(https\:\/\/www.bilibili.com\/video\/)(BV|av)[a-zA-Z0-9]+(?=[\/\?])?/g); pUrl = match ? match[0] : pUrl; allContent = "---\ntags: bilibili_note\nurl: "+pUrl+"\nup: "+username+"\nup_date: "+pudate_text+"\ndown_time: "+getNowTime()+"\nviews: "+views+"\n---\n\n"; }catch(e){ let pUrl = window.location.href; let match = pUrl.match(/(https\:\/\/www.bilibili.com\/video\/)(BV|av)[a-zA-Z0-9]+(?=[\/\?])?/g); pUrl = match ? match[0] : pUrl; allContent = "---\ntags: bilibili_note\nurl: "+pUrl+"\ndown_time: "+getNowTime()+"\n---\n\n"; } return allContent; } function downloadMD(notes) { let allContent =getInfo(); let bid = window.location.href.match( /(?<=bilibili.com\/video\/)(BV|av)[a-zA-Z0-9]+(?=[\/\?])?/g ); for (var i = 0; i < notes.length; i++) { if (notes[i] != "") { let images_id = notes[i].match( /(?<=api.bilibili.com\/x\/note\/image\?image_id=)\d{6}/g ); if (images_id) { allContent += "" + "\n"; //下载图片 downloadImages(notes[i], bid[0]); } else { allContent += notes[i] + "\n"; } } else { allContent += "\n"; } } //下载md let video_title = document.querySelector(".video-title"); let v_title = video_title ? video_title.textContent : new Date().getTime(); setTimeout(function () { downloadFiles("bilibili_" + v_title + ".md", allContent); }, 1000); } async function downloadImages(src, bid) { let res = await fetch(src, { method: "get", credentials: src.includes("bilibili.com") ? "include" : "omit", }); if (!res.ok) return; let blob = await res.blob(); let fileName = src.slice(-6); downloadFiles(bid + "_" + fileName + ".jpg", blob); } function downloadFiles(fileName, myblob) { let blob = new Blob([myblob]); let a = document.createElement("a"); a.href = URL.createObjectURL(blob); a.download = fileName; document.body.appendChild(a); a.click(); document.body.removeChild(a); } function imageAfterTime() {//时间戳+截图 ↑ new Promise((resolve,reject)=>{ document.querySelector('i.bili-note-iconfont.iconicon_flag_L').click(); return resolve(); }).then(()=>{ setTimeout( function(){ document.querySelector('div.dialog-btn.tag-dialog__btn--confirm:nth-child(2)').click(); },500); }); new Promise((resolve,reject)=>{ setTimeout( function(){ document.querySelector('i.bili-note-iconfont.iconcapture-app').click(); },1000); return resolve(); }).then(()=>{ setTimeout( function(){ var parentNode=document.querySelector('div.editor-innter.ql-container.ql-snow > div.ql-editor'); var childN=parentNode.childNodes; var scrollHeight =parentNode.scrollHeight; parentNode.scrollTo(0,scrollHeight); parentNode.focus(); for(var i=1;childN.length-1;i++){ if(childN[i].innerHTML=="<br>" && childN[i].previousSibling.innerHTML!="<br>" && childN[i].previousSibling.nodeName == "P" && childN[i].nextSibling.nodeName == "DIV"){ childN[i].remove(); } } },1100); }); } function timeAfterImage(){//截图+时间 ↓ document.querySelector('i.bili-note-iconfont.iconcapture-app').click(); new Promise((resolve,reject)=>{ document.querySelector('i.bili-note-iconfont.iconicon_flag_L').click(); return resolve(); }).then(()=>{ setTimeout( function(){ document.querySelector('div.dialog-btn.tag-dialog__btn--confirm:nth-child(2)').click(); var parentNode=document.querySelector('div.editor-innter.ql-container.ql-snow > div.ql-editor'); var childN=parentNode.childNodes; for(var i=0;childN.length;i++){ if(childN[i].innerHTML=="<br>" && childN[i].nextSibling.innerHTML!="<br>" && childN[i].nextSibling.nodeName == "P" && childN[i].previousSibling.nodeName == "DIV"){ childN[i].remove(); } } },1500); }); } function toEnd(el) { var scrollHeight = el.scrollHeight; el.scrollTo(0, scrollHeight); el.focus(); if (typeof window.getSelection != "undefined" && typeof document.createRange != "undefined") { var range = document.createRange(); range.selectNodeContents(el); range.collapse(false); var sel = window.getSelection(); sel.removeAllRanges(); sel.addRange(range); } else if (typeof document.body.createTextRange != "undefined") { var textRange = document.body.createTextRange(); textRange.moveToElementText(el); textRange.collapse(false); textRange.select(); } } })(); window.onload=function(){ let newDiv = document.createElement('div'); newDiv.style.position="absolute"; newDiv.style.zIndex=99999999999999999999; newDiv.style.cursor="pointer"; newDiv.setAttribute("id", "my_icon") newDiv.style.display="none"; const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); svg.setAttribute('version', '1.1'); svg.setAttribute('id', 'mu'); svg.setAttribute('xmlns', 'http://www.w3.org/2000/svg'); svg.setAttribute('xmlns:xlink', 'http://www.w3.org/1999/xlink'); svg.setAttribute('x', '0px'); svg.setAttribute('y', '0px'); svg.setAttribute('width', '40px'); svg.setAttribute('height', '40px'); svg.setAttribute('viewBox', '0 0 40 40'); svg.setAttribute('enable-background', 'new 0 0 40 40'); svg.setAttribute('xml:space', 'preserve'); svg.innerHTML = "<image id='image0' width='40' height='40' x='0' y='0' href='data:image/png;base64,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' />"; newDiv.appendChild(svg); document.body.after(newDiv); function getSelect(){ let select = null, range = null; let selectedText = "",selectedHtml=""; if(window.getSelection){ select = window.getSelection(); selectedText = select.toString(); //range = select.getRangeAt(0); //var docFragment = range.cloneContents(); //var tempDiv = document.createElement("div"); //tempDiv.appendChild(docFragment); // 获取html range = select.getRangeAt(0); var docFragment = range.cloneContents(); var tempDiv = document.createElement("div"); tempDiv.appendChild(docFragment); selectedHtml = tempDiv.innerHTML; } else if(document.selection){ select = document.selection; range = select.createRange(); selectedText = range.text; selectedHtml = range.htmlText; } return selectedHtml; }; var currentText=null; var interval = ""; var oBaby =document.body; var oIcon = document.getElementById('my_icon'); oBaby.onmouseup = function (event) { var ev = event || window.event; var left = ev.pageX; var top = ev.pageY; currentText=getSelect(); if (currentText.length > 1) { setTimeout(function () { oIcon.style.display = 'block'; oIcon.style.left = left + 'px'; oIcon.style.top = top-20 + 'px'; }, 100); } else { oIcon.style.display = 'none'; } }; oBaby.onclick = function (event) { var ev = event || window.event; ev.cancelBubble = true; }; document.onclick = function () { setTimeout(function () { oIcon.style.display = 'none'; clearInterval(interval); }, 500); }; oIcon.onclick = function () { let angle = 0; interval = setInterval(() => { angle += 60; this.style.transformOrigin = '20px 20px'; this.style.transform = `rotate(${angle}deg)`; }, 80); const editor = document.querySelector(".ql-editor")? document.querySelector(".ql-editor"): null; if(editor){ editor.append(getAllComment(currentText)); var scrollHeight = editor.scrollHeight; editor.scrollTo(0, scrollHeight); }else{ alert("请先打开视频笔记,快捷键:Ctrl+Shift+↑"); } }; //comment function getComment(htmlString){ var tempStr=""; let newspan = document.createElement('span'); var tStr=parserString2HTML(htmlString); var leftEntry = tStr.querySelector('.left-entry'); if(leftEntry!=null){ return newspan; } htmlString = htmlString.replace(/<(?!img|br)[^>]*>/g, ''); htmlString = htmlString.replace(/<img[^>]*src="data:image[^"]*"[^>]*>/g, ''); htmlString = htmlString.replace(/<img[^>]+src="([^"]+)"[^>]+>/gi, function(match, p1) { if (p1.endsWith('.svg')) { return ''; } return match; }); var newHtml = htmlString.replace(/<img[^>]*>/g, function(match) { var src = match.match(/src="([^"]*)"/)[1]; return "<img>"+src+"<img>"; }); tempStr=newHtml.split(/<img[^>]*>/g) for(var i=0;i<tempStr.length;i++){ if(/png/.test(tempStr[i])){ let newImg = document.createElement('img'); newImg.setAttribute('width', '24px'); newImg.setAttribute('height', '24px'); newImg.setAttribute('src', tempStr[i]); newspan.append(newImg); //newspan.append("\n") }else{ newspan.append(tempStr[i].replace(/<br>/g,"\n")) } } return newspan; } function getAllComment(htmlString){ let newspan = document.createElement('span'); var tempStr=parserString2HTML(htmlString); var subReplyItem = tempStr.querySelectorAll(".sub-reply-item"); var subUserInfo = tempStr.querySelector('.sub-user-info'); var replyItem = tempStr.querySelectorAll(".reply-item"); var userInfo = tempStr.querySelector('.user-info'); if(replyItem!=null && replyItem.length>0){ for(let i=0;i<replyItem.length;i++){ let rootReplyContainer = replyItem[i].querySelector('.root-reply-container'); if(rootReplyContainer!=null){ let biliAvatar = rootReplyContainer.querySelector('.root-reply-avatar .avatar .bili-avatar'); //主评论头像 if(biliAvatar!=null){ let imgSrc = biliAvatar.firstElementChild.getAttribute('src'); let newImg = document.createElement('img'); newImg.setAttribute('width', '24px'); newImg.setAttribute('height', '24px'); newImg.style.setProperty('border', 'none'); newImg.style.setProperty('border-radius', '50%'); newImg.style.setProperty('overflow', 'hidden'); newImg.setAttribute('src', imgSrc); newspan.append(newImg); } //主评论userid和用户名 let userName = rootReplyContainer.querySelector('.content-warp .user-info .user-name'); if(userName!=null){ let dataUserId=userName.getAttribute('data-user-id'); let userNameReal=userName.textContent; let newA = document.createElement('a'); newA.setAttribute('href', 'https://space.bilibili.com/'+dataUserId); newA.textContent=userNameReal+":"; newspan.append(newA); } } let noteText = replyItem[i].querySelector('.note-text-container .note-text'); if(noteText!=null){ newspan.append(getComment(noteText.firstElementChild.innerHTML)) }else{ let replyContentContainer = replyItem[i].querySelector('.root-reply .reply-content'); if(replyContentContainer!=null){ newspan.append(getComment(replyContentContainer.innerHTML)) } } newspan.append("\n\n") let sReplyItem = replyItem[i].querySelectorAll('.sub-reply-item'); for(let j=0;j<sReplyItem.length;j++){ newspan.append(avatarUserNameContent(sReplyItem[j],sReplyItem[j])); newspan.append("\n\n") } } }else if(userInfo!=null){ //主评论userid和用户名 let userName = userInfo.querySelector('.user-info .user-name'); if(userName!=null){ let dataUserId=userName.getAttribute('data-user-id'); let userNameReal=userName.textContent; let newA = document.createElement('a'); newA.setAttribute('href', 'https://space.bilibili.com/'+dataUserId); newA.textContent=userNameReal+":"; newspan.append(newA); } let noteText = tempStr.querySelector('.note-text-container .note-text'); if(noteText!=null){ newspan.append(getComment(noteText.firstElementChild.innerHTML)) }else{ let replyContentContainer = tempStr.querySelector('.reply-content-container .reply-content'); if(replyContentContainer!=null){ newspan.append(getComment(replyContentContainer.innerHTML)) } } newspan.append("\n\n") let sReplyItem = tempStr.querySelectorAll('.sub-reply-item'); for(let j=0;j<sReplyItem.length;j++){ newspan.append(avatarUserNameContent(sReplyItem[j],sReplyItem[j])); newspan.append("\n\n") } }else if(subReplyItem!=null && subReplyItem.length>0){ let replyContentContainer = tempStr.querySelector('.root-reply .reply-content-container .reply-content'); if(replyContentContainer!=null){ newspan.append(getComment(replyContentContainer.innerHTML)) newspan.append("\n\n") } for(let i=0;i<subReplyItem.length;i++){ newspan.append(avatarUserNameContent(subReplyItem[i],subReplyItem[i])); newspan.append("\n\n") } }else if(subUserInfo!=null){ newspan.append(avatarUserNameContent(subUserInfo,tempStr)); }else{ let isSubUserInfo = tempStr.querySelector('.sub-reply-avatar .avatar .bili-avatar'); if(isSubUserInfo==null){ newspan.append(getComment(htmlString)) } } return newspan; } function parserString2HTML(htmlString){ const parser = new DOMParser(); const htmlDoc = parser.parseFromString(htmlString, "text/html"); return htmlDoc; } function avatarUserNameContent(subUserInfo,tempStr){ let nSpan = document.createElement('span'); let subBiliAvatar = subUserInfo.querySelector('.sub-reply-avatar .avatar .bili-avatar'); //sub评论头像 if(subBiliAvatar!=null){ let subImgSrc = subBiliAvatar.firstElementChild.getAttribute('src'); let newImg = document.createElement('img'); newImg.setAttribute('width', '24px'); newImg.setAttribute('height', '24px'); newImg.style.setProperty('border', 'none'); newImg.style.setProperty('border-radius', '50%'); newImg.style.setProperty('overflow', 'hidden'); newImg.setAttribute('src', subImgSrc); nSpan.append(newImg); } let subUserName = subUserInfo.querySelector('.sub-user-name'); if(subUserName!=null){ let dataUserId=subUserName.getAttribute('data-user-id'); let UserName=subUserName.textContent; let newA = document.createElement('a'); newA.setAttribute('href', 'https://space.bilibili.com/'+dataUserId); newA.textContent=UserName+":"; nSpan.append(newA); } let replyContentContainer = tempStr.querySelector('.reply-content-container .reply-content'); if(replyContentContainer!=null){ nSpan.append(getComment(replyContentContainer.innerHTML)) } return nSpan; } };