// ==UserScript== // @name 超星键盘控制优化 // @namespace https://greasyfork.org/zh-CN/users/782923-asea // @version 1.3 // @description 优化超星键盘控制观看体验,小键盘上下左右控制时间音量,加减控制倍速,若无效请单击窗口任一处再尝试,若仍无效请反馈 // @author Asea Q:569389750 // @match https://mooc1-1.chaoxing.com/mycourse/studentstudy* // @icon data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw== // @grant none // @downloadURL none // ==/UserScript== (function() { mainfn_flag = false // 主定时任务标志 window.onload =()=>{ if(mainfn_flag===false) { mainfn = setInterval(mainkeybind, 1000); // 开启主定时任务,监听元素是否加载,若加载出来则绑定事件 mainfn_flag = true; } // 用户单击本节课程时,url不会改变,但是iframe会重新加载,无法重新绑定事件,是目前的一个bug } var old_url = window.location.href; // 获取当前url,方便后面换课时调用 if(mainfn_flag===false) { mainfn = setInterval(mainkeybind, 1000); mainfn_flag = true; } function mainkeybind(){ if(document.readyState == 'complete') // 判断网页资源加载完毕 { urlfn = setInterval(url_listener, 2000) // 监听url变化 var vol = 0.1; //1代表100%音量,每次增减0.1 var time = 5; //单位秒,每次增减10秒 var rate = 0.2; // 倍速增长量,倍速最低0.2,最高16 try { var iframes = document.getElementById("iframe").contentWindow.document.querySelectorAll("iframe"); // 获取到页面内所有iframe,ppt以及video的iframe是在一个大的iframe里的 iframes.forEach(iframe=>{ if(iframe.contentWindow.document.getElementsByTagName('video').length > 0) // 判断是否含有video标签 { videoElement = iframe.contentWindow.document.querySelector('video') // 定位到video标签 videoElement.onclick = function(event) // 绑定鼠标点击事件 { videoElement = event.currentTarget // 定位当前元素 videoElement.onkeyup = keybind // 绑定键盘事件 function keybind(event) {//键盘事件 // console.log("keyCode:" + event.keyCode); var e = event || window.event || arguments.callee.caller.arguments[0]; //鼠标上下键控制视频音量 if (e && e.keyCode === 38) { // 按 向上键 videoElement.volume !== 1 ? videoElement.volume += vol : 1; return false; } else if (e && e.keyCode === 40) { // 按 向下键 videoElement.volume !== 0 ? videoElement.volume -= vol : 1; return false; } else if (e && e.keyCode === 37) { // 按 向左键 videoElement.currentTime !== 0 ? videoElement.currentTime -= time : 1; return false; } else if (e && e.keyCode === 39) { // 按 向右键 videoElement.volume !== videoElement.duration ? videoElement.currentTime += time : 1; return false; } else if (e && e.keyCode === 32) { // 按空格键 判断当前是否暂停 videoElement.paused === true ? videoElement.play() : videoElement.pause(); return false; } else if(e && e.keyCode === 187) { // 按加号键 倍速增加 videoElement.playbackRate > 0 && videoElement.playbackRate < 16 ? videoElement.playbackRate = (videoElement.playbackRate+rate).toFixed(1) : 1; return false; // 按减号键 倍速减少 } else if(e && e.keyCode === 189) { videoElement.playbackRate > rate ? videoElement.playbackRate = (videoElement.playbackRate-rate).toFixed(1) : 1; return false; } }; } } }); // console.log('变量设置完毕') document.getElementById("iframe").contentWindow.document.querySelector("iframe").contentWindow.document.querySelector('.vjs-big-play-button').click() // 自动播放 console.log('Done') // 总鼠标事件绑定完毕 clearInterval(mainfn); // 关闭加载元素的定时监听 mainfn_flag = false; // 主定时任务停止的标志 方便开启 } catch { console.log('Loading') // 元素未加载出来时 } } } function url_listener() { var now_url = window.location.href; // 当前url if (now_url !== old_url) // 判断是否换节课 { old_url = now_url; mainfn = setInterval(mainkeybind, 500); // 开启主定时任务 clearInterval(urlfn); // 关闭url监听定时任务 } } })();