油猴脚本(JavaScript)-练手-简单的随机音乐播放器

浅浅的写个简单的随机音乐播放脚本(可移动),注释很详细,直接上源码

效果:
在这里插入图片描述

// ==UserScript==
// @name         播放音乐脚本
// @namespace    代码对我眨眼睛
// @version      1.2
// @description  在API上请求音乐链接并随机自动连续播放音乐,带有可拖动的界面控制按钮
// @match        *://*/*
// @grant        GM_xmlhttpRequest
// @grant        GM_addStyle
// ==/UserScript==//封装一个立即执行函数
(function() {//使用严格模式'use strict';// 添加样式GM_addStyle(//添加按钮样式`#musicToggle {position: fixed;top: 10px;left: 10px;padding: 5px;background-color: #65d7ed;color: #3a8bff;cursor: move;z-index: 1000;}`);let audioElement; // 定义音频元素以便在函数之间共享,用以判断音频是否存在或者播放完毕let ing=0;//判断脚本是否正在音频之中,以防多次点击let isMusicPlaying = false;//用于追踪音乐是否正在播放let isMusicPaused = false; // 用于追踪音乐是否暂停/*移动前的x和y的位置,移动后的x和y的位置,是否为拖动行为判断*/let dragStartX, dragStartY, offsetX = 0, offsetY = 0, isDragging = false;/*在html的body后一面动态的添加一个div元素,模拟一个按钮的形状*/const toggleButton = document.createElement('div');/*给按钮命名id */toggleButton.id = 'musicToggle';/*给按钮加上文本 */toggleButton.textContent = '播放音乐';// 添加按钮到页面document.body.appendChild(toggleButton);// 请求并播放音乐函数function playMusic(url) {//因为前面判断过了,一般不会有这种存在音频还申请的情况,以防万一if (audioElement) {audioElement.pause(); // 如果存在当前音频,则暂停它}//申请一个新音频(这个api会自动随机)audioElement = new Audio(url);//播放音频audioElement.play();//开启监听函数,当音频播放完成时audioElement.addEventListener('ended', function() {//将播放状态设为否isMusicPlaying = false;//如果没有暂停if (!isMusicPaused) {//调用请求函数requestMusic();}});//在函数内已经播放了,这个返回值没有上,无伤大雅//(叫什么来着,保持函数结构的完整性 bushi)return audioElement;}// 发起请求的函数function requestMusic() {GM_xmlhttpRequest({method: 'GET',url: 'http://api.sc1.fun/API/changyam.php',onload: function(response) {//申请返回内容const url = response.responseText;//播放内容对应的地址playMusic(url);isMusicPlaying = true; // 设置标志表示音乐正在播放},//报错onerror: function(error) {console.error('请求音乐失败:', error);}});}// 切换音乐播放状态function toggleMusic() {if (audioElement) {//console.log(`暂停音乐`);//加入需要耗费时间的进程了,先标记禁用一下按钮防止多次请求ing=1;//如果正在播放if (isMusicPlaying) {audioElement.pause(); // 暂停音频//将按键文本调成·播放音乐·document.getElementById('musicToggle').textContent = '播放音乐';isMusicPlaying = false;isMusicPaused = true;}  //如果停止播放else {audioElement.play(); // 恢复播放音频//将按键文本调成·停止音乐·document.getElementById('musicToggle').textContent = '停止播放';isMusicPaused = false;isMusicPlaying = true;}//耗费时间的进程加载完了,标记加载结束开启按键响应ing=0;} else {//同上ing=1;// 如果没有音频元素,则开始播放//console.log(`没有音频元素,则开始播放`);//申请播放新音频requestMusic();//将将按键文本调成·停止音乐·,即目前正在播放document.getElementById('musicToggle').textContent = '停止播放';//同上ing=0;}}// 鼠标按下时记录初始位置toggleButton.addEventListener('mousedown', function(e) {//记录开始按下时的x和y坐标dragStartX = e.clientX;dragStartY = e.clientY;//先将拖动标志设为false,因为暂时无法判断是否拖动isDragging = false;//将鼠标的图标换成抓手的图案toggleButton.style.cursor = 'grabbing';//如果按下以后鼠标有所移动则进入是否拖动的判断函数document.addEventListener('mousemove', dragMove);//当鼠标抬起则进入最后的操作函数document.addEventListener('mouseup', dragEnd);});// 鼠标移动时计算偏移量并更新按钮位置function dragMove(e) {//如果超出阈值则判定为拖动,否则直接返回(即点击时手抖轻微拖动或者已经停下了的情况)if (!isDragging) {const distance = Math.sqrt((e.clientX - dragStartX) ** 2 + (e.clientY - dragStartY) ** 2);if (distance > 5) {  // 设置您所需的拖动阈值//拖动判断标志设为真isDragging = true;} else {return;}}//计算拖动的x和y的距离offsetX += e.clientX - dragStartX;offsetY += e.clientY - dragStartY;//随时改变拖动的位置toggleButton.style.transform = `translate(${offsetX}px, ${offsetY}px)`;//存储按钮新的位置dragStartX = e.clientX;dragStartY = e.clientY;}// 鼠标释放时function dragEnd(e) {//将鼠标样式设为拖动toggleButton.style.cursor = 'move';//监听完毕去掉按键抬起和移动的事件监听,//因为这两个监听可以被按下的操作启用,//这样可以优化性能和防止冲突document.removeEventListener('mouseup', dragEnd);document.removeEventListener('mousemove', dragMove);}// 为按钮添加点击事件监听器toggleButton.addEventListener('click', function(e) {//如果不是拖动操作时并且未执行费时操作时则正常操作if ((!isDragging)&&(ing==0)) {toggleMusic();}//否则else {e.preventDefault(); // 防止拖动或正在执行费时操作文本还没改变时点击按钮}});})();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/193505.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Word 2016 删除标注

步骤: 菜单栏--审阅--删除--删除文档中的所有标注

大数据Doris(二十六):数据导入(Routine Load)介绍

文章目录 数据导入(Routine Load)介绍 一、​​​​​​​适用场景

汽车级低压差稳压器LDO LM317BD2TR4G原理、参数及应用

LM317BD2TR4G主要功能特性分析 : LM317BD2TR4G 低漏 (LDO) 线性电压稳压器是一款可调 3 端子正向 LDO 电压器,能够在 1.2 V 至 37 V 的输出电压范围内提供 1.5 A 以上的电流。此电压稳压器使用非常简便,仅需两个外部电阻即可设置输出电压。另…

鸿蒙应用开发之打包与上架

一、概述 当您开发、调试完HarmonyOS应用/元服务,就可以前往AppGallery Connect申请上架,华为审核通过后,用户即可在华为应用市场获取您的HarmonyOS应用/元服务。 HarmonyOS会通过数字证书与Profile文件等签名信息来保证应用的完整性&#…

【数据挖掘 机器学习 | 时间序列】时间序列必备工具箱: 自相关与偏相关检验

🤵‍♂️ 个人主页: AI_magician 📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。 👨‍💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!&…

win10电脑无法联网,设置IPv4,点击属性无法打开,闪退

win10设置IPv4,点击属性无法打开,闪退 问题:win10设置IPv4,点击属性无法打开,闪退 问题:win10设置IPv4,点击属性无法打开,闪退 第1步:用管理员打开cmd命令窗口,然后输入下面的命令&…

MySQL进阶_8.数据库其他调优策略

文章目录 第一节、数据库调优的步骤1.1、选择合适的DBMS1.2、优化表设计1.3、优化逻辑查询1.4、优化物理查询1.5、使用 Redis 或 Memcached 作为缓存1.6、库级优化 第二节、优化MySQL服务器第三节、优化数据库结构 第一节、数据库调优的步骤 1.1、选择合适的DBMS 如果对事务性…

es的优势

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目…

【设计模式】设计模式基础

设计模式基础 文章目录 设计模式基础一、七大设计原则1.1 概述1.2 单一职责原则1.3 接口隔离原则1.4 依赖倒转原则1.5 里氏替换原则1.6 开闭原则1.7 迪米特法则1.8 合成复用原则 二、UML类图2.1 概述2.2 依赖关系(Dependence)2.3 泛化关系(generalizatio…

庖丁解牛:NIO核心概念与机制详解 01

文章目录 Pre输入/输出Why NIO流与块的比较通道和缓冲区概述什么是缓冲区?缓冲区类型什么是通道?通道类型 NIO 中的读和写概述Demo : 从文件中读取1. 从FileInputStream中获取Channel2. 创建ByteBuffer缓冲区3. 将数据从Channle读取到Buffer中 Demo : 写…

『力扣刷题本』:环形链表(判断链表是否有环)

一、题目 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&am…