MDN边看边记

news2024/11/29 4:41:25

css

css应用于文档的三种方法:使用外部样式表、使用内部样式表和使用内联样式。

css的层叠(cascade)和优先级(specificity):
层叠
在css中,顺序很重要,当应用两条同级别的规则到一个元素的时候,写在后面的就是实际使用的规则。
优先级
越具体的选择器,优先级越高。
一个选择器的优先级可以说是由三个不同的值(或分量)相加,可以认为是百(ID)十(类)个(元素)——三位数的三个位数:

  • ID:选择器中包含 ID 选择器则百位得一分。
  • :选择器中包含类选择器、属性选择器或者伪类则十位得一分。
  • 元素:选择器中包含元素、伪元素选择器则个位得一分。

内联样式
内联样式就是style属性内的样式说明,优先于所有普通样式,无论其优先级如何。

JavaScript

脚本调用策略

在html的标签元素中添加onclick处理器,相当于js污染了html,尽量不要这样做。
这样效率低下,对每一个需要应用js的按钮都需要添加onclick。
与其在html中添加js,不如使用纯js构造,比如addeventlistener。

html元素是按照其在页面中出现的次序调用的,如果用js来管理页面上的元素(dom,文档对象模型),如果js加载于欲操作的html元素之前,则代码将出错。
旧的解决办法
将脚本元素放在文档体的底端(也就是标签之前,与之相邻),这样脚本就可以在html解析完毕后加载了。问题是,所有的html dom加载完成后才开始脚本的加载/解析过程,对于有大量js代码的大型网站,可能会带来显著的性能损耗。
新的解决办法
js放在文档头部,在标签之前,可以是内部js也可以是外部js
内部js

document.addEventListener("DOMContentLoaded", () => {
  // …
});

这个监听器监听的是浏览器的**DOMContentLoaded**事件,该事件标志了html文档完全加载和解析。该代码块中的js在这个事件被触发之后才运行,因此避免了错误。
外部js
使用js的一项现代技术(defer属性),它告知浏览器在遇到<script>元素时继续下载html内容。

<script src="script.js" defer></script>

在这种情况下,脚本和html将一并加载,代码将顺利运行。
defer只适用于外部脚本,所以在内部js中只用**DOMContentLoaded**事件的方法,而不用defer。

async和defer

脚本阻塞的问题实际上有两种解决办法,asyncdefer
async-defer.jpg
async
浏览器遇到async脚本时不会阻塞页面渲染,而是直接下载然后运行。脚本下载完成后立即执行,在此刻将阻止页面的渲染。多个脚本同时进行的时候,脚本的运行次序是不可控制的。当页面的脚本之间彼此独立且不依赖于本页面的其他任何脚本时,async是最理想的选择。

<script async src="js/vendor/jquery.js"></script>

<script async src="js/script2.js"></script>

<script async src="js/script3.js"></script>

这三个使用async的脚本,彼此的加载顺序是不确定的。
async应该在有大量后台脚本需要加载,并且只想尽快加载到位的情况下使用。例如,加载游戏数据文件,这些文件在游戏真正开始时是需要的,但现在只需要显示游戏介绍、标题和大厅,而不想被脚本加载阻塞。
defer
使用defer属性的脚本将按照他们在页面上出现的顺序加载,在页面完全加载完毕之前,脚本不会运行,如果脚本依赖于dom的存在(例如,脚本修改了页面上的一个或者多个元素),这一点非常有用。

<script defer src="js/vendor/jquery.js"></script>

<script defer src="js/script2.js"></script>

<script defer src="js/script3.js"></script>

这三个使用defer的脚本加载顺序是jquery.js,script2.js,script3.js。并且在页面内容全部加载完成之前,他们不会运行。

函数

对象的函数叫做方法

在编写一个函数时,希望支持可选参数,可以在参数后添加一个=并在其后添加默认值,来指定参数的默认值。

