您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Add an inline expand button for YouTube links like RES does for images.
// ==UserScript== // @name Reddit Inline YouTube Viewer // @namespace reddit_youtube_expando // @description Add an inline expand button for YouTube links like RES does for images. // @include http://*.reddit.com/* // @include https://*.reddit.com/* // @match http://*.reddit.com/* // @match https://*.reddit.com/* // @version 1.3 // @grant none // ==/UserScript== // This work is licensed under the Creative Commons Attribution 2.0 Generic License. // To view a copy of this license, visit http://creativecommons.org/licenses/by/2.0/. // This version of the regex can scrub some technicaly invalid links into valid ones, but I'm not sure // the list of video ID characters is correct. var youtubeLinkRegex = new RegExp("(?:^https?://(?:www\\.)?youtube\\.com/watch\\?(?:.*&)*v=([a-zA-Z0-9\\-_]+)[^#]*(?:#t=(.*$))?)|(?:^http://youtu.be/([a-zA-Z0-9\\-_]+))") /* // Flash Embed var starTimeRegex = new RegExp("(?:(\\d+)m)?(\\d+)s") function addYouTubeEmbed(videoID, startTime) { var videoURL = "http://www.youtube.com/v/" + videoID if (startTime) { starTimeResult = starTimeRegex.exec(startTime) if (starTimeResult) { minutes = parseInt(starTimeResult[1]) if (!minutes) { minutes = 0 } seconds = parseInt(starTimeResult[2]) seconds += minute * 60 videoURL = videoURL + "&start=" + seconds } } var embedDiv = document.createElement("div") var embedObject = document.createElement("object") embedObject.setAttribute("type", "application/x-shockwave-flash") embedObject.setAttribute("style", "width:450px; height:366px; float: left") embedObject.setAttribute("data", videoURL) var paramElm = document.createElement("param") paramElm.setAttribute("name", "movie") paramElm.setAttribute("value", videoURL) embedObject.appendChild(paramElm) embedDiv.appendChild(embedObject) return embedDiv } */ // IFrame Embed function addYouTubeEmbed(videoID, startTime) { var embedDiv = document.createElement("div") var embedObject = document.createElement("iframe") embedObject.setAttribute("class", "youtube-player") embedObject.setAttribute("type", "text/html") embedObject.setAttribute("width", "450") embedObject.setAttribute("height", "366") embedObject.setAttribute("allowfullscreen", "allowfullscreen") embedObject.setAttribute("mozallowfullscreen", "mozallowfullscreen") embedObject.setAttribute("webkitallowfullscreen", "webkitallowfullscreen") linkProto = ('https:' == document.location.protocol ? 'https:' : 'http:') if (startTime) { embedObject.setAttribute("src", linkProto + "//www.youtube.com/embed/" + videoID + "#t=" + startTime) } else { embedObject.setAttribute("src", linkProto + "//www.youtube.com/embed/" + videoID) } embedObject.setAttribute("frameborder", "0") embedDiv.appendChild(embedObject) return embedDiv } var commentExpandoStyle = "vertical-align:top !important; float: none; width: 23px; height: 23px;" + "max-width: 23px; max-height: 23px; display: inline-block;" + "margin-right: 6px; cursor: pointer; padding: 0px;" function addButtons(postDiv) { var innerLinks = Array.prototype.slice.call(postDiv.getElementsByTagName("a")); for (var j in innerLinks) { //innerLinks[j].className += " youtubeScanned" linkResult = youtubeLinkRegex.exec(innerLinks[j].href) if (linkResult) { innerLinks[j].className = innerLinks[j].className + " youtubeLinkFound" function genClickFunc() { // Capture these values with closure for the button function var theDiv = document.createElement("div") var embedObject = null // videoID from a youtube.com link || from a youtu.be link var videoID = linkResult[1] || linkResult[3] var startTime = linkResult[2] theDiv.setAttribute("class", "expando-button collapsed video") theDiv.setAttribute("style", commentExpandoStyle) var clickFunc = function () { if(theDiv.className.indexOf("collapsed") != -1) { theDiv.setAttribute("class", "expando-button expanded video") if (!embedObject) { embedObject = addYouTubeEmbed(videoID, startTime) } theDiv.parentNode.insertBefore(embedObject, theDiv.nextSibling) } else { theDiv.setAttribute("class", "expando-button collapsed video") theDiv.parentNode.removeChild(embedObject) } } innerLinks[j].parentNode.insertBefore(theDiv, innerLinks[j].nextSibling) theDiv.addEventListener('click', clickFunc, true) } genClickFunc() } } } var mdElements = document.getElementsByClassName("md") // Find all user created comment sections for (var i in mdElements) { if (mdElements[i].tagName == 'DIV') { addButtons(mdElements[i]); } } // hasClass, stolen from the Reddit Enhancement Suite function hasClass(ele,cls) { if ((typeof(ele) == 'undefined') || (ele == null)) { console.log(arguments.callee.caller); return false; } return ele.className.match(new RegExp('(\\s|^)'+cls+'(\\s|$)')); } // Add a listener for the DOMNodeInserted event so we can expand emotes in new comments // created by either a reply or by clicking "load more comments" in large threads. function handleInsertion( event ) { // The actual even we see will be the insertion of the outer "thing" div if ((event.target.tagName == 'DIV') && (hasClass(event.target, "thing"))) { var mdElements = event.target.getElementsByClassName("md") for (var i in mdElements) { if (mdElements[i].tagName == 'DIV') { addButtons(mdElements[i]); } } } } document.body.addEventListener('DOMNodeInserted', handleInsertion, false);