直播间自动点赞第一章:MouseEvent 实现根据坐标X,Y自动点击浏览器的效果

news2024/11/16 23:49:05

最终项目

制作一个自动点赞的浏览器插件,可以根据用户指定一个浏览器区域,进行自动化点击,其中可以设置参数:点击频率、指定区域。


本章节效果

指定了一块区域,进行点击,这边是模拟直播间实现自动化点击

在这里插入图片描述


主要代码

simulateClick是实现一次点击:

  1. selector:是传入的querySelector选择器参数
  2. getBoundingClientRect:得到了元素的left,right,top,bottom
  3. document.elementFromPoint:根据上面的位置传入一个随机坐标,生成一个元素element
  4. MouseEvent:生成鼠标事件
  5. element 进行触发鼠标点击事件
var simulateClick = function (selector) {
  console.log("simulateClick...");
  let handle = document.querySelector(selector).getBoundingClientRect()

  var left = handle.left,
    right = handle.right,
    top = handle.top,
    bottom = handle.bottom;

  var randomX = (left + right) / 2 + Math.random() * 100;
  var randomY = (top + bottom) / 2 + Math.random() * 100;

  var element = document.elementFromPoint(randomX, randomY);

  console.log(randomX, randomY);
  var evt = new MouseEvent('click', {
    bubbles: true,
    cancelable: true,
    view: window,
    clientX: randomX,
    clientY: randomY
  });

  element.dispatchEvent(evt);
}

源码

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }

        body {
            width: 100%;
            height: 100vh;
            background-color: blanchedalmond;
            position: relative;
            display: flex;
            justify-content: center;
            align-items: center;
        }

        /* 用于展示点击位置而已,其实可以不显示 */
        .point {
            position: absolute;
            display: inline-block;
            top: 20px;
            background-color: rgb(146, 160, 160);
            width: 100px;
            height: 100px;
            opacity: 0;
            border-radius: 100%;
        }

        .point::after {
            content: "";
            position: absolute;
            width: 100%;
            height: 100%;
            border-radius: 50%;
            background-color: rgba(0, 0, 0, 0.3);
            transform: scale(0);
            animation: rippleEffect 1s linear infinite;
        }

        .animate {
            animation: displayNone 1.5s linear normal;
        }

        .player {
            width: 80%;
            height: 80%;
            background-color: rgb(184, 120, 42);
            display: flex;
            justify-content: center;
            align-items: center;
        }

        .player span {
            user-select: none;
            font-size: 12vw;
            white-space: nowrap;
            color: #fff;
            text-shadow: 2px 2px 5px rgba(0, 0, 0, 0.3),
                5px 5px 70px rgba(255, 255, 255, 0.3);
        }

        /* 动画效果 */
        @keyframes displayNone {
            0% {
                opacity: 1;
            }

            100% {
                opacity: 0;
            }
        }

        @keyframes rippleEffect {
            0% {
                transform: scale(0);
                opacity: 1;
            }

            100% {
                transform: scale(2);
                opacity: 0;
            }
        }
    </style>
</head>

<body>
    <div class="point animate"></div>
    <div class="player">
        <span>
            直播区间
        </span>
    </div>

    <script>
        let body = document.querySelector("body");
        let point = document.querySelector(".point");
        const computedStyle = window.getComputedStyle(point);
        const width = computedStyle.width;
        const height = computedStyle.height;

        // 监听点击事件,添加一些样式以及动画,为了展示而已,后期可以不使用
        body.addEventListener("click", (e) => {
            // console.log(e.clientX, e.clientY, point.style);
            point.classList.remove("animate");

            setTimeout(() => {
                point.style.left = (e.clientX - parseInt(width) / 2) + 'px';
                point.style.top = (e.clientY - parseInt(height) / 2) + 'px';
                // 添加 CSS 类以触发动画
                point.classList.add("animate");
            }, 0);
        })

        // 在动画结束后移除 CSS 类
        point.addEventListener("animationend", function () {
            point.classList.remove("animate");
        });

        // 主要的代码
        // 简单的点击
        // 输入的参数,是需要点击的一个selector 选择器
        var simulateClick = function (selector) {
            let handle = document.querySelector(selector).getBoundingClientRect()

            var left = handle.left,
                right = handle.right,
                top = handle.top,
                bottom = handle.bottom;

            // 弄一个随机位置
            var randomX = (left + right) / 2 + Math.random() * 100;
            var randomY = (top + bottom) / 2 + Math.random() * 100;

            var element = document.elementFromPoint(randomX, randomY);

            var evt = new MouseEvent('click', {
                bubbles: true,
                cancelable: true,
                view: window,
                clientX: randomX,
                clientY: randomY
            });

            element.dispatchEvent(evt);
        }

        setInterval(() => {
            simulateClick('.player');
        }, 200);

    </script>
