当前位置: 首页 > news >正文

21.Chromium指纹浏览器开发教程之触摸屏点指纹定制

浏览器触摸屏概述

浏览器触摸屏信息主要是指浏览器可以检测并响应用户在触摸屏设备上进行的触摸操作。随着移动设备和触摸屏设备的普及,触摸事件(Touch Events)变得越来越重要。浏览器通过触摸事件 API 提供对触摸屏操作的支持,使开发者能够创建更加互动和响应的用户体验。

触摸事件 API 提供了一系列事件,用于检测和处理触摸操作。这些事件包括:

  1. touchstart:当一个或多个手指触摸屏幕时触发。
  2. touchmove:当一个或多个手指在屏幕上移动时触发。
  3. touchend:当一个或多个手指从屏幕上移开时触发。
  4. touchcancel:当触摸被中断时触发,如突然接听电话或浏览器上下文改变。

每个触摸事件对象包含有关当前触摸状态的详细信息。关键属性包括:

  1. touches:一个 TouchList 对象,包含当前在屏幕上的所有手指的触摸信息。
  2. targetTouches:一个 TouchList 对象,包含当前与事件目标相关的所有手指的触摸信息。
  3. changedTouches:一个 TouchList 对象,包含自上一个触摸事件以来发生了变化的所有手指的触摸信息。

每个 Touch 对象包含以下属性:

  1. identifier:唯一标识触摸点的 ID。
  2. target:触摸点的事件目标元素。
  3. clientX 和 clientY:触摸点相对于浏览器窗口的 X 和 Y 坐标。
  4. screenX 和 screenY:触摸点相对于屏幕的 X 和 Y 坐标。
  5. pageX 和 pageY:触摸点相对于文档的 X 和 Y 坐标。

以下是一个HTML示例,展示如何使用 JavaScript 处理触摸事件:

<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Touch Event Example</title><style>#touchArea {width: 300px;height: 300px;background-color: lightgray;border: 2px solid black;text-align: center;line-height: 300px;}</style></head><body><div id="touchArea">Touch here</div><script>const touchArea = document.getElementById('touchArea');touchArea.addEventListener('touchstart', function(event) {handleTouchEvent(event, 'touchstart');});touchArea.addEventListener('touchmove', function(event) {handleTouchEvent(event, 'touchmove');});touchArea.addEventListener('touchend', function(event) {handleTouchEvent(event, 'touchend');});touchArea.addEventListener('touchcancel', function(event) {handleTouchEvent(event, 'touchcancel');});function handleTouchEvent(event, eventType) {event.preventDefault();const touches = event.touches;const touchList = [];for (let i = 0; i < touches.length; i++) {touchList.push({identifier: touches[i].identifier,clientX: touches[i].clientX,clientY: touches[i].clientY,});}console.log(`Event: ${eventType}`, touchList);}</script></body></html>

将其保存为HTML文件,用浏览器打开之后,此时还没开启触摸屏,因此鼠标操作是没有效果的。打开开发者工具,切换为手机访问之后,即可触发各类事件。如图4-15所示,鼠标单击灰色区域,即可触发触摸屏事件:

在上述监听事件当中,通过 getElementById 获取触摸区域元素。为 touchArea 添加了 touchstart、touchmove、touchend 和 touchcancel 事件监听器,分别处理不同类型的触摸事件。

在 handleTouchEvent 中,首先调用 event.preventDefault 防止默认行为(如滚动)。然后从事件对象中提取 touches 列表,并遍历其中的每个触摸点,提取 identifier、clientX 和 clientY 属性。最后将触摸点信息存储在 touchList 数组中,并在控制台中输出触摸事件类型和触摸点信息。

触摸屏在浏览器中的用途非常多,开发者可以利用触摸事件来实现多点触控手势,如缩放、旋转和滑动。而且触摸事件可以用于绘图应用,允许用户在触摸屏上绘制和编辑图像。

如果想要将浏览器模拟为移动端的指纹信息,那么就需要开启其中的触摸屏。因为在移动端,浏览器作为一个APP,是需要用户通过触摸屏操作的,是没有外接鼠标键盘的。如果要模拟移动端指纹,却不开启触摸屏,那么很容易就被检测为在伪造指纹信息。

浏览器触摸屏支持检测

浏览器是否支持触摸屏可以通过多种函数进行检测。以下是几种常见的检测:

  1. 使用 navigator.maxTouchPoints。

navigator.maxTouchPoints 属性返回设备上可用的触控点数量。如果设备支持触摸屏,则返回值大于 0。代码如下:

function isTouchDevice() {return 'maxTouchPoints' in navigator && navigator.maxTouchPoints > 0;}console.log("Is touch device: " + isTouchDevice());
  1. 使用 window.matchMedia。