function hello(name = "克里斯") {
  console.log(`你好,${name}`);
}

hello("阿里"); // 你好,阿里!
hello(); // 你好,克里斯!

函数名后面的小括号叫函数调用运算符(function invocation operater)。只有在想直接调用函数的地方才这么写。

btn.onclick = displayMessage();
// 在触发点击事件之前直接执行函数。

btn.onclick = displayMessage;
// 点击事件触发之后,运行函数中的代码。

注意,匿名函数中的代码也不是直接执行的。

btn.onclick = function () {
  displayMessage("Woo, this is a different message!");
};
// 点击事件触发之后,函数被执行。

事件监听机制

使用addEventListener来注册事件处理器,是最强大的方法,在复杂的程序中,他的扩展性最好。
另外还有两种,事件处理器属性内联事件处理器
事件处理器属性
可以触发事件的对象(比如:按钮)通常也有属性,其名称是on,后面跟的是事件名。为了处理事件,可以将处理函数分配给该属性。

const btn = document.querySelector("button");

function random(number) {
  return Math.floor(Math.random() * (number + 1));
}

btn.onclick = () => {
  const rndCol = `rgb(${random(255)}, ${random(255)}, ${random(255)})`;
  document.body.style.backgroundColor = rndCol;
};

// 也可以将处理器属性分配给具名函数。
const btn = document.querySelector("button");

function random(number) {
  return Math.floor(Math.random() * (number + 1));
}

function bgChange() {
  const rndCol = `rgb(${random(255)}, ${random(255)}, ${random(255)})`;
  document.body.style.backgroundColor = rndCol;
}

btn.onclick = bgChange;

addEventListener可以在同一个元素上多次调用不同,对于事件处理器属性,不能给一个事件添加一个以上的处理程序。

element.onclick = function1;
element.onclick = function2;
// 写在后面的会覆盖前面的。

内联事件处理器–不要用:

<button onclick="bgChange()">按下我</button>
<button onclick="alert('你好,这是来自旧式事件处理器的一条消息');">
  按下我
</button>
function bgChange() {
  const rndCol = `rgb(${random(255)}, ${random(255)}, ${random(255)})`;
  document.body.style.backgroundColor = rndCol;
}

过时了,不要用,低效,不好维护。

对象

对象是一个包含相关数据和方法的集合(通常由一些变量和函数组成,我们称之为对象里面的属性和方法)。
当对象的成员是函数时,可以用functionName()来代替functionName: function(),这样更简短。

手动写出一个对象的内容,来创建一个对象,称之为对象字面量(object literal)。与之不同的是通过类实例化一个对象。
发送一个对象,比分别发送其中的数据更有效率;使用名字表示其中的数据时,对象比数组更容易使用。

点表示法
person.name;使用了点表示法(dot notation)来访问对象的属性和方法。
第一位是对象名,表现为命名空间,紧接着一个点,后面是要访问的目标,可以是属性名,也可以是数组属性的一个子元素,或者是对象的方法调用,也可以是另一个命名空间(当对象的值是另一个对象时)。

括号表示法

person.age;
person.name.first;

// 改为括号表示法
person["age"];
person["name"]["first"];

数组是将数字映射到值,而这里是将对象的值的名称(字符串)映射到值,所以对象有时候也叫关联数组,使用关联了值的名称来选择元素,而不是索引。

const person = {
  name: ["Bob", "Smith"],
  age: 32,
};

function logProperty(propertyName) {
  console.log(person[propertyName]);
}

logProperty("name");
// ["Bob", "Smith"]
logProperty("age");
// 32

当对象属性的名称保存在变量中,这种情况只能用括号表示法。
点表示法只能接受字面量的成员的名字,不能接受表示成员名称的变量。
括号表示法可以动态地设置成员的名字。

// 用户动态地输入成员的名字和值
const myDataName = nameInput.value;
const myDataValue = nameValue.value;