</body>

</html>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java 进阶篇】JDBC数据库连接池Druid工具类详解

在Java应用程序中&#xff0c;数据库连接是一种重要的资源&#xff0c;因为每次创建和销毁数据库连接都会产生开销&#xff0c;降低了系统性能。为了高效地管理数据库连接&#xff0c;降低资源消耗&#xff0c;常常使用数据库连接池。Druid是一个功能强大的数据库连接池&#x…

成品短视频App源码:10个最热门的功能模块详解

作为成品短视频App源码领域的专家&#xff0c;我将为您揭开成品短视频App的神秘面纱。在这篇文章中&#xff0c;我将详细介绍这热门应用背后的10个最受欢迎的功能模块。无论您是想开发一款创新的短视频App&#xff0c;还是寻找适合您业务的现成解决方案&#xff0c;本文都会为您…

递归

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析&#xff08;3&#xff09; 目录 &#x1f449;&#x1f3fb;汉诺塔 &#x1f449;&…

C#Winform新建工程

C#Winform新建工程 选择创建新项目 搜索窗体 填写工程名称和位置

第四课 递归、分治

文章目录 第四课 递归、分治lc78.子集--中等题目描述代码展示 lc77.组合--中等题目描述代码展示 lc46.全排列--中等题目描述代码展示 lc47.全排列II--中等题目描述代码展示 lc226.翻转二叉树--简单题目描述代码展示 lc98.验证二叉搜索树--中等题目描述代码展示 lc104.二叉树的最…

八、Thymeleaf链接表达式

链接表达式使用&#xff20;符开头&#xff0c;用于描述一个URL&#xff0c;url可以是相对的&#xff0c;也可以是绝对的。当为相对路径时&#xff0c;此表达式用于在指定的URI前拼接项目的根路径&#xff0c;相当于request.getContextPath()。当为绝对路径时&#xff0c;路径按…

纳百川冲刺创业板上市:计划募资约8亿元,宁德时代为主要合作方

近日&#xff0c;纳百川新能源股份有限公司&#xff08;下称“纳百川”&#xff09;向深交所创业板递交的上市申请材料获得受理&#xff0c;浙商证券为其独家保荐人。 本次冲刺上市&#xff0c;纳百川计划募资8.29亿元&#xff0c;将用于纳百川&#xff08;滁州&#xff09;新能…

【力扣-每日一题】901. 股票价格跨度

暴力解法&#xff1a; class StockSpanner { private:vector<int> pri; public:StockSpanner() {}int next(int price) {pri.emplace_back(price);int count0;for(int ipri.size()-1;i>0;i--){if(pri[i]<price)count;else break;}return count;} };/*** Your Stoc…

软件工程与计算总结(五)软件需求基础

本帖介绍软件需求涉及的诸多基本概念&#xff0c;通过对这些概念的阐述&#xff0c;剖析软件需求的来源、层次、类别、作用等重要知识~ 目录 ​编辑 一.引言 二.需求工程基础 1.简介 2.活动 3.需求获取 4.需求分析 5.需求规格说明 6.需求验证 7.需求管理 三.需求基…

第85步 时间序列建模实战:CNN回归建模

基于WIN10的64位系统演示 一、写在前面 这一期&#xff0c;我们介绍CNN回归。 同样&#xff0c;这里使用这个数据&#xff1a; 《PLoS One》2015年一篇题目为《Comparison of Two Hybrid Models for Forecasting the Incidence of Hemorrhagic Fever with Renal Syndrome i…

