(十七)原生js案例之h5中的几个特性记录

h5 中的新特性

  • 语义化标签
  • 增强型表单
  • 元素选择器
    • querySelector
    • querySelectorAll
    • getElementsByClassName
  • class 的操作
    • classList.add
    • classList.remove
    • classList.toggle
    • classList.contains
    • classList.replace
  • JSON
    • JSON.stringify
    • JSON.parse
    • eval 可以解析任何字符串变成 js
    • pares 只能解析 JSON 形式的字符串变成 js 安全性高
var str = 'alert("hello")';
eval(str); // 执行了const str2 = 'function() show{alert("hello2222")}';
JSON.parse(str2);
show(); //报错了
// Uncaught SyntaxError: Unexpected token 'u', "function() "... is not valid JSON
//     at JSON.parse (<anonymous>)
  • json。parse 必须是严格的 json 格式, 否则会报错
const str2 = '{"name":"zs","age":18}';
const json = JSON.parse(str2);
console.log(json.name);

深拷贝

const obj = { name: "zs", age: 18 };
const obj2 = JSON.parse(JSON.stringify(obj));
obj2.name = "ls";
console.log(obj); // {name: "zs", age: 18}
console.log(obj2); // {name: "ls", age: 18}

dataset 自定义数据

  • 比较麻烦的方式
<div id="box" name="zhangsan" age="30">这一段描述文本</div>
window.onload = function () {const oDiv = document.getElementById("box");const name = oDiv.getAttribute("name");const age = oDiv.getAttribute("age");console.log(name, age);
};
  • h5 提供了 dataset
<div id="box" data-name="zhangsan" data-age="30">这一段描述文本</div>
window.onload = function () {const oDiv = document.getElementById("box");const name = oDiv.dataset.name;const age = oDiv.dataset.age;console.log(name, age);
};

defer 和 async

  • defer 立即加载 js 文件,在页面解析完之后才执行
  • async 异步加载 js 文件,执行完之后页面解析完再执行
  • defer 和 async 都是异步加载 js 文件,但是执行顺序不同
  • defer 加载 js 文件是按照顺序执行的,async 是无顺序的
  • defer 加载 js 文件是阻塞解析的,async 是非阻塞解析

h5 中的历史管理

  • history.pushState(state, title, url)

  • history.replaceState(state, title, url)

  • history.back()

  • history.forward()

  • history.go()

  • state 状态对象,可以传递任意数据

  • title 标题,没有实际意义

  • url 页面地址,必须和当前页面同源

  • 页面跳转不会刷新页面,只是改变 url

  • 页面刷新会触发 popstate 事件,会读取 event.state

  • 注意网址是虚假的,需要后端配合,否则刷新会找不到页面

  • hash 改变会触发 hashchange 事件

window.onhashchange = function () {};

h5 中的拖拽

  • 拖拽元素的事件

    • dragstart 开始拖拽
    • drag 拖拽中 与 mousemove 的移动事件类似,但是 drag 会一直触发,
    • dragend 拖拽结束
  • 目标元素的事件

    • dragenter 拖拽进入目标元素
    • dragover 拖拽在目标元素上
    • dragleave 拖拽离开目标元素
    • drop 拖拽在目标元素上释放
  • 阻止默认事件

    • event.preventDefault()
    • event.stopPropagation()
  • 事件触发顺序
    不触发 drop

    • dragstart ->drag -> dragenter -> dragover -> dragleave -> dragend
      触发 drop
    • dragstart ->drag -> dragenter -> dragover -> drop -> dragleave -> dragend
  • 拖拽图片

    • 拖拽图片时,需要阻止默认事件

    • FileReader 读取文件

    • dataTransfer.setData 设置数据

    • dataTransfer.getData 获取数据

    • dataTransfer.effectAllowed 设置允许拖拽类型

    • dataTransfer.dropEffect 设置拖拽类型

    • readAsDataURL 读取文件为 base64,将文件读取为 DaataURL

    • onload 读取完成,this.result 为读取结果,如果是图片
      读取的 base64 字符串