// 将成员的名字和值添加到对象中
person[myDataName] = myDataValue;

this

关键字this指向了当前代码运行时的对象。

introduceSelf() {
  console.log(`你好!我是 ${this.name[0]}`);
}

手动编写对象字面量时看起来作用不大,而在使用构造函数从单个对象定义创建多个对象时,这很有用。

构造函数

构造函数是使用new关键字调用的函数,当我们调用构造函数时:

  • 创建一个新对象
  • this绑定到新对象,以便在构造函数代码中引用this
  • 运行构造函数的代码
  • 返回新的对象

原型与原型链

JavaScript中所有的对象都有一个内置属性,称为它的prototype(原型)。
其本身时一个对象,所以原型对象也会有它自己的原型,逐渐形成了原型链。原型链终止于拥有null作为其原型的对象上。
注意:指向对象原型的属性不是prototype。它的名字不是标准的,但实际上所有的浏览器都使用_proto_。访问对象原型的标准方法是Object.getProtottypeOf().

当我们试图访问一个对象的属性时,如果对象本身没有这个属性,就会在原型中搜索该属性;如果仍然找不到该属性,就搜索原型的原型,以此类推,直到找到该属性,或者达到原型链的末端,在这种情况下将返回undefined
有个对象叫Object.prototype,它是最基础的原型,所有对象默认都拥有它。Object.prototype的原型是null,所以它位于原型链的终点。

当对象中定义了一个属性,在该对象的原型中定义了一个相同的属性,结果是对象中的属性生效,而原型中的属性被“遮蔽”,这叫做属性的遮蔽

设置原型

两种方法:Object.create()和构造函数

Object.create()方法创建一个新的对象,并允许你指定一个将被用作新对象原型的对象。

const personPrototype = {
  greet() {
    console.log("hello!");
  },
};

const carl = Object.create(personPrototype);
carl.greet(); // hello!

JavaScript中所有函数都有一个名为prototype的属性。当我们调用一个函数作为构造函数时,这个属性会被设置为新构造函数对象的原型(按照惯例,在名为_proto_的属性中)。

const personPrototype = {
  greet() {
    console.log(`你好,我的名字是 ${this.name}`);
  },
};

function Person(name) {
  this.name = name;
}

Object.assign(Person.prototype, personPrototype);
// 或
// Person.prototype.greet = personPrototype.greet;
  • 创建personPrototype对象
  • 创建Person()构造函数
  • 使用Object.assignpersonPrototype中定义的方法绑定到Person()函数的prototype属性上。

这段代码之后,使用Person()创建的对象将获得Person.prototype作为其原型。其中包含greet方法。

这里的Person构造函数创建的对象由两个属性:

  • name属性,在构造函数中设置,在Person对象中可以直接看到
  • greet()方法,在原型中设置

这种模式,方法在原型上定义,数据属性在构造函数中定义。
方法对我们创建的每一个函数都是一样的,但每个对象的数据属性都有自己的值。

直接在对象中定义的属性,叫做自有属性,可以用静态方法Object.hasOwn().检查一个属性是否是自有属性。

const irma = new Person("Irma");

console.log(Object.hasOwn(irma, "name")); // true
console.log(Object.hasOwn(irma, "greet")); // false

注意:也可以使用非静态方法object.hasOwnProperty().,但更推荐静态方法Object.hasOwn().方法。

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

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

相关文章

苹果手机怎么连接蓝牙耳机?3个方案,3秒连接

在快节奏的现代生活中&#xff0c;无线蓝牙耳机因其便捷性和自由度成为了许多人的首选。那么&#xff0c;苹果手机怎么连接蓝牙耳机呢&#xff1f;本文将为您介绍3种快速连接苹果设备与蓝牙耳机的方案&#xff0c;让您在享受音乐、通话或观看视频时&#xff0c;不再受线缆束缚&…

‌无人机干扰技术及其法律约束