比特币的惊人飙升:“ 自最初定价高于零以来,价格飙升了 3,600,000,000% !“

10 月6 日是第一个比特币用户计算比特币价格的周年纪念日&#xff0c;这表明他们愿意购买或出售数字货币。 14年前的这一天&#xff0c;比特币价格诞生了。 正如比特币历史学家Pete Rizzo今天在 X 上发表的一篇文章中指出的那样 &#xff0c;”10 月 6 日是早…

【时间之外】EA交易代码入门

目录 MetaEditor简介 最简单的EA交易代码 代码编译 EA附加到图表 EA测试 EA正式上线 注意事项 本不打算写这篇文章&#xff0c;后来看到CSDN里有很多介绍交易软件的文章&#xff0c;平时也碰到很多人问我自动化交易的问题&#xff0c;还是写一篇科普文章&#xff0c;毕竟…

详细介绍区块链之挖矿

对不起&#xff0c;大家&#xff0c;这篇文章对作者来说实在是太有意义和含金量了&#xff0c;作者想把它设置为关注博主才能见全文&#xff0c;请大家理解&#xff01;如果觉得还是看不懂&#xff0c;抱歉耽误大家的时间&#xff0c;就请取消关注&#xff01;&#xff01;&…

开源即时通讯IM框架 MobileIMSDK v6.4 发布

一、更新内容简介 本次更新为次要版本更新&#xff0c;进行了若干优化&#xff08;更新历史详见&#xff1a;码云 Release Notes、Github Release Notes&#xff09;。MobileIMSDK 可能是市面上唯一同时支持 UDPTCPWebSocket 三种协议的同类开源IM框架。 二、MobileIMSDK简介…

EverWeb for Mac:轻松创建出色网站的强大网页设计软件

如果你正在寻找一款优质的网页设计软件&#xff0c;那么EverWeb for Mac绝对值得考虑。这款软件旨在为用户提供专业级的网站建设工具&#xff0c;帮助你轻松创建出令人印象深刻的网站。 在EverWeb for Mac中&#xff0c;用户可以快速轻松地创建网站布局和设计。该软件支持各种…

Linux 系统为何产生大量的 core 文件?

Author&#xff1a;rab 目录 一、问题分析二、解决方案扩展 一、问题分析 上一篇刚讲到《Docker 配置基础优化》&#xff0c;这里再补充一下。就在中秋国庆这段小长假里&#xff0c;接收到了线上服务器磁盘告警通知&#xff0c;线上服务器架构是一个 Docker Swarm 集群&#x…

flutter开发实战-video_player插件播放抖音直播实现(仅限Android端)

flutter开发实战-video_player插件播放抖音直播实现&#xff08;仅限Android端&#xff09; 在之前的开发过程中&#xff0c;遇到video_player播放视频&#xff0c;通过查看video_player插件描述&#xff0c;可以看到video_player在Android端使用exoplayer&#xff0c;在iOS端…

一个例子帮您掌握python正则re.match、re.search和re.findall的区别

在使用python正则进行字符串匹配查询时&#xff0c;最常用的三个函数是re.match、re.search和re.findall&#xff0c;在这里我就用一个例子带大家了解这三者的使用区别&#xff0c;话不多说我们直接上代码&#xff01; import re txt"test,a:123,b:1234,c:12345,hello!&…

二叉树--翻转二叉树

文章前言&#xff1a;如果有小白同学还是对于二叉树不太清楚&#xff0c;作者推荐&#xff1a;二叉树的初步认识_加瓦不加班的博客-CSDN博客 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 如果思路不清楚&#xff0c;请看动态页面&am…

二叉树--对称二叉树

小白同学对于二叉树还是不太了解的&#xff0c;作者推荐&#xff1a;二叉树的初步认识_加瓦不加班的博客-CSDN博客 对称二叉树-力扣 101 题 作者给的图&#xff1a; 代码&#xff1a; public boolean isSymmetric(TreeNode root) {//刚刚开始&#xff0c;传入的是顶堆的左、右…