window.onload = function () {const oBox = document.getElementById("box");const oList = document.getElementById("list");oBox.ondragenter = function (e) {e = e || window.event;e.preventDefault();this.innerHTML = "可以释放啦~";};oBox.ondragover = function (e) {e = e || window.event;e.preventDefault();};oBox.ondragleave = function (e) {this.innerHTML = "将文件拖拽到此区域~";};oBox.ondrop = function (e) {e = e || window.event;e.preventDefault(); // 阻止默认行为,图片会打开this.innerHTML = "将文件拖拽到此区域~";const data = e.dataTransfer.files;console.log("🚀 ~ data:", data);for (let i = 0; i < data.length; i++) {const type = data[i].type;if (type.indexOf("image") == -1) {alert("文件格式错误");return false;}// 读取文件内容const reader = new FileReader();reader.readAsDataURL(data[i]);reader.onload = function () {const oLi = document.createElement("li");const img = document.createElement("img");img.src = reader.result;oLi.appendChild(img);oList.appendChild(oLi);};reader.onprogress = function (e) {console.log("🚀 ~ reader:", e);};}};
};

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

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

相关文章

配置Linux客户端免密登录服务端Linux主机的root用户

1.安装shh服务 首先安装shh服务&#xff0c;redhat端通过下面代码进行安装服务 sudo yum install sshd sudo yum install openssh-server 2.生成密钥&#xff08;公钥&#xff0b;私钥&#xff09; 执行ssh-keygen命令&#xff0c;会生成id_rsa&#xff08;私钥&#xff0…

【ffmpeg命令入门】再论ffmpeg通用选项

文章目录 前言强制使用特定的文件格式1. 将 MP4 文件转换为 AVI 格式2. 录制音频3. 从摄像头录制视频 指定输入文件覆盖同名文件限制输入/输出文件的时间指定结束点时间主要区别举例说明1. 使用 -t 截取前 10 秒的视频2. 使用 -to 截取到第 10 秒的视频 实际应用中的区别1. 从第…

并发编程--synchronized介绍

1.初步认识synchronized 先来看下利用 synchronized 实现 同步的基 础 &#xff1a; Java 中的每一个 对 象都可以作 为锁 。具体表 现 为 以下 3 种形式。 &#xff1a; 对于普通同步方法&#xff0c; 锁 是当前 实 例 对 象。 对于静 态 同步方法&#xff0c; 锁 是当前 类…

python-首字母移位(PythonTip)

[题目描述] 编写一个程序&#xff0c;将句子中每个单词的首字母移位到下一个单词。定义函数shift_first_letter()&#xff0c;参数为sentence&#xff08;字符串&#xff09;。在函数内&#xff0c;将句子中每个单词的首字母移位到下一个单词。最后一个单词的首字母移位到句子的…

python进阶---闭包与装饰器

一、闭包 在Python中&#xff0c;闭包是指一个函数内部定义的函数&#xff0c;这个内部函数可以访问并修改其外部函数的局部变量&#xff0c;即使外部函数已经执行完毕。闭包可以通过多层函数嵌套来实现。 闭包的三要素&#xff1a; 1、外部函数嵌套内部函数 2、外部函数返回内…

SQL 注入漏洞详解 - Union 注入

1)漏洞简介 SQL 注入简介 SQL 注入 即是指 Web 应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在 Web 应用程序中事先定义好的查询语句的结尾上添加额外的 SQL 语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,…

罗技 F710 无线游戏手柄用户指南

罗技 F710 无线游戏手柄用户指南 Gamepad F710功能系统XInput 游戏DirectInput的 游戏1.左键/触发器按钮为数字&#xff1b; 触发器是模拟的按钮和触发器是数字的和可编程的*2.右键/触发器按钮为数字&#xff1b; 触发器是模拟的按钮和触发器是数字的和可编程的*3.方向键8 向方…

记录|C#+winform创建扁平化风格界面

本项目的C#内容是自己跟做的&#xff0c;自己做的内容已经打包&#xff0c;可以通过自己跟做写的Dashboard界面&#xff0c;C#下的winform模式下载获得&#xff0c;但是需要花费3个积分 目录 前言一、左边设置和步骤界面步骤Step1.Step2.Step3.Step4Step5 二、右边属性和步骤属…

【BUG】已解决:ModuleNotFoundError: No module named ‘requests‘

ModuleNotFoundError: No module named ‘requests‘ 目录 ModuleNotFoundError: No module named ‘requests‘ 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&a…

Django已经登录但是还是提示登录