无人机作为一种先进的航空器&#xff0c;‌近年来在民用、‌商用、‌军事等领域得到了广泛应用。‌然而&#xff0c;‌随着无人机技术的不断发展&#xff0c;‌其受到的潜在威胁也日益增多。‌许多外部因素可以干扰无人机的正常运行&#xff0c;‌甚至导致其失控或坠毁。‌本文…

linux内核驱动流程

norflash:可线性访问(和内存的访问方式相同) nandflash: 不可线性访问&#xff0c;必须配个专门的程序访问 Linux启动: 1. 引导程序 bootloader&#xff0c;为内核启动准备环境 2.启动内核(kernel) 3. 加载根文件系统(挂载) 1.bootloader启动(裸机程序)--uboot.bin --为内…

[240822] X-CMD 发布 v0.4.7: 新增 htop 、btop 和 ncdu 模块;优化 colr 和 scoop 模块

X-CMD 发布 v0.4.7 目录 X-CMD 发布 v0.4.7&#x1f4c3;Changelog✨ htop✨ btop✨ ncdu✨ colr✨ scoop✅ 升级指南 &#x1f4c3;Changelog ✨ htop 新增 htop 模块。本模块优先使用环境中的 htop 命令&#xff1b;若当前环境没有 htop 命令&#xff0c;模块将使用 pixi 模…

线程池的构造以及相关方法

手写线程池 package cn.itcast.n8;import lombok.extern.slf4j.Slf4j; import org.springframework.core.log.LogDelegateFactory; import java.util.ArrayDeque; import java.util.Deque; import java.util.HashSet; import java.util.concurrent.TimeUnit; import java.util…

【卡码网C++基础课 6.数组的倒序与隔位输出】

目录 题目描述与分析一、数组二、Vector三、倒序输出数组四、隔位输出五、完整代码 题目描述与分析 题目描述&#xff1a; 给定一个整数数组&#xff0c;编写一个程序实现以下功能&#xff1a; 1.将输入的整数数组倒序输出&#xff0c;每个数之间用空格分隔。 2.从正序数组中&…

可视化大屏-实现自动滚动

一、背景&#xff1a;可视化大屏通常需要用到自动滚动的效果&#xff0c;本文主要采用的是vue-seamless-scroll组件来实现&#xff08;可参考官方文档&#xff09; 二、实现效果&#xff1a; 自动滚动 三、代码实现&#xff1a; 解题思路&#xff1a; 1.先安装依赖包 npm inst…

zTree 异步加载实现 点击加载

效果图如下 每级最多显示5000条数据&#xff0c;点击加载 会再次加载5000条数据 可以监听滚动条 动态加载 我这没实现这种方式。 <!-- ztreejs --> <script src".ztree/js/jquery.ztree.core.min.js" type"text/javascript"></script>…

DLAFormer:微软提出多任务统一的端到端文本分析Transformer模型 | ICDAR 2024

论文提出新颖的基于Transformer的端到端方法DLAFormer&#xff0c;在统一的模型中集成多个文档布局分析任务&#xff0c;包括图形页面对象检测、文本区域检测、逻辑角色分类和阅读顺序预测。为了实现这一目标&#xff0c;将各种DLA子任务视为关系预测问题并提出了统一标签空间方…

kafka监控工具EFAK

kafka监控工具&#xff08;EFAK&#xff09; 1、下载2、解压3、配置3.1、安装数据库&#xff0c;需要是mysql&#xff0c;并创建ke数据库3.2、修改配置文件 4、启动4.1、启动zookeeper4.2、启动kafka4.3、启动EFAK 5、访问http://ip:8048 github地址&#xff1a;https://github…

colmap的几种相机类型和内外参取得方法

colmap的相机类型可以参考models.h文件。 主要有以下几种相机类型&#xff1a; SimplePinhole&#xff1a; 内参格式&#xff1a;f, cx, cy 实际用的时候&#xff1a;fxfyf Pinhole: 内参格式&#xff1a;fx, fy, cx, cy 其他可以自行查看models.h文件。 内参存放在images.b…

