惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Cisco Talos Blog
Cisco Talos Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Martin Fowler
Martin Fowler
Recent Announcements
Recent Announcements
博客园 - 三生石上(FineUI控件)
月光博客
月光博客
博客园 - 聂微东
N
Netflix TechBlog - Medium
B
Blog RSS Feed
T
Tailwind CSS Blog
宝玉的分享
宝玉的分享
有赞技术团队
有赞技术团队
S
SegmentFault 最新的问题
The Register - Security
The Register - Security
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 司徒正美
J
Java Code Geeks
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
人人都是产品经理
人人都是产品经理
Engineering at Meta
Engineering at Meta
T
The Blog of Author Tim Ferriss
C
CXSECURITY Database RSS Feed - CXSecurity.com
AWS News Blog
AWS News Blog
The Hacker News
The Hacker News
Scott Helme
Scott Helme
MongoDB | Blog
MongoDB | Blog
C
CERT Recently Published Vulnerability Notes
L
Lohrmann on Cybersecurity
C
Cybersecurity and Infrastructure Security Agency CISA
P
Proofpoint News Feed
T
The Exploit Database - CXSecurity.com
S
Securelist
MyScale Blog
MyScale Blog
A
Arctic Wolf
V2EX - 技术
V2EX - 技术
The GitHub Blog
The GitHub Blog
Simon Willison's Weblog
Simon Willison's Weblog
H
Hacker News: Front Page
D
DataBreaches.Net
S
Secure Thoughts
腾讯CDC
TaoSecurity Blog
TaoSecurity Blog
Project Zero
Project Zero
H
Help Net Security
P
Privacy International News Feed
Cloudbric
Cloudbric
博客园_首页
Latest news
Latest news
小众软件
小众软件

博客园 - 华安

asp.netCore中给动态请求路径加客户端缓存 netCore中获取客户端真实的IP引起的思考 Unity 相机:正交 (Orthographic) vs 透视 (Perspective) - 华安 unity中的button中的onclick控制面板中四个参数的意思分别是什么 - 华安 微信小程序开发中触发 onshow的几种特殊情况 SQL Server备份心得 MYSQL 备份数据库 微信与支付支付功能开发 微信小程序中页面配置下拉刷新 unity中 相机没有视锥效果线框了,如何打开 JSONPath表达式 C# 中的操作JSON类 JObject cookie中的 HttpOnly 、Secure、SameSite 解释 Spring-boot 中基于 IP 的限流和自动封禁 Filter 登录 用 HMAC-SHA256 实现 TwoFA(二重验证)的坑 利用Spring Boot的 filter 结合ConcurrentHashMap 实现“同一IP每分钟最多允许300个404请求,超出后禁用30分钟访问” pixi-filters中的BackdropBlurFilter使用注意事项 PixiJS中的 SplitBitmapText.chars中的每个 BitmapText的x值分析 legend隐藏不想显示的图例 spring-boot HttpServletResponse response.sendRedirect是会跳转到 http而不是https springboot获取post请求参数 JavaScript获取鼠标点一个元素,获取鼠标点击的元素内的位置 spring-boot中配置Mongodbd的问题小结 Rest Template中添加 PATCH请求。 CSS实现修改CheckBox样式 SpringBoot+Thyemleaf报错:Error resolving template Template might not exist or might not be accessible div display flex 如何出现横向滚动条
Javascript如何判断是触摸屏还是PC端
华安 · 2025-12-04 · via 博客园 - 华安

在Web开发中,判断设备是触摸屏还是PC端(鼠标操作)通常涉及到检测用户输入的类型。JavaScript提供了几种方式来实现这一功能,以下是一些常见的方法:

1. 使用 'ontouchstart' 属性

'ontouchstart' 是一个只在触摸屏设备上存在的属性。你可以通过检查这个属性是否存在来判断设备是否为触摸屏。

if ('ontouchstart' in window) {
    console.log('触摸屏设备');
} else {
    console.log('非触摸屏设备(如PC端)');
}

2. 使用 navigator.maxTouchPoints

navigator.maxTouchPoints 属性返回一个数字,表示设备可以同时跟踪的最大触摸点数。如果这个值大于0,则通常意味着设备是触摸屏。

if (navigator.maxTouchPoints > 0) {
    console.log('触摸屏设备');
} else {
    console.log('非触摸屏设备(如PC端)');
}

3. 使用 'pointer' 事件

pointer 事件是一组事件,旨在统一鼠标、触摸屏和笔输入。通过监听这些事件,你可以检测到用户输入的类型。

window.addEventListener('pointerdown', function(event) {
    if (event.pointerType === 'touch') {
        console.log('触摸屏设备');
    } else {
        console.log('非触摸屏设备(如PC端)');
    }
});

4. 使用第三方库

还有一些第三方库,如 Modernizr,可以帮你更方便地检测设备类型。例如:

if (Modernizr.touchevents) {
    console.log('触摸屏设备');
} else {
    console.log('非触摸屏设备(如PC端)');
}

5. 使用CSS媒体查询(适用于响应式设计)

虽然这不是直接用JavaScript判断,但你可以通过CSS媒体查询来应用不同的样式规则,从而间接影响你的用户体验。例如:

@media (hover: none) and (pointer: coarse) {
    /* 针对触摸屏设备的样式 */
}

总结

根据你的具体需求,你可以选择上述方法中的一种或多种来检测设备类型。通常,第一种和第二种方法是最直接和常用的方式。如果你需要更复杂的输入检测或希望减少对浏览器的依赖,使用'pointer'事件或第三方库可能是更好的选择。对于响应式设计,CSS媒体查询也是一个很好的工具。

注意:有些设备既支持触摸,又支持鼠标事件。实际开发中要注意这点。都要兼容。可以获取事件的  event.type 来判断触发的是什么事件。