问题描述 在使用 Django 开发网站时&#xff0c;你可能会遇到一个问题&#xff1a;当用户在访问网站时&#xff0c;如果 URL 从 https://200sm.com/chat/ 切换到 https://www.200sm.com/chat/&#xff0c;用户可能会被要求重新登录或遇到其他验证问题。这是因为 Django 默认情…

Python怎样读取URL生成PDF

1. 安装依赖的exe 需要在这个网址&#xff0c;安装一个exe包&#xff0c;地址&#xff1a;https://wkhtmltopdf.org/ 进入网址后&#xff0c;点这个位置&#xff1a; 选择一个你的操作系统的下载链接&#xff1a; 安装后的exe文件&#xff1a; C:\Program Files\wkhtmltopdf…

vue3.2使用@wangeditor/editor-for-vue实现富文本编辑器,后端使用thinkphp上传图片

Vue 组件代码 npm i wangeditor/editor-for-vue<template><div style"border: 1px solid #ccc;height:600px;"><Toolbar style"border-bottom: 1px solid #ccc" :editor"editorRef" :defaultConfig"toolbarConfig" :m…

记录解决springboot项目上传图片到本地,在html里不能回显的问题

项目场景&#xff1a; 项目场景&#xff1a;在我的博客系统里&#xff1a;有个相册模块&#xff1a;需要把图片上传到项目里&#xff0c;在html页面上显示 解决方案 1.建一个文件夹 例如在windows系统下。可以在项目根目录下建个photos文件夹&#xff0c;把上传的图片文件…

n9.Nginx 自定义访问日志

Nginx 自定义访问日志 访问日志是记录客户端即用户的具体请求内容信息&#xff0c;而在全局配置模块中的error_log是记录nginx服务 器运行时的日志保存路径和记录日志的level&#xff0c;因此两者是不同的&#xff0c;而且Nginx的错误日志一般只有一 个&#xff0c;但是访问日…

【Pytorch实用教程】pytorch中random_split用法的详细介绍

在 PyTorch 中,torch.utils.data.random_split 是一个非常有用的函数,用于将数据集随机分割成多个子集。这在机器学习和深度学习中非常常见,特别是当你需要将数据集分割成训练集和测试集或验证集时。这里是 random_split 的详细用法介绍: 功能 random_split 用于随机地将…

java面试-场景题

一、集合 1. java中如何给一个超大的一个亿左右的list数据去重&#xff1f; 我当时的回答是使用HashSet或Stream流的distinct语法。但是面试官好像更注重内存的消耗问题。 使用HashSet&#xff1a; HashSet 是一个不允许有重复元素的集合。你可以将List中的元素添加到HashSe…

华为OD2024D卷机试题汇总,含D量50%+,按算法分类刷题,事半功倍

目录 专栏导读华为OD机试算法题太多了&#xff0c;知识点繁杂&#xff0c;如何刷题更有效率呢&#xff1f; 一、逻辑分析二、数据结构1、线性表① 数组② 双指针 2、map与list3、队列4、链表5、栈6、滑动窗口7、二叉树8、并查集9、矩阵 三、算法1、基础算法① 贪心思维② 二分查…

虚拟机固定配置IP

在Hyper-V中&#xff0c;vEthernet (Default Switch) 是Hyper-V自带的默认虚拟交换机&#xff0c;它允许虚拟机直接连接到宿主机网络或外部网络。这个虚拟交换机可以通过Hyper-V管理器或PowerShell等工具进行管理和配置。以下是具体的操作步骤&#xff1a; 一、通过Hyper-V管理…

SAP 贷项销售订单简介

SAP 贷项销售订单简介 1. 什么是销售贷方销售订单?2. 创建销售贷方销售订单的场景3. 销售贷方销售订单的创建流程直接创建发票---VF01将会计凭证过账到会计核算查看贷项销售订单凭证流查看客户明细---FBL5N贷项后台配置SAP销售贷方销售订单(Sales Credit Memo Request)是销售…

Windows定时任务实现关闭和开启声音

目录 1. 下载并放置 nircmd.exe1.1 下载 NirCmd&#xff1a;1.2 放置 nircmd.exe&#xff1a; 2. 定时关闭声音2.1 打开任务计划程序&#xff1a;2.2 创建基本任务&#xff1a;2.3 设置任务名称和描述&#xff1a;2.4 触发器&#xff1a;2.5 操作&#xff1a;2.6 设置程序或脚本…