// ==UserScript== // @name 妖火网增强插件 // @namespace https://yaohuo.me/ // @version 0.44 // @description 获得焦点时回复框自动停靠、加载更多楼层、回复任意楼层、异步评论、双击定位评论区、发帖增强、图床直达、超链图片回复 // @author 外卖不用券(id:23825) // @match https://*.yaohuo.me/* // @icon https://yaohuo.me/css/favicon.ico // @license MIT // @downloadURL none // ==/UserScript== if ( /^\/bbs-.*\.html$/.test(window.location.pathname) || "/bbs/book_view.aspx" === window.location.pathname ) { // 回复框停靠 let content = document.getElementsByClassName("content")[1]; let form = document.getElementsByName("f")[0]; content.removeChild(form); let newDiv = document.createElement("div"); let clazz = document.createAttribute("class"); clazz.value = "sticky"; newDiv.setAttributeNode(clazz); newDiv.style.cssText = "padding: 7px; background-color: #fff"; newDiv.innerHTML = form.outerHTML; document.body.insertBefore(newDiv, content); let sticky = false; newDiv.onclick = () => { let form = document.getElementsByName("f")[0]; let sendmsg = document.getElementsByName("sendmsg")[0]; let span = document.createElement("span"); let textNode = document.createTextNode("取消回复停靠"); span.appendChild(textNode); span.style.cssText = "float: right"; span.onclick = (e) => { e.cancelBubble = true; newDiv.style.cssText = "padding: 7px; background-color: #fff"; form.removeChild(span); sticky = false; }; if (!sticky) { newDiv.style.cssText = "position: sticky; top: 0; bottom: 0; padding: 7px; background-color: #fff"; form.insertBefore(span, sendmsg); sticky = true; } }; // 加载更多回复 let more = document.getElementsByClassName("more")[0]; if (more) { let moreLink = more.getElementsByTagName("a")[0]; let totalpage = Math.ceil( /getTotal=\d+/.exec(moreLink.href)[0].slice(9) / 15 ); let currpage = 1; let topage = parseInt(/&page=\d+/.exec(moreLink.href)[0].slice(6)); let tourl = moreLink.href.replace("&page=" + topage, ""); // more.removeChild(moreLink); let newMoreLink = document.createElement("a"); let span1 = document.createElement("span"); let span1_id = document.createAttribute("id"); span1_id.value = "YH_show_loadimg"; span1.setAttributeNode(span1_id); newMoreLink.appendChild(span1); let span2 = document.createElement("span"); let span2_id = document.createAttribute("id"); span2_id.value = "YH_show_tip"; span2.setAttributeNode(span2_id); span2.appendChild( document.createTextNode("加载更多(" + currpage + "/" + totalpage + ")") ); newMoreLink.appendChild(span2); newMoreLink.style.width = "50%"; more.appendChild(newMoreLink); moreLink.style.width = "50%"; more.appendChild(moreLink); newMoreLink.onclick = () => YH_show_next(totalpage, 15, currpage, tourl, "page"); } // 回复任意楼层 replyAny(); // 双击定位评论区 let bbscontent = document.getElementsByClassName("bbscontent")[0]; bbscontent.ondblclick = () => document.getElementsByClassName("sticky")[0].scrollIntoView(true); // 妖火图床、超链接、图片 form = document.getElementsByName("f")[0]; form.removeChild(form.lastChild); form.insertAdjacentHTML( "beforeend", ` 超链 图片 图床
` ); // 超链接 const textarea = document.querySelector( "body > div.sticky > form > textarea" ); document.getElementById("ubb_url").addEventListener("click", (e) => { e.preventDefault(); insertText(textarea, "[url][/url]", 6); }); document.getElementById("ubb_img").addEventListener("click", (e) => { e.preventDefault(); insertText(textarea, "[img][/img]", 6); }); // 异步评论 let submitBtn = document.getElementsByName('g')[0]; submitBtn.onclick = function(e) { const formData = new FormData(document.forms[0]); const entries = formData.entries(); const data = Object.fromEntries(entries); data.g = '快速回复'; if (data.content.length > 0) { e.preventDefault(); // 阻止表单提交事件 console.log(data); fetch('/bbs/book_re.aspx', { // 异步POST请求表单 method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8;' }, body: new URLSearchParams(data) }).then(res => { document.getElementsByName("content")[0].value = ''; let recontent = document.getElementsByClassName('recontent')[0]; fetch('/bbs-' + data.id + '.html').then(res => res.text()).then(html => { // 异步GET请求页面 // 重新渲染评论区 let newcontent = /recontent">(.*?)
超链接 图片 视频 更多...
` ); document.getElementById("ubb_a").addEventListener("click", () => { insertText(bookContent, "[url][/url]", 6); }); document.getElementById("ubb_f").addEventListener("click", () => { insertText(bookContent, "[forecolor=#FF0000][/forecolor]", 12); }); document.getElementById("ubb_b").addEventListener("click", () => { insertText(bookContent, "[b][/b]", 4); }); document.getElementById("ubb_s").addEventListener("click", () => { insertText(bookContent, "[strike][/strike]", 9); }); document.getElementById("ubb_img").addEventListener("click", () => { insertText(bookContent, "[img][/img]", 6); }); document.getElementById("ubb_movie").addEventListener("click", () => { insertText(bookContent, "[movie=100%*100%][/movie]", 8); }); document.getElementById("ubb_audio").addEventListener("click", () => { insertText(bookContent, "[audio=X][/audio]", 8); }); document.getElementById("ubb_more").addEventListener("click", () => { let ubb_tool = document.getElementsByClassName("more_ubb_tools")[0]; ubb_tool.style.display = ubb_tool.style.display === "none" ? "block" : "none"; }); } function insertText(obj, str, offset) { if (document.selection) { var sel = document.selection.createRange(); sel.text = str; } else if ( typeof obj.selectionStart === "number" && typeof obj.selectionEnd === "number" ) { var startPos = obj.selectionStart, endPos = obj.selectionEnd, cursorPos = startPos, tmpStr = obj.value; obj.value = tmpStr.substring(0, startPos) + str + tmpStr.substring(endPos, tmpStr.length); cursorPos += str.length; obj.selectionStart = obj.selectionEnd = cursorPos - offset; } else { console.log("///"); console.log(obj.value); obj.value += str; } obj.focus(); } function replyAny() { let sticky = document.getElementsByClassName("sticky")[0]; let recontent = document.getElementsByClassName("recontent")[0].childNodes; for (let i = 0; i < recontent.length; i++) { try { let replyLink = recontent[i].getElementsByTagName("a")[0].href; recontent[i].onclick = () => { let reply = /reply=\d+/.exec(replyLink)[0].slice(6); let touserid = /touserid=\d+/.exec(replyLink)[0].slice(9); sticky.style.cssText = "position: sticky; top: 0; bottom: 0; padding: 7px; background-color: #fff"; sticky.click(); let form = document.getElementsByName("f")[0]; if (form.firstChild.tagName === "B") { form.removeChild(form.firstChild); form.removeChild(form.firstChild); form.removeChild(form.firstChild); form.removeChild(form.firstChild); } form.insertAdjacentHTML( "afterbegin", "回复" + reply + '楼取消回复楼层
' ); if (form.lastChild.tagName === "INPUT") { form.removeChild(form.lastChild); form.removeChild(form.lastChild); } form.insertAdjacentHTML( "beforeend", '' ); form.insertAdjacentHTML( "beforeend", '' ); document.getElementsByClassName("noreply")[0].onclick = () => { form.removeChild(form.firstChild); form.removeChild(form.firstChild); form.removeChild(form.firstChild); form.removeChild(form.firstChild); form.removeChild(form.lastChild); form.removeChild(form.lastChild); }; }; } catch (error) {} } } // YH_common.js var xmlhttp = null; var YH_now_currpage = 0; var YH_page_total = 0; var YH_scoll_downEnd = 0; function YH_show_next(YH_total, YH_pagesize, YH_currpage, tourl, pagetype) { YH_page_total = parseInt(YH_total); var pagesize = parseInt(YH_pagesize); var currpage = parseInt(YH_currpage); if (YH_now_currpage == 0) { YH_now_currpage = currpage + 1; } else { YH_now_currpage = YH_now_currpage + 1; } document.getElementById("YH_show_loadimg").innerHTML = ' '; document.getElementById("YH_show_tip").innerHTML = "正在努力加载(" + YH_now_currpage + "/" + YH_page_total + ")中"; if (YH_now_currpage > YH_page_total) { document.getElementById("YH_show_loadimg").innerHTML = ""; document.getElementById("YH_show_tip").innerHTML = "没有更多了"; } else { tourl = tourl + "&" + pagetype + "=" + YH_now_currpage; LoadXML_Async(tourl); } } function LoadXML_Async(tourl) { try { if (window.XMLHttpRequest) { xmlhttp = new XMLHttpRequest(); if (xmlhttp.overrideMimeType) { xmlhttp.overrideMimeType("text/xml"); } } else if (window.ActiveXObject) { var activexName = ["MSXML2.XMLHTTP", "Microsoft.XMLHTTP", ""]; for (var i = 0; i < activexName.length; i++) { try { xmlhttp = new ActiveXObject(activexName[i]); break; } catch (e) {} } } xmlhttp.onreadystatechange = YH_CallBack; xmlhttp.open("GET", tourl, true); xmlhttp.send(null); } catch (e) { document.getElementById("YH_show_loadimg").innerHTML = ' '; document.getElementById("YH_show_tip").innerHTML = "加载出错了!"; } } function YH_CallBack() { if (xmlhttp == null) { return; } if (xmlhttp.readyState == 4) { if (xmlhttp.status == 200) { var responseText = xmlhttp.responseText; var st = responseText.indexOf(""); var et = responseText.indexOf(""); if (st < 0 || et < 0) { document.getElementById("YH_show_loadimg").innerHTML = ""; document.getElementById("YH_show_tip").innerHTML = "加载完全部了!"; } else { responseText = responseText.substring(st + 12, et); document.getElementsByClassName("recontent")[0].style.display = "block"; document.getElementsByClassName("recontent")[0].innerHTML += responseText; replyAny(); if (YH_now_currpage == YH_page_total) { document.getElementById("YH_show_loadimg").innerHTML = ""; document.getElementById("YH_show_tip").innerHTML = "没有更多了"; } else { document.getElementById("YH_show_loadimg").innerHTML = ""; document.getElementById("YH_show_tip").innerHTML = "加载更多(" + YH_now_currpage + "/" + YH_page_total + ")"; } } } } }