《微信小程序开发》系列:第1篇—微信小程序简介

1.什么是微信小程序 微信小程序是一种运行在微信内部的 轻量级 应用程序。 在使用小程序时 不需要下载安装&#xff0c;用户 扫一扫 或 搜一下 即可打开应用。它也体现了 “用完即走” 的理念&#xff0c;用户不用关心安装太多应用的问题。它实现了应用“触手可及”的梦想&…

回归分析系列14— 多项式回归

17 多项式回归 17.1 简介 多项式回归是线性回归的一种扩展&#xff0c;它允许回归模型包括输入变量的高次项。这种方法特别适合处理非线性关系的数据。 17.2 多项式回归模型 在多项式回归中&#xff0c;模型形式如下&#xff1a; 其中&#xff0c;p 是多项式的阶数&#xf…

Vue项目-三级联动的路由跳转与传参

三级联动组件的路由的跳转与传参 三级联动&#xff0c;用户可以点击的&#xff1a;一级分类、二级分类和三级分类 以商城项目为例&#xff0c;Home模块跳转到Search模块&#xff0c;以及会把用户选中的产品&#xff08;产品名字、产品ID&#xff09;在路由跳转的时候&#xff…

【控糖有道,健康无忧!糖尿病患者的饮食黄金法则大揭秘】

在快节奏的现代生活中&#xff0c;糖尿病作为一种常见的慢性疾病&#xff0c;正悄然影响着越来越多人的生活质量。面对这一挑战&#xff0c;科学合理的饮食管理成为了控制病情、提升生活品质的关键。今天&#xff0c;就让我们一同揭开糖尿病饮食的黄金法则&#xff0c;让“控糖…

CentOS服务器三级等保加固

1.密码周期: vim /etc/login.defs max_days:90 mindays:2 minlen:8 warnage:72.密码复杂度: vim /etc/pam.d/system-auth &#xff1a; password requisite pam_cracklib.so retry3 difok3 minlen8 lcredit-1 dcredit-1 ucredit-1 ocredit-1 【Ubuntu系统->vim /etc/pam.d/c…

Linux组的介绍,所有者,所在组,修改所在组

目录 linux组的介绍 文件/目录所有者 组的创建 文件/目录所在组 其它组 改变用户所在组 linux组的介绍 每个用户必须属于一个组&#xff0c;不能独立于组外。 这个文件是谁创建的&#xff0c;这个文件的所有者就是谁。 这个文件属于组1&#xff0c;那么组2对它来说就…

VoLTE基本信令流程(整理的学习笔记)

VoLTE基本信令流程 1. 注册基本过程 UE进行Attach&#xff0c;建立QCI9的默认承载使用IMS APN建立PDN连接&#xff0c;建立 QCI5 的默认承载&#xff0c;用于传送 SIP 信令&#xff0c;同时获取到了IMS入口的P-CSCF地址信息UE 通过 QCI5 的默认承载向 IMS 发起注册请求IMS 域…

亚马逊ERP全功能 无隐藏收费的几个地方

亚马逊全功能 ERP 采集图片订单翻译&#xff0c;无任何隐藏收费。 说说有关采集和管理的软件&#xff01;1. 对于做跟卖的人来说需要大量采集产品&#xff0c;采集过来的产品还需要进行文本、图片翻译、修图等操作&#xff0c;图片储存和站点维护另算。市面上有些 ERP 软件在这…

美国高防服务器到底怎么选

美国高防服务器因其强大的硬件设施、高度的网络连接性、丰富的带宽资源和先进的防御技术而受到全球用户的欢迎。以下是选择美国高防服务器时需要考虑的关键因素&#xff0c;rak部落为您整理发布美国高防服务器到底怎么选。 确定服务器需求 容量和带宽&#xff1a;根据业务规模…