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

酷炫JavaScript 技巧

1.检查元素是否在屏幕可见区域内

我们如何获得元素的点击率?

主要取决于用户点击元素的次数和元素在页面上显示的次数。

我们可以很容易地获取到用户的点击次数,但是如何获取一个元素的显示次数呢?

我们可以通过IntersectionObserver轻松实现,大家可以点击codepen体验一下实际效果。

<div class="tips">box is visible</div><div class="box">box</div><script>  const $tips = document.querySelector('.tips')  const callback = (entries) => {    entries.forEach((entry) => {      console.log(entry.intersectionRatio)      if (entry.intersectionRatio > 0) {        $tips.innerHTML = 'box is visible'      } else if (entry.intersectionRatio <= 0) {        $tips.innerHTML = 'box is hidden'      }    });  }  const options = {    // A list of thresholds, sorted in increasing numeric order, where each threshold is a ratio of intersection area to bounding box area of an observed target. Notifications for a target are generated when any of the thresholds are crossed for that target. If no value was passed to the constructor, 0 is used.    // threshold: 1,  }  const observer = new IntersectionObserver(callback, options)  observer.observe(document.querySelector('.box'))</script>

2.深拷贝一个对象

我们经常使用 lodash 来深拷贝一个对象。​​​​​​​

const obj = {  a: {    b: {      name: 'fatfish'    }  }}const obj2 = lodash.cloneDeep(obj)obj2.a.b.name = 'medium'console.log(obj.a.b.name) // fatfishconsole.log(obj2.a.b.name) // medium

但这非常麻烦,因为我们必须下载整个库才能使用 cloneDeep。

幸运的是,在大多数情况下,我们可以使用这两种更简单的方式来深拷贝一个对象。

深度克隆1

​​​​​​​

const deepClone1 = (obj) => {  return JSON.parse(JSON.stringify(obj))}const obj = {  a: {    b: {      name: 'fatfish'    }  }}const obj2 = deepClone1(obj)obj2.a.b.name = 'medium'console.log(obj.a.b.name) // fatfishconsole.log(obj2.a.b.name) // medium

是的,我相信你已经看到了,deepClone1 有一些缺陷,它不能复制函数、正则表达式、未定义等值。​​​​​​​

const deepClone1 = (obj) => {  return JSON.parse(JSON.stringify(obj))}const obj = {  a: {    b: {      name: 'fatfish'    }  },  reg: /fatfish/gi,  name: undefined,  showName: (name) => console.log(name)}const obj2 = deepClone1(obj)console.log(obj2)/*{    "a": {        "b": {            "name": "fatfish"        }    },    "reg": {}}*/

深度克隆2

另一种方法是使用 structuredClone。

这非常方便,我们甚至可以不做任何处理就可以深拷贝一个对象。

它甚至可以复制正则表达式和未定义的。​​​​​​​

const obj = {  a: {    b: {      name: 'fatfish'    }  },  reg: /fatfish/gi,  name: undefined,}const obj2 = structuredClone(obj)obj2.a.b.name = 'medium'console.log(obj.a.b.name) // fatfishconsole.log(obj2.a.b.name) // mediumconsole.log(obj2)/*{    "a": {        "b": {            "name": "medium"        }    },    "reg": /fatfish/gi,    "name": undefined}*/

但是真的没有缺点吗? 它在某些情况下也无法正常工作。

  • 它不能复制功能

  • 它不复制dom元素

  • ETC。

3.获取浏览器名称

在前端监控系统中,需要获取用户出错的浏览器。

这是获取主要浏览器名称的通用函数。​​​​​​​

const getBrowserName = () => {  const userAgent = window.navigator.userAgent  const browsers = {    chrome: /chrome/i,    safari: /safari/i,    firefox: /firefox/i,    ie: /internet explorer/i,    edge: /edge/i,    opera: /opera|opr/i,    yandex: /yandex/i,    uc: /ucbrowser/i,    samsung: /samsungbrowser/i,    maxthon: /maxthon/i,    phantomjs: /phantomjs/i,    crios: /crios/i,    firefoxios: /fxios/i,    edgios: /edgios/i,    safariios: /safari/i,    android: /android/i,    ios: /(iphone|ipad|ipod)/i,    unknown: /unknown/i  }  for (const key in browsers) {    if (browsers[key].test(userAgent)) {      return key    }  }  return 'unknown'}// Execute the above code in chrome browserconsole.log(getBrowserName()) // chrome// Execute the above code in safari browserconsole.log(getBrowserName()) // safari

4.获取随机颜色

我怎样才能得到一个随机的有效颜色?

大家可以点击codepen链接体验实际效果。​​​​​​​

const randomColor = () => {  // Generate three random numbers as the three components of an RGB color value  const r = Math.floor(Math.random() * 256);  const g = Math.floor(Math.random() * 256);  const b = Math.floor(Math.random() * 256);  // Convert RGB color values to hexadecimal format  const hexR = r.toString(16).padStart(2, '0');  const hexG = g.toString(16).padStart(2, '0');  const hexB = b.toString(16).padStart(2, '0');  // Concatenated into a complete color value string  const hexColor = `#${hexR}${hexG}${hexB}`;  return hexColor;}

5.复制内容到剪贴板

为了给我们的网站用户提供更好的交互体验,我们经常需要提供将内容复制到剪贴板的功能。

难以置信的是,我们竟然只需要6行代码就可以实现这个功能。​​​​​​​

const copyToClipboard = (content) => {  const textarea = document.createElement("textarea")  textarea.value = content  document.body.appendChild(textarea)  textarea.select()  document.execCommand("Copy")  textarea.remove()}copyToClipboard('i love medium') // i love medium

6.从搜索中获取查询字符串

使用 URLSearchParams 解析搜索数据变得非常容易。

const getSearchParam = (name) => {  const searchParams = new URLSearchParams(window.location.search)  return searchParams.get(name)}// https://medium.com?name=fatfish&age=1000console.log(getSearchParam('name')) // fatfishconsole.log(getSearchParam('age')) // 1000​​​​​​​
const getSearchParams = () => {  const searchParams = new URLSearchParams(window.location.search)  const params = {};  for (const [ key, value ] of searchParams) {    params[key] = value  }  return params}// https://medium.com?name=fatfish&age=1000getSearchParams() // { name: 'fatfish', age: 1000 }

7.将元素滚动到页面顶部

我们可以使用 scrollIntoView 方法将元素滚动到页面顶部。

甚至它可以提供非常流畅的用户体验。

const scrollToTop = (ele) => {  ele.scrollIntoView({ behavior: "smooth", block: "start" })}document.querySelector('button').addEventListener('click', function () {  scrollToTop(this)}, false)

8.将元素滚动到页面底部

将元素滚动到顶部是如此简单。

那我们要如何将元素滚动到页面底部?我想你已经猜到了,设置block结束即可。​​​​​​​

const scrollToTop = (ele) => {  ele.scrollIntoView({ behavior: "smooth", block: "end" })}document.querySelector('button').addEventListener('click', function () {  scrollToTop(this)}, false)

相关文章:

酷炫JavaScript 技巧

1.检查元素是否在屏幕可见区域内 我们如何获得元素的点击率&#xff1f; 主要取决于用户点击元素的次数和元素在页面上显示的次数。 我们可以很容易地获取到用户的点击次数&#xff0c;但是如何获取一个元素的显示次数呢&#xff1f; 我们可以通过IntersectionObserver轻松…...

【FAQ】H.265视频无插件流媒体播放器EasyPlayer.js播放webrtc断流重连的异常修复

H5无插件流媒体播放器EasyPlayer属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#xff0c;可支持H.264与H.265编码格式&#xff0c;性能稳定、播放流畅&#xff0c;能支持WebSocket-FLV、HTTP-FLV&#xff0c;HLS&#xff08;m3u8&#…...

java八股文面试[JVM]——垃圾回收器

jvm结构总结 常见的垃圾回收器有哪些&#xff1f; CMS&#xff08;Concurrent Mark Sweep&#xff09; 整堆收集器&#xff1a; G1 由于整个过程中耗时最长的并发标记和并发清除过程中&#xff0c;收集器线程都可以与用户线程一起工作&#xff0c;所以总体上来说&#xff0c;…...

redis持久化机制 事务详解

目录 前言&#xff1a; 持久化机制 RDB&#xff08;Redis DataBase&#xff09; 手动触发 save bgsave 自动触发 RDB特点 AOF&#xff08;append only file&#xff09; 缓冲区刷新策略 重写机制 aof重写流程 混合持久化 事务 事务操作命令 WATCH WATCH实现原…...

java八股文面试[多线程]——有几种创建线程的方式

this逃逸问题&#xff1a;构造器中启动线程。 面试题&#xff1a; 用Thread和Runable创建线程的差别 一、Runnable和Thread的区别 继承性&#xff1a;Thread是一个类&#xff0c;因此如果继承Thread类&#xff0c;子类就不能再继承其他的类了&#xff0c;而实现Runnable接口…...

Desnet模型详解

模型介绍 DenseNet的主要思想是密集连接&#xff0c;它在卷积神经网络&#xff08;CNN&#xff09;中引入了密集块&#xff08;Dense Block&#xff09;&#xff0c;在这些块中&#xff0c;每个层都与前面所有层直接连接。这种设计可以让信息更快速地传播&#xff0c;有助于解…...

clickhouse-压测

一、数据集准备 数据集可以使用官网数据集&#xff0c;也可以用ssb-dbgen来准备 1.准备数据 这里最后生成表的数据行数为60亿行&#xff0c;数据量为300G左右 git clone https://github.com/vadimtk/ssb-dbgen.git cd ssb-dbgen/ make1.1 生成数据 # -s 指生成多少G的数据…...

AI夏令营第三期用户新增挑战赛学习笔记

1、数据可视化 1.数据探索和理解&#xff1a;数据可视化可以帮助我们更好地理解数据集的特征、分布和关系。通过可视化数据&#xff0c;我们可以发现数据中的模式、异常值、缺失值等信息&#xff0c;从而更好地了解数据的特点和结构。2.特征工程&#xff1a;数据可视化可以帮助…...

pdf转ppt软件哪个好用?推荐一个好用的pdf转ppt软件

在日常工作和学习中&#xff0c;我们经常会遇到需要将PDF文件转换为PPT格式的情况。PDF格式的文件通常用于展示和保留文档的原始格式&#xff0c;而PPT格式则更适合用于演示和展示。为了满足这一需求&#xff0c;许多软件提供了PDF转PPT的功能&#xff0c;使我们能够方便地将PD…...

Linux 内核函数kallsyms_lookup_name

文章目录 一、API使用二、源码解析2.1 kallsyms_lookup_name2.2 kallsyms_expand_symbol2.3 kallsyms_sym_address2.3.1 x86_642.3.2 arm642.3.3 CONFIG_KALLSYMS_ABSOLUTE_PERCPU 参考资料 一、API使用 kallsyms_lookup_name 是一个内核函数&#xff0c;用于通过符号名称查找…...

强化学习在游戏AI中的应用与挑战

文章目录 1. 强化学习简介2. 强化学习在游戏AI中的应用2.1 游戏智能体训练2.2 游戏AI决策2.3 游戏测试和优化 3. 强化学习在游戏AI中的挑战3.1 探索与利用的平衡3.2 多样性的应对 4. 解决方法与展望4.1 深度强化学习4.2 奖励设计和函数逼近 5. 总结 &#x1f389;欢迎来到AIGC人…...

6 Python的异常处理

概述 在上一节&#xff0c;我们介绍了Python的面向对象编程&#xff0c;包括&#xff1a;类的定义、类的使用、类变量、实例变量、实例方法、类方法、静态方法、类的运算符重载、继承等内容。在这一节中&#xff0c;我们将介绍Python的异常处理。异常是指程序在运行过程中出现的…...

【跨语言通讯】

传统的跨语言通讯方案&#xff1a; 基于SOAP消息格式的WebService 基于JSON消息格式的RESTful 服务 主要弊端&#xff1a; XML体积太大&#xff0c;解析性能极差 JSON体积相对较小&#xff0c;解析相对较快&#xff0c;但表达能力较弱 如今比较流行的跨语言通讯方案&…...

Android 基础知识

一、Activity 1、onSaveInstanceState(),onRestoreInstanceState的调用时机 onSaveInstanceState 调用时机 从最近应用中选择运行其他程序时 但用户按下Home键时 屏幕方向切换时 按下电源案件时 从当前activity启动一个新的activity时 onRestorInstanceState调用时机 只…...

Linux常用命令_帮助命令、用户管理命令、压缩解压命令

文章目录 1. 帮助命令1.1 帮助命令:man1.2 帮助命令:help1.3 其他帮助命令 2. 用户管理命令2.1 用户管理命令: useradd2.2 用户管理命令: passwd2.3 用户管理命令: who2.4 用户管理命令: w 3. 压缩解压命令3.1 压缩解压命令: gzip3.2 压缩解压命令: gunzip3.3 压缩解压命令: ta…...

解决 KylinOS “Could not get lock /var/lib/dpkg/lock”错误

最近,我遇到了 “Could not get lock /var/lib/dpkg/lock”的错误,我既不能安装任何软件包,也不能更新系统。此错误也与“Could not get lock /var/lib/apt/lists/lock”错误密切相关。以下是 Ubuntu 20.04 上的一些样本输出。 Reading package lists… Done E: Could not…...

PHP pdf 自动填写表单

一、下载github上的项目&#xff0c;地址 二、下载pdftk 地址 // 转化PDF模板 pdftk modele.pdf output modele2.pdf# 填充pdf文件中的表单 require(fpdm.php); $fields array(name > My name,address > My address,city > My city,phone > My phone nu…...

Win2016Server绑定多网卡实现负载均衡

一、服务器端&#xff1a; 1、输入ncpa.cpl打开网络连接&#xff0c;对要绑定的网卡勾掉IPV4&#xff0c;IPV4地址选择自动 2、输入servermanager.exe&#xff0c;打开服务器管理器 3、在 [本地服务器] 中&#xff0c;点后边的 “已禁用” &#xff0c;在 [适配器和接口] 小窗口…...

微软宣布在 Excel 中使用 Python:结合了 Python 的强大功能和 Excel 的灵活性。

文章目录 Excel 中的 Python 有何独特之处&#xff1f;1. Excel 中的 Python 是为分析师构建的。高级可视化机器学习、预测分析和预测数据清理 2. Excel 中的 Python 通过 Anaconda 展示了最好的 Python 分析功能。3. Excel 中的 Python 在 Microsoft 云上安全运行&#xff0c;…...

学习心得03:OpenCV

数学真是不可思议&#xff0c;不管什么东西&#xff0c;都能用数学来处理。OpenCV以前也接触过&#xff0c;这次是系统学习一下。 颜色模型 RGB&#xff0c;YUV&#xff0c;HSV&#xff0c;Lab&#xff0c;GRAY 颜色转换cvtColor()/convertTo()&#xff0c;通道分离split()&…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

从物理机到云原生:全面解析计算虚拟化技术的演进与应用

前言&#xff1a;我的虚拟化技术探索之旅 我最早接触"虚拟机"的概念是从Java开始的——JVM&#xff08;Java Virtual Machine&#xff09;让"一次编写&#xff0c;到处运行"成为可能。这个软件层面的虚拟化让我着迷&#xff0c;但直到后来接触VMware和Doc…...

字符串哈希+KMP

P10468 兔子与兔子 #include<bits/stdc.h> using namespace std; typedef unsigned long long ull; const int N 1000010; ull a[N], pw[N]; int n; ull gethash(int l, int r){return a[r] - a[l - 1] * pw[r - l 1]; } signed main(){ios::sync_with_stdio(false), …...

Tauri2学习笔记

教程地址&#xff1a;https://www.bilibili.com/video/BV1Ca411N7mF?spm_id_from333.788.player.switch&vd_source707ec8983cc32e6e065d5496a7f79ee6 官方指引&#xff1a;https://tauri.app/zh-cn/start/ 目前Tauri2的教程视频不多&#xff0c;我按照Tauri1的教程来学习&…...

qt+vs Generated File下的moc_和ui_文件丢失导致 error LNK2001

qt 5.9.7 vs2013 qt add-in 2.3.2 起因是添加一个新的控件类&#xff0c;直接把源文件拖进VS的项目里&#xff0c;然后VS卡住十秒&#xff0c;然后编译就报一堆 error LNK2001 一看项目的Generated Files下的moc_和ui_文件丢失了一部分&#xff0c;导致编译的时候找不到了。因…...