chrome插件模拟isTrusted的事件

2024-09-02 20:36

本文主要是介绍chrome插件模拟isTrusted的事件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 方法
  • 原理

使用js模拟的事件isTrusted的值时false。有的时候我们想要模拟sTrusted未true的事件就比较麻烦了。
我们可以利用chrome插件的 chrome.debugger解决改问题。

方法

大体思路是:模拟事件的请求从content_script.js发出,到达background.js进行模拟。

  • manifest中声明debugger的权限
    manifest.json:
{"manifest_version": 3,"name": "test","description": "test","version": "0.0.1","background": {"service_worker": "background.js"},"action": {"default_popup": "./dist/index.html"},"content_scripts": [{"js": ["content_script.js"],"run_at": "document_start"}],"permissions": ["debugger",]
}
  • content_script.js发出请求
// 该函数的作用是:通过触发element身上的mousedown事件来触发element的点击事件
function openDebuggerToClick(element) {return new Promise((resolve, reject) => {console.log('click目标是', element)const x = element.getBoundingClientRect().left + 5const y = element.getBoundingClientRect().top + 5// 根据按钮的mousedown事件来触发点击事件element.addEventListener('mousedown',function (e) {if (!e.isTrusted) {e.preventDefault()let obj = { x, y }chrome.runtime.sendMessage({action: 'mousedownToClick',params: obj},function (response) {console.log('响应结果是', response)if (response.code === 200) {resolve('click success')} else {reject('click fail')}})}},true)// 触发clickelement.dispatchEvent(new MouseEvent('mousedown', {bubbles: true,cancelable: true}))})
}
  • background.js处理请求,模拟isTrusted未true的点击
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {if (request.action === 'mousedownToClick') {const { params } = requestimpMousedownToClick(params, sender, sendResponse)}return true
})
//  ----------------------mouseDown模拟点击跳过限制----------------
const impMousedownToClick = (params, sender, sendResponse) => {chrome.debugger.attach({ tabId: sender.tab.id }, '1.2', function () {console.log('接收到content的消息---------', params, sender)let flag = true// sendResponse({ yourEvent: '正在调整, 需要时间生效' })const xC = params.xconst yC = params.y//通过触发鼠标的按下和抬起事件来触发点击事件chrome.debugger.sendCommand({ tabId: sender.tab.id },'Input.dispatchMouseEvent',{ type: 'mousePressed', x: xC, y: yC, button: 'left', clickCount: 1 },function () {if (chrome.runtime.lastError) {console.error(chrome.runtime.lastError.message)flag = falsereturn}})chrome.debugger.sendCommand({ tabId: sender.tab.id },'Input.dispatchMouseEvent',{type: 'mouseReleased',x: xC,y: yC,button: 'left',clickCount: 1},function () {console.log('鼠标弹起完成_ 处理返回逻辑')if (chrome.runtime.lastError) {console.error(chrome.runtime.lastError.message)flag = falsereturn}setTimeout(() => {if (flag) {sendResponse({ code: 200, message: '点击成功' })} else {sendResponse({ code: 500, message: '点击失败' })}chrome.debugger.detach({ tabId: sender.tab.id }, () => {console.log('取消attach')})}, 5000)})})
}

原理

什么是isTrusted属性?在web api官方网站mozilla.org有如下解释:“Event接口的 isTrusted 属性是一个只读属性,它是一个布尔值(Boolean)。当事件是由用户行为生成的时候,这个属性的值为 true ,而当事件是由脚本创建、修改、通过 EventTarget.dispatchEvent() 派发的时候,这个属性的值为 false 。”

所以如果我们使用Chrome DevTools Protocol协议的Input.dispatchMouseEvent接口,触发的事件isTrusted就为true。

在这里插入图片描述

这篇关于chrome插件模拟isTrusted的事件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1131002

相关文章

禁止平板,iPad长按弹出默认菜单事件

通过监控按下抬起时间差来禁止弹出事件,把以下代码写在要禁止的页面的页面加载事件里面即可     var date;document.addEventListener('touchstart', event => {date = new Date().getTime();});document.addEventListener('touchend', event => {if (new

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

usaco 1.2 Transformations(模拟)

我的做法就是一个一个情况枚举出来 注意计算公式: ( 变换后的矩阵记为C) 顺时针旋转90°:C[i] [j]=A[n-j-1] [i] (旋转180°和270° 可以多转几个九十度来推) 对称:C[i] [n-j-1]=A[i] [j] 代码有点长 。。。 /*ID: who jayLANG: C++TASK: transform*/#include<

hdu4431麻将模拟

给13张牌。问增加哪些牌可以胡牌。 胡牌有以下几种情况: 1、一个对子 + 4组 3个相同的牌或者顺子。 2、7个不同的对子。 3、13幺 贪心的思想: 对于某张牌>=3个,先减去3个相同,再组合顺子。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOExcepti

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

zeroclipboard 粘贴板的应用示例, 兼容 Chrome、IE等多浏览器

zeroclipboard单个复制按钮和多个复制按钮的实现方法 最近网站改版想让复制代码功能在多个浏览器上都可以实现,最近看网上不少说我们的代码复制功能不好用的,我们最近将会增加代码高亮等功能,希望大家多多支持我们 zeroclipboard是一个跨浏览器的库类 它利用 Flash 进行复制,所以只要浏览器装有 Flash 就可以运行,而且比 IE 的

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

Maven(插件配置和生命周期的绑定)

1.这篇文章很好,介绍的maven插件的。 2.maven的source插件为例,可以把源代码打成包。 Goals Overview就可以查看该插件下面所有的目标。 这里我们要使用的是source:jar-no-fork。 3.查看source插件的example,然后配置到riil-collect.xml中。  <build>   <plugins>    <pl

jenkins 插件执行shell命令时,提示“Command not found”处理方法

首先提示找不到“Command not found,可能我们第一反应是查看目标机器是否已支持该命令,不过如果相信能找到这里来的朋友估计遇到的跟我一样,其实目标机器是没有问题的通过一些远程工具执行shell命令是可以执行。奇怪的就是通过jenkinsSSH插件无法执行,经一番折腾各种搜索发现是jenkins没有加载/etc/profile导致。 【解决办法】: 需要在jenkins调用shell脚

Jenkins 插件 地址证书报错问题解决思路

问题提示摘要: SunCertPathBuilderException: unable to find valid certification path to requested target...... 网上很多的解决方式是更新站点的地址,我这里修改了一个日本的地址(清华镜像也好),其实发现是解决不了上述的报错问题的,其实,最终拉去插件的时候,会提示证书的问题,几经周折找到了其中一遍博文