油猴脚本(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.rhkb.cn/news/197321.html

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

相关文章

【2021集创赛】基于arm Cortex-M3处理器与深度学习加速器的实时人脸口罩检测 SoC

团队介绍 参赛单位:深圳大学 队伍名称:光之巨人队 指导老师:钟世达、袁涛 参赛队员:冯昊港、潘家豪、慕镐泽 图1 团队风采 1. 项目简介 新冠疫情席卷全球,有效佩戴口罩可以极大程度地减小病毒感染的风险。本项目开发…

【计算机毕业设计】Springboot 社区助老志愿服务系统-96682, 免费送源码,【开题选题+程序定制+论文书写+答辩ppt书写-原创定制程序】

Springboot 社区助老志愿服务系统 摘要 大数据时代下,数据呈爆炸式地增长。为了迎合信息化时代的潮流和信息化安全的要求,利用互联网服务于其他行业,促进生产,已经是成为一种势不可挡的趋势。在图书馆管理的要求下,开发…

斯坦福机器学习 Lecture1 (机器学习,监督学习、回归问题、分类问题定义)

https://www.bilibili.com/video/BV1JE411w7Ub?p1&vd_source7a1a0bc74158c6993c7355c5490fc600 笔记如下 机器学习的定义:不需要明确编程就能让计算机去学习做某件事情 另一个定义 什么是监督学习? 给定一组 (x,y) 样本,学习一个 x-&g…

分布式任务调度-XXL-job

目录 源码仓库地址 前置环境 docker容器环境配置 连接linux数据库,并创建任务调度所用到的数据库xxl-job。 用到的表sql 打开映射网址 后端配置使用任务调度 依赖 yml配置 使用架构 config配置 job使用 快速入门使用 任务调度执行器 任务调度执行管理​编…

【开源】基于Vue和SpringBoot的微信小程序的音乐平台

项目编号: S 055 ,文末获取源码。 \color{red}{项目编号:S055,文末获取源码。} 项目编号:S055,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示 四、核心代码4.1 查询单首…

数据库的三范式(Normalization)

数据库的三范式(Normalization)是关系数据库设计中的基本理论原则,旨在减少数据冗余和提高数据库的数据组织结构。三范式通过将数据分解为更小的表,并通过关系建立连接,使得数据库设计更加灵活、规范和容易维护。在这篇…

Android问题笔记四十六:解决open failed: EACCES (Permission denied) 问题

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列点击跳转>ChatGPT和AIGC 👉关于作者 专…

PY32F002B从压缩包到实现串口printf输出

最近学习使用芯领的PY32F002B开发板,记录学习历程供有同样需求的人参考。 本文主要讲述利用开发板实现printf语句串口输出。 开发环境的初步搭建 官方提供了一个压缩文件,文件名py32f002B_231026.zip, 链接:https://pan.baidu.c…

Wordpress多语言插件:WPML插件使用教程,最佳的多语言建站方案

今天小编讲的是另外一款多语言插件WPML。相比Gtranslate采用的是机器翻译,难免存在翻译不准确,词不达意的情况,WPML可以支持人工翻译内容添加。 事先说明一点:用插件实现多语言较为方便,但此方法做出的多语言网站SEO性能一般,只建议展示站使用,如果想要SEO营销型多语言网…

【vue2】前端如何播放rtsp 视频流,拿到rtsp视频流地址如何处理,海康视频rtsp h264 如何播放

文章目录 测试以vue2 为例新建 webrtcstreamer.js下载webrtc-streamervideo.vue页面中调用 最近在写vue2 项目其中有个需求是实时播放摄像头的视频,摄像头是 海康的设备,搞了很长时间终于监控视频出来了,记录一下,放置下次遇到。…

AI创作系统ChatGPT网站源码/支持DALL-E3文生图/支持最新GPT-4-Turbo模型+Prompt应用

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…

山西电力市场日前价格预测【2023-11-20】

日前价格预测 预测说明: 如上图所示,预测明日(2023-11-20)山西电力市场全天平均日前电价为255.39元/MWh。其中,最高日前电价为436.50元/MWh,预计出现在18:00。最低日前电价为21.61元/MWh,预计出…

Unity使用Visual Studio Code 调试

Unity 使用Visual Studio Code 调试C# PackageManager安装Visual Studio EditorVisual Studio Code安装Unity 插件修改Unity配置调试 PackageManager安装Visual Studio Editor 打开 Window->PackageManger卸载 Visual Studio Code Editor ,这个已经被官方废弃安…

【网络】OSI模型 与 TCP/IP模型 对比

一、OSI模型 OSI模型包含7个层次,从下到上分别是: 1. 物理层(Physical Layer) - 功能:处理与电子设备物理接口相关的细节(如电压、引脚布局、同步,等等)。 - 协议:以…

【数据结构(二)】队列(2)

文章目录 1. 队列的应用场景和介绍1.1. 队列的一个使用场景1.2. 队列介绍 2. 数组模拟队列2.1. 思路分析2.2. 代码实现 3. 数组模拟环形队列3.1. 思路分析3.2. 代码实现 1. 队列的应用场景和介绍 1.1. 队列的一个使用场景 银行排队的案例: 1.2. 队列介绍 队列是一…

计算机毕设 深度学习 机器学习 酒店评价情感分析算法实现

文章目录 0 前言概述项目所需模块数据数据说明字段说明 数据处理分词处理停用词处理样本均衡建立多层感知机分类模型训练模型网络检测率以及检测结果 最后 0 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点&a…

element el-date-picker报错Prop being mutated:“placement“快速解决方式

报错信息 Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop’s value. Prop being mutated: “placement” 报错版本 element-ui 2.15.6 和 2.15…

CSS特效014:模仿钟摆效果

CSS常用示例100专栏目录 本专栏记录的是经常使用的CSS示例与技巧,主要包含CSS布局,CSS特效,CSS花边信息三部分内容。其中CSS布局主要是列出一些常用的CSS布局信息点,CSS特效主要是一些动画示例,CSS花边是描述了一些CSS…

【论文阅读笔记】Supervised Contrastive Learning

【论文阅读笔记】Supervised Contrastive Learning 摘要 自监督批次对比方法扩展到完全监督的环境中,以有效利用标签信息提出两种监督对比损失的可能版本 介绍 交叉熵损失函数的不足之处,对噪声标签的不鲁棒性和可能导致交叉的边际,降低了…