您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
bigger emote preview
// ==UserScript== // @name youtube twitch BIG emote preview // @match https://www.twitch.tv/* // @exclude-match https://www.twitch.tv/*/* // @match https://www.youtube.com/live_chat* // @version 1.1 // @license MIT // @description bigger emote preview // @namespace https://greasyfork.org/users/1121708 // ==/UserScript== switch(location.host){ case "www.twitch.tv": let observer_chat= new MutationObserver( (records)=>{ records.forEach( (record)=>{ if(record.addedNodes) record.addedNodes.forEach( (node)=>{ if(node.nodeName != "#text") node.querySelectorAll("img").forEach( (img)=>{ img.onmouseover= addImg; }); }); }); }); let observer_element= new MutationObserver( (records)=>{ records.forEach( (record)=>{ if(record.addedNodes) record.addedNodes.forEach( (node)=>{ if(node.className && (node.classList.contains("support-panel-container") || node.className.match(/bttv-EmoteMenuPopover/))) node.onmouseover= addImg; }); else if(record.removedNodes) record.removedNodes.forEach( (node)=>{ if(node.className && (node.classList.contains("support-panel-container") || node.className.match(/bttv-EmoteMenuPopover/))) node.onmouseover= undefined; }); }); }); let observer_emote_picker= new MutationObserver( (records)=>{ records.forEach( (record)=>{ record.addedNodes.forEach( (node)=>{ if(node.className && (node.classList.contains("cafndC") || node.classList.contains("lpdoyl"))) node.onmouseover= addImg; }); }); }); var observer_root= new MutationObserver( (records)=>{ records.forEach( (record)=>{ record.addedNodes.forEach( (node)=>{ if(node.className && node.classList.contains("cwtKyw")){ observer_element.observe(document.querySelector(".channel-root__player"), {childList: true}); // support-panel-container observer_element.observe(document.body, {childList: true}); // bttv-EmoteMenuPopover observer_emote_picker.observe(document.querySelector(".blcfev"), {childList: true}); // emote-picker observer_chat.observe(document.querySelector(".cNKHwD"), {childList: true, subtree: true}); // bits N points observer_chat.observe(document.querySelector(".dsMzFl"), {childList: true, subtree: true}); // chat input observer_chat.observe(document.querySelector(".chat-scrollable-area__message-container"), {childList: true, subtree: true}); // chat message observer_root.disconnect(); } }); }); }); break; case "www.youtube.com": var observer_root = new MutationObserver( (records)=>{ records.forEach( (record)=>{ record.addedNodes.forEach( (node)=>{ if(node.tagName == 'IMG') if(node.classList.contains('yt-emoji-picker-upsell-category-renderer')|| node.classList.contains('yt-emoji-picker-category-renderer')|| node.classList.contains('yt-live-chat-text-message-renderer')|| node.classList.contains('yt-live-chat-author-badge-renderer')) node.onmouseover= addImg; }); }); }); } observer_root.observe(document, {childList: true, subtree: true}); function addImg(event){ if(event.target.tagName == 'IMG'){ switch(location.host){ case "www.twitch.tv": // use url in srcset if(event.target.hasAttribute('srcset')){ let url= ["",""]; event.target.srcset.split(/,/).forEach((e)=>{ let arr= e.trim().split(/ /); if(url[1] < arr[1]) url[0]= arr[0]; }); newImg(url[0], event); } break; case "www.youtube.com": newImg(event.target.src.split(/=/)[0]+"=w128-h128-c", event); // w24-h24-c-k-nd // single w, h, s also work // add -c resize // add -k no playing frames // dont know what -nd doing } } function newImg(src, event){ let img= document.createElement('IMG'); let offset= (location.host == "www.twitch.tv")? 28 : 32; img.onmouseleave= ()=>{ if(img) img.remove();}; img.onload= ()=>{ if(img){ img.style.setProperty('left', (event.clientX+offset+img.width > innerWidth ? event.clientX-offset-img.width : event.clientX+offset)+'px'); img.style.setProperty( 'top', (event.clientY+offset+img.height > innerHeight? event.clientY-offset-img.height: event.clientY+offset)+'px'); document.body.append(img); } }; img.style.setProperty('z-index', '20250317'); img.style.setProperty('position', 'fixed'); img.src= src; event.target.onmouseleave= ()=>{ img.remove(); if(!img.complate) img=undefined; }; } }