第5章 最佳实践

news2024/9/24 13:19:44

过去的错误

不要怪罪JavaScript

  1. 游览器遇到不合法的html会想尽办法将他展现出来
  2. 游览器遇到不合法的js将拒绝执行它们并报错
  3. 写js要保障自己代码的健壮性

质疑一切

  1. 写js功能前一定要考虑这个功能的合理性,避免造成不可预见的后果
  2. 写js功能前一定要考虑用户的游览器是否支持js已经用户是否禁用游览器,增强代码健壮性

平稳退化

可以让访问者在他们的浏览器不支持JavaScript的情况下仍能顺利地浏览你的网站。这就是所谓的平稳退化

“javascript:”伪协议

“真”协议用来在因特网上的计算机之间传输数据包,如HTTP协议(http://)、FTP协议(ftp://)等,伪协议则是一种非标准化的协议。“javascript:”伪协议让我们通过一个链接来调用JavaScript函数。在支持它的游览器中链接能够正常打开不支持它的游览器则会什么有不做。
总之,在HTML文档里通过“javascript:”伪协议调用JavaScript代码的做法非常不好。

在这里插入图片描述

// 打开新的连接,一个参数为链接,第二个参数为方式(_self,_blank),第三个参数为视口配置
window.open("https://www.baidu.com/","_blank","width=100,height=300")

内嵌的事件处理函数

点击事件

<button onclick="open_win()">点我</button>

例子

此段代码当用户禁用掉js后页面就没办法正常跳转

// href="#"表示创建一个空链接,return false表示阻止触发href
<a href="#" onclick="open_win();return false">跳转</a>

<script>
    function open_win(){
        window.open("https://www.baidu.com","_blank","width=100,height=300")
    }open
</script>

设置href。由于禁掉了js所以onclick不会触发

<a href="https://www.baidu.com" onclick="open_win();return false">跳转</a>

向CSS学习

结构与样式的分离

  1. 我们经常会遇到一些几乎每个元素都带有style属性的Web文档,而这是CSS技术最缺乏效率的用法之一。真正能从CSS技术获益的方法,是把样式全部转移到外部文件中去。
  2. 按这种原则使用JavaScript时,我们可以从CSS身上借鉴到很多东西。

渐进增强

  1. 所谓“渐进增强”就是用一些额外的信息层去包裹原始数据。按照“渐进增强”原则创建出来的网页几乎(如果不是“全部”的话)都符合“平稳退化”原则。
  2. 类似于CSS, JavaScript和DOM提供的所有功能也应该构成一个额外的指令层。CSS代码负责提供关于“表示”的信息,JavaScript代码负责提供关于“行为”的信息。行为层的应用方式与表示层一样。
  3. 把CSS代码从HTML文档里分离出来可以让CSS工作得最好。这个适用于CSS表示层的结论同样适用于JavaScript行为层。

分离JavaScript

类似于使用style属性,在HTML文档里使用诸如onclick之类的属性也是一种既没有效率又容易引发问题的做法。

<a href="https://www.baidu.com" onclick="open_win();return false">跳转</a>

解决方式1,放在head标签中不过js文件要等待游览器html元素加载完成后执行

<head>
	...
	<script  src="./index.js"></script>
<head>
// index.js
// 需要等页面加载完成后执行操作
window.onload = function() {
	// 获取dom
    const target=document.getElementById('target_a');
    // 获取dom中的href
    const href=target.getAttribute("href");
	
	// 绑定事件回调
    target.onclick=open_win

    function open_win(){
        window.open(href,"_self");
    }
}

解决方式2,放在html元素后一般放在body最后位置。让游览器优先加载html元素

<a href="https://www.baidu.com" id="target_a">跳转</a>

<script  src="./index.js"></script>
const target = document.getElementById('target_a');
const href = target.getAttribute("href");

target.onclick = open_win

function open_win() {
    window.open(href, "_self");
}

向后兼容

对象检测

为了保障代码的健壮性我们可以在调用某个dom方法前判断游览器是否支持

function open_win() {
	if(!document.getElementById)return;
	...
}

性能考虑

尽量少访问DOM和尽量减少标记

不管什么时候,只要是查询DOM中的某些元素,浏览器都会搜索整个DOM树,从中查找可能匹配的元素

function fn(){
   if(document.getElementsByClassName("a").length>0){
       let alls=document.getElementsByClassName("a");

       alls=Array.from(alls);
       alls.forEach((item)=>{
           console.log(item);
       })
   }
}

上述代码中对dom树搜索了两次这是及其不合理的,可以搜索的结果存储在一个变量中来优化性能

function fn(){
	 const alls=document.getElementsByClassName("a")
	 if(alls.length>0){
	     alls=Array.from(alls);
	     alls.forEach((item)=>{
	         console.log(item);
	     })
	 }
}

在比较复杂的项目中可以吧dom搜索的结果存储在全局变量中,方便维护减少性能消耗

合并和放置脚本

下述做法是不推荐的因为会增加游览器的请求次数,最好的做法是把他们在一个js文件中加载然后引入html中
在这里插入图片描述
在下载js期间,浏览器不会下载其他任何文件,即使是来自不同域名的文件也不会下载,所有其他资源都要等js加载完毕后才能下载。所以js放在body最后可以加快游览器的加载速度

压缩脚本

所谓压缩脚本,指的是把脚本文件中不必要的字节,如空格和注释,统统删除,从而达到“压缩”文件的目的。下面是几个压缩代码的工具

  • http://www.crockford.com/javascript/jsmin.html
  • http://developer.yahoo.com/yui/compressor
  • http://closure-compiler.appspot.com/home

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

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

相关文章

2023牛客暑期多校训练营5-B Circle of Mistery

2023牛客暑期多校训练营5-B Circle of Mistery https://ac.nowcoder.com/acm/contest/57359/B 文章目录 2023牛客暑期多校训练营5-B Circle of Mistery题意解题思路代码 题意 解题思路 感性地想一下&#xff0c;若已有一个环&#xff0c;则再出现其他环就显得多余&#xff0…

spring中怎么通过静态工厂和动态工厂获取对象以及怎么通过 FactoryBean 获取对象

&#x1f600;前言 本章是spring基于XML 配置bean系类中第4篇讲解spring中怎么通过静态工厂和动态工厂获取对象以及怎么通过 FactoryBean 获取对象 &#x1f3e0;个人主页&#xff1a;尘觉主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是尘觉&#xff0c;希望…

【IMX6ULL驱动开发学习】21.Linux驱动之PWM子系统(以SG90舵机为例)

1.设备树部分 首先在 imx6ull.dtsi 文件中已经帮我们定义好了一些pwm的设备树节点&#xff0c;这里以pwm2为例 pwm2: pwm02084000 {compatible "fsl,imx6ul-pwm", "fsl,imx27-pwm";reg <0x02084000 0x4000>;interrupts <GIC_SPI 84 IRQ_TYP…

2023年第四届“华数杯”数学建模思路 - 案例:FPTree-频繁模式树算法

## 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 算法介绍 FP-Tree算法全称是FrequentPattern Tree算法&#xff0c;就是频繁模式树算法&#xff0c;他与Apriori算法一样也是用来挖掘频繁项集的&#xff0c…

Databend 开源周报第 104 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 从 Kafka 载入数…

内存“银行”

项目介绍 本项目实现的是一个内存银行&#xff0c;它的原型是Google的一个开源项目tcmalloc&#xff0c;tcmalloc全称Thread-Caching Malloc&#xff0c;即线程缓存的malloc&#xff0c;实现了高效的多线程内存管理&#xff0c;用于替换系统的内存分配相关函数malloc和free。 有…

Linux第四章之权限理解

一、Linux用户的概念 Linux下有两种用户&#xff1a;超级用户&#xff08;root&#xff09;、普通用户。 超级用户&#xff1a;可以再linux系统下做任何事情&#xff0c;不受限制普通用户&#xff1a;在linux下做有限的事情。 超级用户的命令提示符是“#”&#xff0c;普通用户…

2023年第四届“华数杯”数学建模思路 - 案例:最短时间生产计划安排

文章目录 0 赛题思路1 模型描述2 实例2.1 问题描述2.2 数学模型2.2.1 模型流程2.2.2 符号约定2.2.3 求解模型 2.3 相关代码2.4 模型求解结果 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; 最短时间生产计划模型 该模型出现在好几个竞赛赛题上&#x…

【React】搭建React项目

最近自己在尝试搭建react项目&#xff0c;其实react项目搭建没有想象中的那么复杂&#xff0c;我们只需要使用一个命令把React架子搭建好&#xff0c;其他的依赖可以根据具体的需求去安装&#xff0c;比如AntDesignMobile的UI框架&#xff0c;执行npm install antd-mobile --sa…

什么是注意力机制?注意力机制的计算规则

我们观察事物时&#xff0c;之所以能够快速判断一种事物(当然允许判断是错误的)&#xff0c;是因为我们大脑能够很快把注意力放在事物最具有辨识度的部分从而作出判断&#xff0c;而并非是从头到尾的观察一遍事物后&#xff0c;才能有判断结果&#xff0c;正是基于这样的理论&a…

Stable Diffusion VAE:改善图像质量的原理、选型与使用指南

VAE Stable Diffusion&#xff08;稳定扩散&#xff09;是一种用于生成模型的算法&#xff0c;结合了变分自编码器&#xff08;Variational Autoencoder&#xff0c;VAE&#xff09;和扩散生成网络&#xff08;Diffusion Generative Network&#xff09;的思想。它通过对变分自…

【贪心+01背包】Tower

这是个很经典的问题 Tower - 洛谷 题意&#xff1a; 思路&#xff1a; 首先可以确定是个背包而且肯定要排序&#xff0c;但是根据什么排序不确定 因为交换相邻两个箱子只有对自身产生影响&#xff0c;所以可以贪心地考虑这两个箱子如何摆最优&#xff0c;而又因为本身上面的…

无人机编队路径规划算法的Matlab实现

室内多智能体协同控制是指在密闭空间内的各个无人机及无人车在运动时能够相互之间保持一定的相对距离&#xff0c;并在速度及位置上按照预设路线或命令进行运动的过程。本平台的多智能体协同定位采用光学运动捕捉技术&#xff0c;并通过WiFi网络实现多机、多车间的通信&#xf…

13-1_Qt 5.9 C++开发指南_多线程及QThread 创建多线程程序_ThreadSignal

一个应用程序一般只有一个线程&#xff0c;一个线程内的操作是顺序执行的&#xff0c;如果有某个比较消耗时间的计算或操作&#xff0c;比如网络通信中的文件传输&#xff0c;在一个线程内操作时&#xff0c;用户界面就可能会冻结而不能及时响应。这种情况下&#xff0c;可以创…

2023年第四届“华数杯”数学建模思路 - 案例:感知机原理剖析及实现

# 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 一、感知机的直观理解 感知机应该属于机器学习算法中最简单的一种算法&#xff0c;其原理可以看下图&#xff1a; 比如说我们有一个坐标轴&#xff08;图中的…

火车头伪原创插件怎么用【php源码】

这篇文章主要介绍了儿童学python编程哪个学校好&#xff0c;具有一定借鉴价值&#xff0c;需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获&#xff0c;下面让小编带着大家一起了解一下。 1、python几岁学比较好 python建议8岁到10岁以上的孩子学习&#xff0c;详细介…

聊天系统登录后端实现

定义返回的数据格式 # Restful API from flask import jsonifyclass HttpCode(object):# 响应正常ok 200# 没有登陆错误unloginerror 401# 没有权限错误permissionerror 403# 客户端参数错误paramserror 400# 服务器错误servererror 500def _restful_result(code, messa…

线性代数基础一 行列式

前言 行列式在线性代数中具有非常重要的地位,很多线性代数的问题都可以转化为计算行列式来解决。 集合 集合的表示方法&#xff1a;常用的有列举法和描述法。 列举法&#xff1a;常用于表示有限集合&#xff0c;把集合中的所有元素一一列举出来&#xff0c;写在大括号内&am…

grid map学习笔记3之详解grid_map_pcl库实现point cloud点云转换成grid map栅格地图

文章目录 0 引言1 grid_map_pcl示例1.1 主要文件1.2 示例数据1.3 启动文件1.4 配置文件1.5 主要实现流程1.6 启动示例1.7 示例结果 2 D435i 点云生成栅格地图2.1 D435i 点云文件2.2 修改启动文件2.3 测试和结果2.4 修改配置文件2.5 重新测试和结果 0 引言 grid map学习笔记1已…

海外网红营销:如何利用故事打造独具魅力的品牌形象?

随着全球数字化时代的来临&#xff0c;品牌推广已经从传统的广告宣传方式逐渐转变为更加注重故事性和情感共鸣的营销手段。故事营销在品牌塑造和传播过程中发挥着重要作用&#xff0c;它能够吸引消费者的注意力&#xff0c;加深品牌与受众的情感连接&#xff0c;从而为品牌带来…