通过查询媒体特性 hover 和 pointer,可以判断设备是否支持触摸。代码如下:

function isTouchDevice() {return window.matchMedia("(pointer: coarse)").matches;}console.log("Is touch device: " + isTouchDevice());
  1. 使用 ontouchstart 事件。

通过检测 ontouchstart 事件是否存在,可以判断设备是否支持触摸。代码如下:

function isTouchDevice() {return 'ontouchstart' in window || navigator.maxTouchPoints > 0;}console.log("Is touch device: " + isTouchDevice());

如果浏览器没有通过开发者工具切换为移动端浏览器,那么上述探测都是否。相反,如果切换为移动端访问,那么PC端浏览器也就可以模拟移动端拥有触摸屏支持了。

浏览器触摸屏指纹定制

本书将定制浏览器触摸屏信息navigator.maxTouchPoints。因为这是一个涉及动作的操作,所以在Chromium源码中相关代码在src\third_party\blink\renderer\core\events文件夹中,在这个文件夹中,navigator_events.cc文件中单独定义了这个API,它的的具体代码如下:

int32_t NavigatorEvents::maxTouchPoints(Navigator& navigator) {LocalDOMWindow* window = navigator.DomWindow();return window ?window->GetFrame()->GetSettings()->GetMaxTouchPoints() : 0;}

这段代码用于获取当前浏览器窗口支持的最大触摸点数。函数的返回类型是 int32_t,表示返回一个 32 位的整数。它接受一个 Navigator 对象的引用作为参数。

在函数内部,首先调用 navigator.DomWindow 获取一个指向 LocalDOMWindow 对象的指针,并赋值给window变量,这个window变量表示当前的浏览器窗口。然后通过条件运算符 ? : 判断这个指针是否为空。如果 window 变量非空,就通过一系列函数调用来获取最大触摸点数:首先通过GetFrame函数获取当前窗口的,接着通过GetSettings函数获取与当前窗口相关联的设置,最后通过GetMaxTouchPoints函数获取最大触摸点数。如果 wi-ndow 为空,则直接返回 0。

这段代码的功能是检测当前浏览器窗口的最大触摸点数,如果窗口存在,通过窗口的框架和设置获取这个值;如果窗口不存在,则返回 0。这样的函数通常用于触控设备的功能检测,根据设备支持的触摸点数调整应用的触控交互方式。例如,在支持多点触控的设备上启用多点触控手势,而在不支持触摸的设备上禁用这些功能。这个函数确保了程序能够根据设备的硬件能力进行适当的调整。

在对浏览器触摸屏信息进行定制的时候,只需要将maxTouchPoints函数的返回值定制为1,即说明浏览器支持触摸屏,具体修改代码如下:

bool mobile = *(json_reader->GetDict().FindBool("mobile"));if (mobile) {return 1;}return 0;

相关文章:

  • Web前端:百度首页克隆 - 前端开发练习
  • 深入浅出 C++ 核心基础:从语法特性到入门体系构建
  • langchain-nextjs-template 模板安装与配置
  • 【深度学习—李宏毅教程笔记】各式各样的 Attention
  • jupyter切换存储路径
  • C++入门基础:引用,auto自动关键字,内联函数,范围for循环
  • 【C++】 —— 笔试刷题day_22
  • Postgresql几个常用的json操作
  • 安卓手机怎样配置数据加速
  • 10 C 语言常量详解:#define 与 const 定义常量及其区别与应用
  • JavaScript 版本号比较
  • 软件设计师/系统架构师---计算机网络
  • C++:在条件判断时何时为if,何时为else (易混淆※※※)
  • Leetcode 3524. Find X Value of Array I
  • NFS服务共享和安装命令的补充
  • 辅助函数构造题目(缓慢更新,遇到更道)
  • next.js 如何实现动态路由?
  • 云点数据读写
  • 【小沐杂货铺】基于Three.JS绘制卫星轨迹Satellite(GIS 、WebGL、vue、react,提供全部源代码)
  • Java编程基础(第四篇:字符串初次介绍)
  • 文旅部:今年一季度国内出游人次17.94亿,同比增长26.4%
  • 汪东进卸任中海油董事长,深耕油气领域40余年、已临近退休
  • 重庆一幼儿园回应招聘硕士幼教:统一标准,江北区学前教育岗的硬性要求
  • 《哪吒2》票房已达157亿,光线传媒一季度净利增至20亿元
  • 马上评|治理“龟速车”,也是一次驾驶文明的升级
  • 一年一CT,十年进ICU?关于CT检查致癌的真相