JavaScript 的 Generator 函数是 ES6 新增的重要特性之一,它允许开发人员编写像迭代器一样的函数,控制函数的执行流程并可以暂停和继续执行函数,这使得开发人员可以非常方便地写出复杂且高效的异步代码。
Generator 函数的定义
Generator 函数使用 function*
语法定义,函数体中包含使用 yield
语句定义的“中断点”,这些中断点会让函数在执行过程中暂停,以等待下一次被调用继续执行。
以下是一个简单的 Generator 函数的示例:
function* generator() {
yield 1;
yield 2;
yield 3;
}
const gen = generator();
console.log(gen.next().value); // 输出 1
console.log(gen.next().value); // 输出 2
console.log(gen.next().value); // 输出 3
在上面的示例中,Generator 函数 generator()
定义了 3 个中断点,分别是 yield 1
、yield 2
和 yield 3
。在调用 generator()
函数时,函数体并不会立即执行,而是返回一个迭代器对象 gen
。调用 gen.next()
方法后,迭代器会一步步执行到下一个中断点,运行并返回中断点后的值,以此类推。
Generator 函数的特点
可以暂停函数、恢复函数的运行;
每次 yield
关键字可以返回一个可选的值,这个值会被返回给 next()
方法;
可以返回无穷的值,并不需要将所有的值都计算出来;
可以通过 throw()
方法抛出异常;
可以通过 return()
方法结束函数执行。
Generator 函数的应用
Generator 函数可以用于实现协程、异步编程、事件循环等,在实际开发中有着广泛的应用。特别是在异步编程中,通过使用 Generator 函数和基于 Promise 的异步编程方式结合使用,可以避免回调地狱、提高代码的可读性和可维护性。
例如,以下是一个使用 Generator 函数和 Promise 实现异步编程的示例:
function* generator() {
try {
const result1 = yield fetch('https://api.example.com/data1');
const result2 = yield fetch('https://api.example.com/data2');
const result3 = yield fetch('https://api.example.com/data3');
console.log(result1, result2, result3);
} catch (err) {
console.error(err);
}
}
function run(gen) {
const itr = gen();
function next(value) {
const result = itr.next(value);
if (result.done) return result.value;
result.value.then(next).catch(itr.throw);
}
next();
}
run(generator);
在上面的示例中,generator()
函数定义了 3 个异步操作,通过 yield
暂停函数的执行。在 run()
函数中,通过 itr.next()
方法逐步执行 generator()
中的异步操作。
在每个异步操作的 Promise
对象执行成功后,next()
方法会将异步操作的结果通过 itr.next()
方法返回给 generator()
函数,并将结果传递给 yield
语句,并触发继续执行 generator()
函数的操作。如果异步操作执行失败,则通过 catch
捕获错误并停止执行。
通过使用 Generator 函数和 run()
函数,可以使异步操作按照预期的顺序执行,并保持代码的清晰和简洁。
Async/await 是 ES8/ES2017 引入的一项 JavaScript 语言特性,作为 Promise 的语法糖,它使得异步代码看起来更像同步代码,更加易于编写和理解。
2.async/await 的基本用法
使用 async/await 来处理异步操作时,我们需要使用 async
关键字来声明一个异步函数。在异步函数内部,我们可以使用 await
关键字等待 Promise 对象的结果,而不需要像 Promise 那样使用 then() 回调函数处理异步操作。
以下是一个简单的使用 async/await 的示例:
async function getData() {
const response = await fetch('https://api.example.com/data');
const data = await response.json();
return data;
}
getData().then(data => {
console.log(data);
}).catch(error => {
console.error(error);
});
在上面的代码中,getData()
函数使用 async 关键字声明为一个异步函数,函数内部使用 await 关键字等待 fetch()
和 response.json()
异步操作的结果,等待 Promise 对象 resolved 后,将结果赋给变量 data
并返回。在调用 getData()
函数时,使用 then() 和 catch() 处理 Promise 的 resolved 和 rejected 状态。
async/await 的特点
使异步操作变得更加易于编写和理解,使异步代码看起来更像同步代码;
采用函数和变量的方式来管理 Promise 对象的状态和值,避免了 Promise 嵌套带来的可读性问题;
可以被 try/catch 来处理异常;
可以同时等待多个异步操作的完成。
3。AJAX:
AJAX(Asynchronous JavaScript and XML)是用于创建异步 Web 应用程序的一种技术。它使用 XMLHttpRequest 对象来与服务器交换数据。通过 AJAX,可以在不重载整个页面的情况下更新部分页面内容。使用 AJAX,可以使 Web 应用程序更加快速、动态和用户友好。
通常,用于与服务器进行通信的数据格式是 JSON,但也可以使用其他格式如 XML、HTML 或纯文本。
let xhr = new XMLHttpRequest();
xhr.open(method, URL, [async, user, password])
method —— HTTP 方法。通常是 "GET" 或 "POST"。 URL —— 要请求的 URL,通常是一个字符串,也可以是 URL 对象。 async —— 如果显式地设置为 false,那么请求将会以同步的方式处理,我们稍后会讲到它。 user,password —— HTTP 基本身份验证(如果需要的话)的登录名和密码。
xhr.onload = function() {
alert(`Loaded: ${xhr.status} ${xhr.response}`);
};
xhr.onerror = function() { // 仅在根本无法发出请求时触发
alert(`Network Error`);
};
xhr.onprogress = function(event) { // 定期触发
// event.loaded —— 已经下载了多少字节
// event.lengthComputable = true,当服务器发送了 Content-Length header 时
// event.total —— 总字节数(如果 lengthComputable 为 true)
alert(`Received ${event.loaded} of ${event.total}`);
};
上面这段代码是一个 XMLHttpRequest 对象的事件处理函数,包括 onload
、onerror
和 onprogress
三个事件。解释如下:
xhr.onload
事件处理函数:在 XMLHttpRequest 请求完成后( readyState = 4)触发,表示服务端已经响应了请求。在该函数中,我们可以获取响应的状态码 xhr.status
以及响应体 xhr.response
,通常使用这些数据来更新页面的内容。
xhr.onerror
事件处理函数:表示无法满足请求,通常是网络连接方面的错误。在该函数中,我们可以处理无法发出请求的错误,例如网络连接问题等。
xhr.onprogress
事件处理函数:在请求过程中,定期触发,表示接收到了一部分响应数据。在该函数中,我们可以定期获取请求数据的下载进度,包括 event.loaded
已经下载的字节数和 event.total
总共需要下载的字节数,以此来实现一些高级的数据请求和进度显示效果。
需要注意的是,XHR 对象的事件处理函数需要在发送请求之前设置,以便在请求过程中自动调用。在这种情况下,我们可以使用 XMLHttpRequest.prototype
实例中的方法来添加事件处理程序。例如:
var xhr = new XMLHttpRequest();
xhr.open('GET', '/api/data.json');
xhr.addEventListener('load', function() {
alert(`Loaded: ${xhr.status} ${xhr.response}`);
});
xhr.addEventListener('error', function()
4.DOM 操作:
DOM(Document Object Model)是指将 HTML 或 XML 文档作为一个树形结构表示的模型。文档的每个部分都可以被视为一个节点,节点的关系构成了整个文档的层次结构。
在 JavaScript 中,可以使用 DOM API 对页面中的元素进行访问、修改、添加或删除。例如,可以使用 document.createElement()
创建新元素,使用 element.appendChild()
向父元素添加子元素,使用 element.removeChild()
删除子元素等。
5.BOM 操作:
BOM(Browser Object Model)是指浏览器对象模型,它提供了访问浏览器窗口和框架的对象,也提供了一些用于查询、操作浏览器功能的方法和属性。
在 JavaScript 中,可以使用 BOM API 访问浏览器窗口和框架,例如 window
对象和 location
对象等。可以使用这些对象的方法和属性,例如 window.open()
打开新窗口,使用 location.href
修改 URL 等。BOM API 还提供了一些事件供开发人员监听,例如窗口大小改变、鼠标单击等。
需要注意的是,由于浏览器的不同实现可能存在差异,因此在编写跨浏览器代码时,应该尽量避免直接使用 BOM 和 DOM API,而应该使用 JavaScript 库或框架,这些库和框架已经解决了大部分的浏览器兼容性问题。
1.类(Class) :
类是 JavaScript 中实现面向对象编程的机制之一,使用 class 关键字定义一个类,通过定义类中的属性和方法,可以通过创建实例来使用类。类提供了一种抽象的概念,可以帮助我们更好地组织和管理代码。
例如,在下面的示例中,我们可以定义一个名为 Person
的类,它有一个构造函数和一个 greet()
方法:
class Person {
constructor(name) {
this.name = name;
}
greet() {
console.log(`Hello, my name is ${this.name}`);
}
}
const tom = new Person('Tom');
tom.greet(); // 输出 "Hello, my name is Tom"
2.函数(Function) :
函数是 JavaScript 中可执行代码的基本单位之一,我们可以定义有参数和没有参数的函数,有返回值和没有返回值的函数。函数可以存储在变量、数组和对象中,并作为另一个函数的参数来使用。JavaScript 函数也支持闭包的特性,可以保留外部函数作用域中的变量和状态。
例如,以下是一个简单的 JavaScript 函数示例:
function add(a, b) {
return a + b;
}
const sum = add(1, 2); // sum = 3
3.对象(Object):
在 JavaScript 中,对象是一种数据类型,代表一个实体或物体,并存储有关该实体的相关信息。对象由一组键值对来表示,每个键值对称为对象的属性。属性的值可以是基本类型、函数、其他对象等。
例如:
const person = {
name: 'Tom',
age: 20,
greet: function() {
console.log(`Hello, my name is ${this.name}`);
}
};
person.greet(); // 输出 "Hello, my name is Tom"
4.实例(Instance):
实例是一个类被创建后,通过该类构造函数创建的对象。实例化过程涉及到为对象分配内存并调用构造函数。每个实例都具有与类定义中指定的属性和方法相同的属性和方法。可以创建任意数量的实例,并且每个实例都是相互独立的。
例如,以下是创建 Person
类的实例 tom
:
class Person {
constructor(name) {
this.name = name;
}
greet() {
console.log(`Hello, my name is ${this.name}`);
}
}
const tom = new Person('Tom');
tom.greet(); // 输出 "Hello, my name is Tom"
5.泛型(Generics):
泛型是在编程语言中实现算法和数据结构时广泛使用的一项技术。泛型允许开发人员编写、使用可重用的代码,从而支持类型不必紧密绑定到特定类型上的编程。在 JavaScript 中,泛型通常会使用变量来定义类型并抽象算法或数据结构。
例如,以下是一个使用泛型来创建一个可重用的数组工具类 ArrayUtilities
的示例:
class ArrayUtilities {
static reverse(array: T[]): T[] {
return array.reverse();
}
static shuffle(array: T[]): T[] {
for (let i = array.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[array[i], array[j]] = [array[j], array[i]];
}
return array;
}
}
const numbers = [1, 2, 3, 4, 5];
const reversedNumbers = ArrayUtilities.reverse(numbers); // [5, 4, 3, 2, 1]
const shuffledNumbers = ArrayUtilities.shuffle(numbers); // e.g [2, 5, 4, 1, 3]
6.继承(Inheritance):
继承是一种面向对象编程的概念,它允许派生一个类,该类继承基类的属性和方法,并且可以添加新的属性和方法。在 JavaScript 中,可以使用继承来重用代码和避免重复编写已有的代码。
例如,以下是一个使用继承创建 Person
类的子类 Student
的示例:
class Person {
constructor(name) {
this.name = name;
}
greet() {
console.log(`Hello, my name is ${this.name}`);
}
}
class Student extends Person {
constructor(name, grade) {
super(name);
this.grade = grade;
}
study() {
console.log(`${this.name} is studying in ${this.grade} grade`);
}
}
const tom = new Student('Tom', 5);
tom.greet(); // 输出 "Hello, my name is Tom"
tom.study(); // 输出 "Tom is studying in 5 grade"
在上面的代码中,我们使用 extends
关键字来创建 Student
类,它继承了 Person
类的属性和方法,并添加了新的 study()
方法。在 Student
类中,我们调用 super()
方法来调用 Person
类的构造函数,并为 grade
属性设置一个新的值。然后我们使用 new
关键字创建 Student
类的实例,使用 greet()
和 study()
方法,以此来测试继承效果。
DOM (D ocument O bject M odel)(文档对象模型)
声明为 HTML5 文档
元素是 HTML 页面的根元素
元素包含了文档的元(meta)数据,如 定义网页编码格式为 utf-8 。
元素描述了文档的标题
元素包含了可见的页面内容
元素定义一个大标题
元素定义一个段落
HTML 标题(Heading)是通过
- 标签来定义的。
HTML 段落是通过标签
来定义的。
这是一个链接
HTML 图像是通过标签 来定义的.
标签在 HTML 页面中创建水平线。
标签
描述
定义粗体文本
定义着重文字
定义斜体字
定义小号字
定义加重语气
定义下标字
定义上标字
定义插入字
定义删除字
HTML 元素
标签描述了基本的链接地址/链接目标,该标签作为HTML文档中所有的链接标签的默认链接:
实例
HTML 元素
标签定义了文档与外部资源之间的关系。
标签通常用于链接到样式表:
实例
HTML
HTML 元素
meta标签描述了一些基本的元数据。
标签提供了元数据.元数据也不显示在页面上,但会被浏览器解析。
META 元素通常用于指定网页的描述,关键词,文件的最后修改时间,作者,和其他元数据。
元数据可以使用于浏览器(如何显示内容或重新加载页面),搜索引擎(关键词),或其他Web服务。
一般放置于
区域
标签- 使用实例
为搜索引擎定义关键词:
为网页定义描述内容:
定义网页作者:
每30秒钟刷新当前页面:
使用 text-align(文字对齐)属性指定文本的水平与垂直对齐方式:
实例
居中对齐的标题 这是一个段落。
HTML 表格
表格由
标签来定义。每个表格均有若干行(由 标签定义),每行被分割为若干单元格(由 标签定义)。字母 td 指表格数据(table data),即数据单元格的内容。
数据单元格可以包含文本、图片、列表、段落、表单、水平线、表格等等。
HTML 表格表头
表格的表头使用
标签进行定义。
大多数浏览器会把表头显示为粗体居中的文本:
Header 1
Header 2
row 1, cell 1
row 1, cell 2
row 2, cell 1
row 2, cell 2
在浏览器显示如下:
HTML中的元素根据其在文档流中的表现方式可以分为块级元素和行内元素,具体如下:
块级元素: 块级元素通常用于表示页面上的结构和内容,它会占据一行或多行,并且会在其前后产生一个换行符。常见的块级元素有:
~
行内元素: 行内元素通常用于表示文本内容,它不会单独占据一行,而是在一行之内进行排列。常见的行内元素有:
另外还有一类元素叫做行内块级元素,它们具有行内元素的特性,但是可以设置宽高等属性,常见的行内块级元素有:
需要注意的是,HTML5中新增的一些元素例如 、 等也是块级元素。此外,元素的默认表现方式可以通过CSS进行修改,比如将一个块级元素设置为行内元素,或者将一个行内元素设置为块级元素。
对象是 JavaScript 中最重要的数据类型之一,它通常用于描述和操作现实世界中的事物。对象是一组相关属性和方法的集合,可以像一个独立的实体一样进行操作和处理。
例如,如果要描述一个人,可以使用对象来存储和操作与这个人相关的信息。这个人的信息包括姓名、年龄、性别、电话号码、地址等等。将这些信息存储在一个对象中,可以很方便地进行访问和操作。例如,可以使用属性名来访问一个人的姓名或年龄:
let person = {
name: 'Tom',
age: 30,
gender: 'Male',
phone: '1234567890',
address: '123 Main Street',
};
// 访问姓名和年龄
console.log(person.name); // 输出 'Tom'
console.log(person.age); // 输出 30
在这个例子中,person
是一个对象,它包含了一些属性,如name
、age
、gender
等;每个属性都有一个关联的值。使用点运算符和属性名可以访问这些属性的值。
除了属性,对象还可以包含方法。例如,一个人可以有一个 getInfo()
方法,用于返回他的姓名、年龄、性别和地址。定义方法的方式是在对象中添加一个函数,比如:
let person = {
name: 'Tom',
age: 30,
gender: 'Male',
phone: '1234567890',
address: '123 Main Street',
getInfo() {
return `${this.name} is a ${this.gender} of age ${this.age} and lives at ${this.address}`;
},
};
console.log(person.getInfo()); // 输出 "Tom is a Male of age 30 and lives at 123 Main Street"
在这个例子中,getInfo()
是一个方法,用于返回人的信息。每个方法都可以在对象中定义,并且可以通过对象来调用。
实现 (Implementation):实现是指使用代码将抽象概念转换为具体的程序功能。它通常涉及到编写类、方法、函数等具体的代码实现,以达到预期目标。例如,实现一个存储数据的接口,可以使用 JavaScript 中的类和对象实现。
抽象 (Abstraction):抽象是指将复杂的程序实现细节隐藏起来,只让用户看到简单易懂的概念和接口。在 JavaScript 中,抽象可以通过类、函数、接口、模块等实现。例如,在类中声明一个方法而无需暴露其内部实现细节,这是抽象的一个示例。
混入 (Mixin):混入是一种编程技巧,允许将多个对象的功能组合在一起,并创建一个新的对象。在 JavaScript 中,混入通常是通过将对象的属性和方法复制到另一个对象中来实现的。这些属性和方法可以来自类、原型或其他对象。Mixin 可以用来实现代码重用和模块化的目标。
切面 (Aspect):切面编程是一种编程范式,可以将特定的代码逻辑跨越多个不同的对象和方法。它的核心思想是将一些横切关注点(cross-cutting concerns)抽象出来,并注入到应用程序的多个部分中,从而实现模块化和可维护性。在 JavaScript 中,可以使用 AOP(面向切面编程)库或框架来实现切面编程。
JavaScript 数据类型
值类型(基本类型) :字符串(String)、数字(Number)、布尔(Boolean)、空(Null)、未定义(Undefined)、Symbol。
引用数据类型(对象类型) :对象(Object)、数组(Array)、函数(Function) ,还有两个特殊的对象:正则(RegExp)和日期(Date)。
HTML 表单 是 Web 应用程序中非常基础的功能之一,它允许 Web 用户提交数据给服务器。以下是 HTML 表单中最基本的元素:
form 元素 :form 元素是 HTML 表单的容器,它包含一组输入元素,这些元素用于收集用户输入数据。该元素包含 action、method、enctype、name、target 等属性,例如:
action:表单提交时将数据发送到的 URL
method:表单提交时使用的 HTTP 方法(GET、POST)
enctype:编码类型,用于支持文件上传功能
name:表单的名称
target:表单提交后数据的显示位
2.input 元素 :input 元素是表单中最常见的元素类型。它包含 type、value、name、placeholder、readonly、disabled、maxlength 和 required 等属性,例如:
type:输入元素的类型(text、password、email、number、date、url、file 等)
value:输入元素的默认值
name:用于识别输入元素的名称
placeholder:用于在输入元素为空时提供提示性的文本
readonly:输入元素只读
disabled:输入元素禁用
maxlength:输入元素允许输入的最大字符串长度
required:该输入元素为必填
3.textarea 元素 :textarea 元素用于多行的文本输入,例:
cols:指定文本框的列数
rows:指定文本框的行数
4.select 元素 :select 元素是下拉列表框,它允许用户从预定义的选项列表中选择一个或多个选项,例如:
男
女
option 元素:定义下拉列表的每个选项,它包含 value 和 selected 属性
selected:设置下拉列表的默认选项
5.button 元素 :button 元素用作提交表单,或者充当复选框、单选框、拖动按钮等,它包含 type、name、value、disabled 和 form 等属性,例:
提交
type:button 元素的类型(submit、reset、button)
name:设置按钮名称
value:设置提交表单所要发送的值
disabled:设置按钮是否禁用
checkbox 元素:checkbox 元素表示一组选项中的多个选项,使用 checked 属性来设置选项是否被选中,例如:
Apple
Orange
Banana
name:设置选项组的名称
value:设置每个选项的值
checked:设置选项是否默认选中
radio 元素:radio 元素表示一组选项中的单个选项,使用 checked 属性来设置选项是否被选中,例如:
Male
Female
name:设置选项组的名称
value:设置每个选项的值
checked:设置选项是否默认选中
file 元素:file 元素用于表单中的文件上传功能,它允许用户选择本地磁盘上的文件进行上传,例如:
submit 元素:submit 元素用于提交表单数据到服务器,例如:
reset 元素:reset 元素用于重置表单中的所有输入字段,例如:
hidden 元素:hidden 元素用于存储表单数据,但不显示在用户界面上,例如:
name:用于识别隐藏输入元素的名称
value:设置隐藏输入元素的值
伪类:
1.:hover 伪类 :hover 伪类用于选中鼠标悬停在其上的元素。可以使用:hover伪类为元素添加一些动画和样式,以改善用户体验。
举个例子:假设有如下的CSS规则,它会让鼠标悬停在链接元素上时,改变链接的文本颜色和下划线:
a:hover {
color: red;
text-decoration: underline;
}
2:nth-child() 伪类 :nth-child() 伪类用于选择特定位置的子元素。可以使用:nth-child()伪类为某些元素添加特殊的样式或影响元素的表现方式。
举个例子:如果要选择某个列表中的第二个列表项并将其背景颜色更改为红色,可以使用如下CSS规则:
li:nth-child(2) {
background-color: red;
}
3.:active 伪类 :active 伪类用于选中当前正在被操作的元素。可以使用:active伪类在用户点击元素时为其添加一些样式效果。
举个例子:假设有如下的CSS规则,它会在用户点击按钮元素时,将按钮的文本背景颜色更改为灰色:
button:active {
background-color: gray;
}
4.:focus 伪类 :focus 伪类用于选中当前获取焦点的元素。可以使用:focus伪类为用户在表单元素上输入数据时改变元素的样式。
举个例子:假设有如下的CSS规则,它会在文本框获得焦点时,使文本框的边框变为蓝色:
input:focus {
border-color: blue;
}
5.:first-child 伪类 :first-child 伪类用于选择作为其父元素下的第一个子元素的元素。可以使用:first-child伪类为页面中的元素添加特殊的样式或排版。
举个例子:假设有如下的CSS规则,它会将列表中的第一个列表项的颜色更改为红色:
li:first-child {
color: red;
}
伪元素:
CSS中的伪元素(Pseudo-elements)是一种用于在元素的内容前面或后面添加特殊样式的CSS选择器。它们通常表示元素的特定部分,而不是被选中元素的整个内容。在CSS中,伪元素以双冒号(::)开头。下面是一些常见的伪元素:
1.::before ::before伪元素在选中元素的开始处插入内容。通常用于添加一些装饰或图像,或者用于创建某些视觉效果,例如下划线、引号或图标等。
举个例子,以下 CSS 规则使用 ::before 内容和实心圆点作为列表标记:
li::before {
content: "•";
margin-right: 8px;
}
2.::after 1.::after伪元素在选中元素的结束处插入内容。与::before伪元素类似,通常用于添加一些装饰或图像,或者用于创建某些视觉效果。
举个例子,以下 CSS 规则使用 ::after 内容添加一个引号:
blockquote::after {
content: '"';
}
3.::first-line ::first-line伪元素用于选择某些元素中的第一行文本,并对其应用特殊样式。可以使用它来更改文本的颜色、字体或间距等属性。
举个例子,以下 CSS 规则将选中段落的第一行文本颜色更改为红色:
p::first-line {
color: red;
}
4.::first-letter ::first-letter伪元素用于选择某些元素中的第一个字母,并对其应用特殊样式。它可以用于创建大写字母开头的首字母效果或其他视觉效果。
举个例子,以下 CSS 规则将选中段落的第一个字母颜色更改为蓝色:
p::first-letter {
color: blue;
}
5.::selection ::selection伪元素用于选择用户选中的文本,例如文本框或页面的任何文本区域。可以使用它来更改选中文本的背景颜色或文本颜色等属性。
举个例子,以下 CSS 规则更改选中文本的背景颜色:
::selection {
background-color: yellow;
}
JS事件:
鼠标事件:
click
:元素被单击时触发
contextmenu
:元素上发生鼠标右键单击事件时触发
dblclick
:元素被双击时触发
mouseout
:鼠标移开元素时触发
mouseover
:鼠标移到元素上时触发
mousedown
:鼠标在元素上按下时触发
mouseup
:鼠标在元素上释放时触发
表单事件:
submit
:表单提交时触发
reset
:表单重置时触发
change
:表单内容改变时触发
focus
:元素获得焦点时触发
blur
:元素失去焦点时触发
键盘事件:
keydown
:按下键盘上的键时触发
keyup
:释放键盘上的键时触发
keypress
:按下并释放键盘上的键时触发
窗口事件:
resize
:调整窗口大小时触发
load
:文档或图像完成加载时触发
unload
:文档被卸载或关闭窗口时触发
现在的时间是?
现在的时间是?
:这是一个按钮元素,当用户单击该按钮时,会执行 onclick
事件处理程序。onclick
属性中的 JavaScript 代码是一个表达式,它调用了 getElementById()
方法来获取一个拥有 id
为 demo
的元素,并使用 innerHTML
属性将其中的内容设置为当前时间。
:这是一个段落元素,它拥有一个 id
为 demo
。这个元素将用于显示当前时间。
当用户单击该按钮时,JavaScript 代码将获取元素 demo
并将其 innerHTML
属性设置为当前的时间。其中,Date()
是 JavaScript 中的一个内置对象,它返回当前时间并且包含了年、月、日、小时、分钟、秒数等信息。通过这种方式,开发者可以使用 JavaScript 动态显示网页中的内容,让用户感知到网页的实时性。
AJAX
AJAX 不是新的编程语言,而是一种使用现有标准的新方法。
AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。
AJAX 不需要任何浏览器插件,但需要用户允许 JavaScript 在浏览器上执行。
XMLHttpRequest 只是实现 Ajax 的一种方式。
function loadXMLDoc()
{
var xmlhttp;
if (window.XMLHttpRequest)
{
// IE7+, Firefox, Chrome, Opera, Safari 浏览器执行代码
xmlhttp=new XMLHttpRequest();
}
else
{
// IE6, IE5 浏览器执行代码
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open("GET","/try/ajax/ajax_info.txt",true);
xmlhttp.send();
}
首先定义了一个函数 loadXMLDoc()
,用于向服务器发送 HTTP 请求,并响应服务器端的响应。
创建 xmlhttp
对象。根据当前使用的浏览器不同,xmlhttp
对象使用的创建方法也有所不同。如果浏览器支持 XMLHttpRequest 对象,则可以使用 new XMLHttpRequest()
创建,如果不支持,则需要使用 ActiveXObject 对象。
在 onreadystatechange
方法中,定义事件发生时的处理函数。当 readyState
的值改变时,此事件就会被触发,表示从服务器接收到响应的某一部分数据。
open()
方法用于初始化请求,配置 xhr 对象。第一个参数为请求方式,第二个参数为请求 URL,第三个参数为是否异步执行。
send()
方法用于向服务器发送请求,如果是 GET 方法的请求,则 send() 方法接收 null 参数。如果是 POST 方法的请求,则需要将实际传递的数据作为参数传递给 send() 方法。
在响应到达时,检查接收到的 response 状态。如果状态码是 200
,表示请求成功,根据 XML 响应文档的格式,解析响应对象并将响应的内容插入到 HTML 页面上对应的 DOM 元素中。
总结:该段代码通过 XML HTTP 请求对象在不刷新页面的情况下向服务器发送即时的请求数据,并在响应到达时更新页面的相关元素,使网页操作更加流畅和快速。
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
}
}
这段代码是一个回调函数,通过 XMLHttpRequest 对象的 readyState 和 status 属性来判断异步请求的状态,当请求已完成且服务器返回状态码为200时,该函数会被调用。具体解释如下:
xmlhttp.onreadystatechange=function()
:定义了一个名为 onreadystatechange
的回调函数,该函数会在 readyState 属性发生改变时调用。
if (xmlhttp.readyState==4 && xmlhttp.status==200)
:判断 readyState 属性是否为 4,status 属性是否为 200。只有在 readyState 等于 4 且 status 等于 200 的情况下,才说明请求已经完成并响应成功。
document.getElementById("myDiv").innerHTML=xmlhttp.responseText
:如果请求已完成并响应成功,将请求返回的文本内容设置为具有 ID 为 “myDiv” 的元素的 innerHTML 属性,从而将响应内容更新到页面上。
上述过程用于将服务器返回的响应数据显示在页面上,实现 AJAX 数据交换的核心部分。这段代码在开发 AJAX 应用时是非常常见的代码段,其中 readyState 属性表示请求状态,status 属性表示请求返回的 HTTP 状态码。具体状态码和解释可以参考 HTTP 协议。
var xhr = new XMLHttpRequest();
xhr.onload = function () {
// 输出接收到的文字数据
document.getElementById("demo").innerHTML=xhr.responseText;
}
xhr.onerror = function () {
document.getElementById("demo").innerHTML="请求出错";
}
// 发送异步 GET 请求
xhr.open("GET", "https://www.runoob.com/try/ajax/ajax_info.txt", true);
xhr.send();
这段代码实现了通过 JavaScript 发送异步 GET 请求,并在请求完成后将接收到的数据渲染到 HTML 页面上。
代码分解如下:
首先创建一个 XMLHttpRequest 对象,通过 new XMLHttpRequest()
创建。
为 xhr
对象的 onload
事件绑定一个回调函数,在请求成功时被调用。回调函数中使用 document.getElementById("demo").innerHTML
将接收到的内容渲染到网页上指定的元素中,从而显示在用户的页面中。
在 xhr
对象的 onerror
事件中绑定一个错误处理函数,当请求出现错误时会触发该事件。
使用 xhr.open()
方法打开一个 URL,并配置请求的方法、URL 和是否异步等参数。参数 “GET” 表示使用 HTTP 的 GET 方法发起请求,第二个参数为请求 URL,最后一个参数表示是否使用异步方式发送请求。
使用 xhr.send()
方法发起异步请求,将返回的数据交由 onload
事件的回调函数处理。
将请求响应数据渲染到页面上的核心代码也已经被封装在回调函数中,可根据需要进行修改。这段代码片段通过 XMLHttpRequest 对象实现了通过 JavaScript 发送和接收异步 HTTP 请求的功能,从而实现了实时的数据交互和网页呈现,是现代 Web 开发中不可或缺的技术手段之一。
JS事件循环机制:
JavaScript 的事件循环(Event Loop)是一种用于处理异步操作的机制,通过不断地监听和处理消息队列中的事件,实现异步编程。JavaScript 引擎中存在一个消息队列,当什么事件(比如一个定时器超时或者一个 I/O 完成)出现后,引擎就会将事件加入消息队列中,然后继续执行其他代码,直到所有的同步任务执行完毕。当同步任务执行完毕后,引擎就不断地从消息队列中取出事件,并且执行对应的事件处理函数,从而实现了异步操作。整个过程被称为事件循环。
具体来说,事件循环的过程可以分为以下几个步骤:
执行所有的主线程同步代码,包括全局代码和函数体内的代码。
将所有产生的异步操作加入消息队列,异步操作包括定时器超时、网络请求、事件监听等。
当主线程空闲时,从消息队列取出一条消息(异步操作的回调函数)并执行,一次循环就是这样的过程。
重复上述步骤,直到消息队列为空。
需要注意的是,事件循环遵循一个非常重要的原则,即 “先进先出”(First In First Out,FIFO)原则,每次从消息队列中取出的事件都是最先加入队列的。另外,任何时刻,主线程中只会执行一个任务,也就说同步任务和异步任务不会同时执行,而只会根据事件循环的规则依次执行。
如果有连续的异步操作,它们都会被加入消息队列,然后一次性执行对应的回调函数。当这些异步操作被处理完毕后,主线程才会处理其他任务,这样可以避免过多的异步操作对主线程的影响,提高程序的响应速度和效率。
JavaScript 的事件循环机制因为实现简单、高效而得到了广泛的应用,特别是在 Node.js 等服务器端应用程序中,事实上 Node.js 就是建立在事件循环基础之上的一个异步 I/O 框架。
BOM:
BOM(Browser Object Model)是浏览器对象模型,用于描述浏览器窗口和窗口内容的对象结构。它提供了一组 API,允许开发者操作浏览器窗口、浏览器历史记录、屏幕、浏览器和用户之间的通信以及其他浏览器相关的信息和功能。
以下是一些基本的 BOM 操作:
window 对象:它是 BOM 中的顶层对象,表示整个浏览器窗口及其内容。通过 window 对象可以访问和控制浏览器窗口的大小、位置、标题等属性,还可以管理浏览器的历史记录、创建和关闭浏览器窗口等。
location 对象:它表示当前页面的 URL,是 window 对象的一个属性。通过 location 对象可以获取和设置页面的 URL,也可以进行页面跳转和刷新等操作。
navigator 对象:它包含了关于浏览器的信息,比如浏览器名称、版本、对应的操作系统信息等。通过 navigator 对象可以判断浏览器类型和版本,以便在代码中根据具体情况进行特定的处理。
screen 对象:它表示屏幕的信息和特性,比如屏幕的宽度和高度、颜色深度等。通过 screen 对象可以获取屏幕信息,从而调整页面布局和设计,以适应不同的设备和分辨率。
history 对象:它允许访问浏览器的历史记录,可以前进、后退等操作。history 对象保存了用户在浏览器中访问页面的所有 URL,开发者可以进行浏览器历史的管理,实现前端路由功能等。
上述操作只是 BOM API 的一部分,BOM 还提供了其他许多有用的 API,比如弹出框、定时器、拖拽和会话存储等等。使用这些 API 可以实现更加丰富和复杂的 BOM 操作,使开发者能准确地控制和管理浏览器的行为,提供更好的用户体验。
你可能感兴趣的:(javascript,前端,开发语言)
移动端城市区县二级联动选择功能实现包
good2know
本文还有配套的精品资源,点击获取简介:本项目是一套为移动端设计的jQuery实现方案,用于简化用户在选择城市和区县时的流程。它包括所有必需文件:HTML、JavaScript、CSS及图片资源。通过动态更新下拉菜单选项,实现城市到区县的联动效果,支持数据异步加载。开发者可以轻松集成此功能到移动网站或应用,并可基于需求进行扩展和优化。1.jQuery移动端解决方案概述jQuery技术简介jQuery
day15|前端框架学习和算法
universe_01
前端 算法 笔记
T22括号生成先把所有情况都画出来,然后(在满足什么情况下)把不符合条件的删除。T78子集要画树状图,把思路清晰。可以用暴力法、回溯法和DFS做这个题DFS深度搜索:每个边都走完,再回溯应用:二叉树搜索,图搜索回溯算法=DFS+剪枝T200岛屿数量(非常经典BFS宽度把树状转化成队列形式,lambda匿名函数“一次性的小函数,没有名字”setup语法糖:让代码更简洁好写的语法ref创建:基本类型的
用代码生成艺术字:设计个性化海报的秘密
本文围绕“用代码生成艺术字:设计个性化海报的秘密”展开,先概述代码生成艺术字在海报设计中的独特价值,接着介绍常用的代码工具(如HTML、CSS、JavaScript等),详细阐述从构思到实现的完整流程,包括字体样式设计、动态效果添加等,还分享了提升艺术字质感的技巧及实际案例。最后总结代码生成艺术字的优势,为设计师提供打造个性化海报的实用指南,助力提升海报设计的独特性与吸引力,符合搜索引擎SEO标准
vue element 封装表单
影子信息
vue vue.js javascript 前端
背景:在前端系统开发中,系统页面涉及到的表单组件比较多,所以进行了简单的封装。封装的包括一些Form表单组件,如下:input输入框、select下拉框、等实现效果:理论知识:表单组件官方链接:点击跳转封装组件:封装组件的思路:不封装element组件,每一个input组件绑定一个form对象,例如官网。简单封装element组件,利用for循环生成form表单的每一项el-form-item。进
前端面试每日 3+1 —— 第39天
浪子神剑
今天的面试题(2019.05.25)——第39天[html]title与h1、b与strong、i与em的区别分别是什么?[css]写出你知道的CSS水平和垂直居中的方法[js]说说你对模块化的理解[软技能]公钥加密和私钥加密是什么?《论语》,曾子曰:“吾日三省吾身”(我每天多次反省自己)。前端面试每日3+1题,以面试题来驱动学习,每天进步一点!让努力成为一种习惯,让奋斗成为一种享受!欢迎在Iss
前端数据库:IndexedDB从基础到高级使用指南
文章目录前端数据库:IndexedDB从基础到高级使用指南引言一、IndexedDB概述1.1什么是IndexedDB1.2与其他存储方案的比较二、基础使用2.1打开/创建数据库2.2基本CRUD操作添加数据读取数据更新数据删除数据三、高级特性3.1复杂查询与游标3.2事务高级用法3.3性能优化技巧四、实战案例:构建离线优先的待办事项应用4.1数据库设计4.2同步策略实现五、常见问题与解决方案5.
【Java Web实战】从零到一打造企业级网上购书网站系统 | 完整开发实录(三)
笙囧同学
java 前端 状态模式
核心功能设计用户管理系统用户管理是整个系统的基础,我设计了完整的用户生命周期管理:用户注册流程验证失败验证通过验证失败验证通过用户名已存在用户名可用失败成功用户访问注册页面填写注册信息前端表单验证显示错误提示提交到后端后端数据验证返回错误信息用户名唯一性检查提示用户名重复密码加密处理保存用户信息保存成功?显示系统错误注册成功跳转登录页面登录认证机制深度解析我实现了一套企业级的多层次安全认证机制:认
从零到一:打造基于GigaChat AI的艺术创作平台 | 笙囧同学的全栈开发实战
作者简介:笙囧同学,中科院计算机大模型方向硕士,全栈开发爱好者联系方式:3251736703@qq.com各大平台账号:笙囧同学座右铭:偷懒是人生进步的阶梯前言在AI技术飞速发展的今天,如何将前沿的大模型技术与实际应用相结合,一直是我们开发者关注的焦点。今天,笙囧同学将带大家从零开始,构建一个基于GigaChatAI的艺术创作平台,实现React前端+Django后端的完整全栈解决方案。这不仅仅是
14.tornado操作之应用Websocket协议实现聊天室功能
孤寒者
Tornado框架从入门到实战 websocket tornado 聊天室功能实现 python
目录:每篇前言:1.什么是WebSocket(1)定义(2)优点(3)和HTTP对比(4)适用场景2.WebSocket关键方法3.本tornado项目中使用WebSocket(1)准备一个聊天室的页面:第一步:编写视图:第二步:编写接口:(app.py中加入以下接口!)第三步:编写前端页面:测试接口——响应OK!(2)使用WebSocket:(3)聊天室的聊天功能的最终实现:第一步:战前准备第二
为什么学习Web前端一定要掌握JavaScript?
web前端学习指南
为什么学习Web前端一定要掌握JavaScript?在前端的世界里,没有什么是JavaScript实现不了的,关于JS有一句话:凡是可以用JavaScript来写的应用,最终都会用JavaScript,JavaScript可运行在所有主要平台的所有主流浏览器上,也可运行在每一个主流操作系统的服务器端上。现如今我们在为网站写任何一个主要功能的时候都需要有懂能够用JavaScript写前端的开发人员。
小架构step系列25:错误码
秋千码途
架构 java
1概述一个系统中,可能产生各种各样的错误,对这些错误进行编码。当错误发生时,通过这个错误码就有可能快速判断是什么错误,不一定需要查看代码就可以进行处理,提高问题处理效率。有了统一的错误码,还可以标准化错误信息,方便把错误信息纳入文档管理和对错误信息进行国际化等。没有错误码的管理,开发人员就会按自己的理解处理这些错误。有些直接把堆栈直接反馈到前端页面上,使用看不懂这些信息体验很差,也暴露了堆栈信息有
Java朴实无华按天计划从入门到实战(强化速战版-66天)
岫珩
Java 后端 java 开发语言 学习 Java 时间安排 学习计划
致敬读者感谢阅读笑口常开生日快乐⬛早点睡觉博主相关博主信息博客首页专栏推荐活动信息文章目录Java朴实无华按天计划从入门到实战(强化速战版-66天)1.基础(18)1.1JavaSE核心(5天)1.2数据库与SQL(5天)1.3前端基础(8天)2.进阶(17天)2.1JavaWeb核心(5天)2.2Mybatis与Spring全家桶(6天)2.3中间件入门(4天)2.4实践项目(2天)3.高阶(1
《跨域资源共享CORS的深层逻辑与前端实践精要》
不同源头的资源交互已成为常态,而跨域资源共享(CORS)正是支撑这种交互的隐形架构。现代Web安全体系中平衡开放与防护的精妙设计。理解CORS的深层逻辑,不仅能解决实际开发中的跨域难题,更能触及网络安全与资源流通的核心矛盾,为前端工程师构建稳健的应用提供底层认知支撑。跨域资源共享的诞生,源于网络安全与应用发展的必然冲突。浏览器的同源策略,作为早期网络安全的基石,通过限制不同源文档的交互,有效阻挡了
深入了解 Kubernetes(k8s):从概念到实践
目录一、k8s核心概念二、k8s的优势三、k8s架构组件控制平面组件节点组件四、k8s+docker运行前后端分离项目的例子1.准备前端项目2.准备后端项目3.创建k8s部署配置文件4.部署应用到k8s集群在当今云计算和容器化技术飞速发展的时代,Kubernetes(简称k8s)已成为容器编排领域的事实标准。无论是互联网巨头、传统企业还是初创公司,都在广泛采用k8s来管理和部署容器化应用。本文将带
Vue CSR 到 Nuxt 3 SSR 迁移:技术实现与问题解决实录
二倍速播放
前端 vue.js
1.迁移动机与技术选型1.1CSR架构的局限性基于Vue3和Vite构建的客户端渲染(CSR)单页应用(SPA)提供了良好的开发体验和用户交互流畅性。但是其核心局限在于:搜索引擎优化(SEO):初始HTML响应仅包含一个根div元素,实际内容由JavaScript在浏览器端动态生成。虽然主流搜索引擎(如Google)能够执行部分JavaScript,但其抓取效率和稳定性不如直接获取完整HTML。非
大厂都在用的前端缓存策略,你掌握了吗?
AI架构全栈开发实战笔记
前端 缓存 ai
大厂都在用的前端缓存策略,你掌握了吗?关键词:前端缓存、HTTP缓存、ServiceWorker、CDN缓存、缓存策略、性能优化、浏览器缓存摘要:本文将深入探讨前端开发中常用的缓存策略,从浏览器缓存到ServiceWorker,从HTTP缓存头到CDN缓存,全面解析大厂都在使用的高效缓存技术。通过生动的比喻和实际代码示例,帮助开发者理解并掌握这些提升Web应用性能的关键技术。背景介绍目的和范围本文
26. 什么是雪碧图,作用和原理了解吗
yqcoder
前端面试-CSS css 前端 html
总结小图合成一张,使用background来使用,减少资源请求一、什么是雪碧图?雪碧图(CSSSprite)是一种前端优化技术,指的是将多个小图标合并成一张大图,通过CSS控制显示其中的某一部分。它常用于网站中图标、按钮等小图较多的场景。二、雪碧图的作用作用说明✅减少HTTP请求次数合并多个图片为一张图,减少请求资源数✅提升页面加载速度尤其在图片较多时效果明显✅避免图片加载闪烁鼠标悬停切换图片时不
12. 什么是事件委托
yqcoder
前端面试-CSS css 面试
总结事件委托(EventDelegation)是JavaScript中一种重要的事件处理机制,它利用了事件冒泡的特性,将事件的处理程序绑定到父元素或祖先元素上,而不是直接绑定到具体的子元素上。什么是事件委托?事件冒泡:在DOM中,事件通常会从触发元素开始,然后逐级向上冒泡到其父元素、祖先元素,直到window对象。核心思想:事件委托的核心思想是利用事件冒泡机制,在父元素上监听事件,而不是在每个子元
H5UI微信小程序前端框架实战指南
ai
本文还有配套的精品资源,点击获取简介:H5UI是一个为微信小程序开发设计的前端框架,基于H5技术,提供简洁高效的组件库。框架集成了丰富的UI元素,如按钮、表格、导航栏等,简化了界面布局和交互的实现。通过安装、引入、使用组件和事件绑定四个步骤,开发者可以轻松构建功能齐全的应用。了解性能优化等注意事项对于高效开发同样重要。1.微信小程序前端开发框架介绍微信小程序概述微信小程序是微信官方推出的一种无需下
Ubuntu安装LAMP
L_h1
测试 ubuntu linux
在安装vim时遇到了一个问题:E:无法获得锁/var/lib/dpkg/lock-frontend-open(11:资源暂时不可用)E:无法获取dpkg前端锁(/var/lib/dpkg/lock-frontend),是否有其他进程正占用它?解决办法:强制解锁sudorm/var/lib/dpkg/lock-frontendsudorm/var/cache/apt/archives/locksud
震惊!DOM变化监控神器MutationObserver,前端开发必知的隐藏武器!
coding随想
JavaScript 前端 javascript html5
一、什么是MutationObserver?如果你是一个前端开发者,一定会遇到这样的场景:页面动态加载内容后,某些操作失效了。比如,你写了一个监听按钮点击的代码,但按钮是通过AJAX动态加载的,你的代码根本无法触发。这个时候,你就需要一个“监控哨兵”——MutationObserver,它能实时监听DOM树的变化,帮你捕获那些“暗中作祟”的节点变动。MutationObserver是HTML5引入
Coze Studio 架构拆解:AI Agent 开发平台项目结构全分析
代码简单说
2025开发必备(限时特惠) 架构 人工智能 Coze Studio 架构 AI Agent 开发平台 全栈 AI 工程化 图解架构
CozeStudio架构拆解:AIAgent开发平台项目结构全分析标签:CozeStudio项目架构、领域驱动设计DDD、全栈开发规范、Hertz框架、前后端协作、云原生容器、前端测试、IDL接口设计、微服务解耦、AI开发平台源码分析在最近研究AIAgent开发平台的过程中,我深入分析了刚刚开源的CozeStudio项目。这套系统是国内少有的开源全栈AI工程化项目,代码整洁、架构先进,特别是它基于
关于前端的性能优化
性能优化主要涵盖了以下四个方面:(tip:仅代表个人总结,如有不当,还希望看到的大佬多多指示)减少网络请求:合并文件、使用CDN、启用缓存。优化资源加载:代码分割、懒加载、图片压缩。提升渲染性能:减少重绘回流、防抖节流、使用WebWorker。监控和迭代:定期使用工具检测性能,持续优化。一、网络层面优化减少HTTP请求合并文件:将多个CSS或JavaScript文件合并成一个,减少请求次数。使用C
时间组件库Day.js那些事
前端小白花
javascript 开发语言 ecmascript
一、简介1.什么是Day.jsDay.js是一个轻量级,易于使用的JavaScript日期库,提供了强大的日期和时间处理功能,与Moment.js的API设计相似,但具有更高的性能和更小的体积。Day.js官网https://day.js.org/docs/zh-CN/installation/installation2.优势a.特点轻量级:Dayjs的压缩后大小只有2KB左右,远小于Moment
JavaScript正则表达式去除括号但保留内容与去除括号与内容
Selicens
javascript 正则表达式
项目上碰到一个需求,是取多个递增文件的文件名,类似于test(1).txt、test(2).txt,但是不需要括号,只要test1、test2这种格式,最开始想到的办法就是js里的replace替换,先上一个比较笨但是也能实现效果的例子letname="test(1).txt"letdata=name.split('.')[0].replace('(','').replace(')','')con
linux网卡显示未知未托管,linux有线网络显示设备未托管
NetworkManagerNetworkManager是为了使网络配置尽可能简单而开发的网络管理软件包,如果使用DHCP,NetworkManager会替换默认的路由表、从DHCP服务器获取IP地址并根据情况设置域名服务器,NetworkManager的目标是使网络能够开箱即用。NetworkManager由两部分组成:一个以超级用户运行的守护进程(network-manager);一个前端管理
页面开发样式和布局入门:Vite + Vue 3 + Less
页面开发样式和布局入门:Vite+Vue3+Less引言在现代前端开发中,样式和布局是页面开发的核心部分。随着技术的不断发展,Vite、Vue3和Less等工具和框架的出现,使得前端开发变得更加高效和灵活。然而,尽管这些工具和框架提供了强大的功能,但在实际开发中仍然会遇到各种样式和布局的问题。本文将结合Vite、Vue3和Less,详细介绍在页面开发中常见的样式和布局问题,并提供解决方案和最佳实践
推客系统小程序机构版开发上线全攻略(2025年最新版)
vx_qutudy
推客小程序 推客系统开发 推客系统源码
一、开发前准备:筑牢基础,合规先行1.1注册与认证账号注册:登录微信公众平台注册小程序账号,选择“机构版”类型,获取唯一AppID。资质认证:基础资质:企业营业执照、法人身份证、对公账户信息。特殊资质:涉及支付功能:需办理《增值电信业务经营许可证》(ICP证)。涉及教育/医疗内容:需《互联网信息服务许可证》或相关行业资质。1.2技术选型:高效与扩展并重模块推荐方案前端框架微信原生框架(WXML+W
网络安全第14集
不灭锦鲤
web安全 安全
前言:小迪安全14集,这集重点内容:0、什么是js渗透测试?在javascript中也存在变量和函数,存在可控变量和函数就有可能存在在漏洞,js开发的web应用和php、java开发的区别是,js能看得到的源代码,php看不到,但是风险就是未授权访问、配置信息泄露(加密算法、key秘钥等),源代码看得到,存在更多的url泄露,从而可能会出现未授权访问,从url,前提:web应用可以采用前端语言或后
25年不倒的“犀牛书“:为什么《JavaScript权威指南第7版》仍是程序员的案头圣经?
阿蒙Armon
javascript 开发语言 ecmascript
25年不倒的"犀牛书":为什么《JavaScript权威指南第7版》仍是程序员的案头圣经?当一本技术书能连续畅销25年,历经7次迭代仍稳坐领域第一梯队,它必然藏着超越时代的硬实力。《JavaScript权威指南(原书第7版)》就是这样一部传奇——豆瓣9.4分的封神之作,程序员口中的"犀牛书",从网景时代到ES2020,它始终是JavaScript开发者的终极参考书。如果你还在为原型链、闭包、异步编
Dom
周华华
JavaScript html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml&q
【Spark九十六】RDD API之combineByKey
bit1129
spark
1. combineByKey函数的运行机制
RDD提供了很多针对元素类型为(K,V)的API,这些API封装在PairRDDFunctions类中,通过Scala隐式转换使用。这些API实现上是借助于combineByKey实现的。combineByKey函数本身也是RDD开放给Spark开发人员使用的API之一
首先看一下combineByKey的方法说明:
msyql设置密码报错:ERROR 1372 (HY000): 解决方法详解
daizj
mysql 设置密码
MySql给用户设置权限同时指定访问密码时,会提示如下错误:
ERROR 1372 (HY000): Password hash should be a 41-digit hexadecimal number;
问题原因:你输入的密码是明文。不允许这么输入。
解决办法:用select password('你想输入的密码');查询出你的密码对应的字符串,
然后
路漫漫其修远兮 吾将上下而求索
周凡杨
学习 思索
王国维在他的《人间词话》中曾经概括了为学的三种境界古今之成大事业、大学问者,罔不经过三种之境界。“昨夜西风凋碧树。独上高楼,望尽天涯路。”此第一境界也。“衣带渐宽终不悔,为伊消得人憔悴。”此第二境界也。“众里寻他千百度,蓦然回首,那人却在灯火阑珊处。”此第三境界也。学习技术,这也是你必须经历的三种境界。第一层境界是说,学习的路是漫漫的,你必须做好充分的思想准备,如果半途而废还不如不要开始。这里,注
Hadoop(二)对话单的操作
朱辉辉33
hadoop
Debug:
1、
A = LOAD '/user/hue/task.txt' USING PigStorage(' ')
AS (col1,col2,col3);
DUMP A;
//输出结果前几行示例:
(>ggsnPDPRecord(21),,)
(-->recordType(0),,)
(-->networkInitiation(1),,)
web报表工具FineReport常用函数的用法总结(日期和时间函数)
老A不折腾
finereport 报表工具 web开发
web报表工具FineReport常用函数的用法总结(日期和时间函数)
说明:凡函数中以日期作为参数因子的,其中日期的形式都必须是yy/mm/dd。而且必须用英文环境下双引号(" ")引用。
DATE
DATE(year,month,day):返回一个表示某一特定日期的系列数。
Year:代表年,可为一到四位数。
Month:代表月份。
c++ 宏定义中的##操作符
墙头上一根草
C++
#与##在宏定义中的--宏展开 #include <stdio.h> #define f(a,b) a##b #define g(a) #a #define h(a) g(a) int main() { &nbs
分析Spring源代码之,DI的实现
aijuans
spring DI 现 源代码
(转)
分析Spring源代码之,DI的实现
2012/1/3 by tony
接着上次的讲,以下这个sample
[java]
view plain
copy
print
for循环的进化
alxw4616
JavaScript
// for循环的进化
// 菜鸟
for (var i = 0; i < Things.length ; i++) {
// Things[i]
}
// 老鸟
for (var i = 0, len = Things.length; i < len; i++) {
// Things[i]
}
// 大师
for (var i = Things.le
网络编程Socket和ServerSocket简单的使用
百合不是茶
网络编程基础 IP地址端口
网络编程;TCP/IP协议
网络:实现计算机之间的信息共享,数据资源的交换
协议:数据交换需要遵守的一种协议,按照约定的数据格式等写出去
端口:用于计算机之间的通信
每运行一个程序,系统会分配一个编号给该程序,作为和外界交换数据的唯一标识
0~65535
查看被使用的
JDK1.5 生产消费者
bijian1013
java thread 生产消费者 java多线程
ArrayBlockingQueue:
一个由数组支持的有界阻塞队列。此队列按 FIFO(先进先出)原则对元素进行排序。队列的头部 是在队列中存在时间最长的元素。队列的尾部 是在队列中存在时间最短的元素。新元素插入到队列的尾部,队列检索操作则是从队列头部开始获得元素。
ArrayBlockingQueue的常用方法:
JAVA版身份证获取性别、出生日期及年龄
bijian1013
java 性别 出生日期 年龄
工作中需要根据身份证获取性别、出生日期及年龄,且要还要支持15位长度的身份证号码,网上搜索了一下,经过测试好像多少存在点问题,干脆自已写一个。
CertificateNo.java
package com.bijian.study;
import java.util.Calendar;
import
【Java范型六】范型与枚举
bit1129
java
首先,枚举类型的定义不能带有类型参数,所以,不能把枚举类型定义为范型枚举类,例如下面的枚举类定义是有编译错的
public enum EnumGenerics<T> { //编译错,提示枚举不能带有范型参数
OK, ERROR;
public <T> T get(T type) {
return null;
【Nginx五】Nginx常用日志格式含义
bit1129
nginx
1. log_format
1.1 log_format指令用于指定日志的格式,格式:
log_format name(格式名称) type(格式样式)
1.2 如下是一个常用的Nginx日志格式:
log_format main '[$time_local]|$request_time|$status|$body_bytes
Lua 语言 15 分钟快速入门
ronin47
lua 基础
-
-
单行注释
-
-
[[
[多行注释]
-
-
]]
-
-
-
-
-
-
-
-
-
-
-
1.
变量 & 控制流
-
-
-
-
-
-
-
-
-
-
num
=
23
-
-
数字都是双精度
str
=
'aspythonstring'
java-35.求一个矩阵中最大的二维矩阵 ( 元素和最大 )
bylijinnan
java
the idea is from:
http://blog.csdn.net/zhanxinhang/article/details/6731134
public class MaxSubMatrix {
/**see http://blog.csdn.net/zhanxinhang/article/details/6731134
* Q35
求一个矩阵中最大的二维
mongoDB文档型数据库特点
开窍的石头
mongoDB文档型数据库特点
MongoDD: 文档型数据库存储的是Bson文档-->json的二进制
特点:内部是执行引擎是js解释器,把文档转成Bson结构,在查询时转换成js对象。
mongoDB传统型数据库对比
传统类型数据库:结构化数据,定好了表结构后每一个内容符合表结构的。也就是说每一行每一列的数据都是一样的
文档型数据库:不用定好数据结构,
[毕业季节]欢迎广大毕业生加入JAVA程序员的行列
comsci
java
一年一度的毕业季来临了。。。。。。。。
正在投简历的学弟学妹们。。。如果觉得学校推荐的单位和公司不适合自己的兴趣和专业,可以考虑来我们软件行业,做一名职业程序员。。。
软件行业的开发工具中,对初学者最友好的就是JAVA语言了,网络上不仅仅有大量的
PHP操作Excel – PHPExcel 基本用法详解
cuiyadll
PHP Excel
导出excel属性设置//Include classrequire_once('Classes/PHPExcel.php');require_once('Classes/PHPExcel/Writer/Excel2007.php');$objPHPExcel = new PHPExcel();//Set properties 设置文件属性$objPHPExcel->getProperties
IBM Webshpere MQ Client User Issue (MCAUSER)
darrenzhu
IBM jms user MQ MCAUSER
IBM MQ JMS Client去连接远端MQ Server的时候,需要提供User和Password吗?
答案是根据情况而定,取决于所定义的Channel里面的属性Message channel agent user identifier (MCAUSER)的设置。
http://stackoverflow.com/questions/20209429/how-mca-user-i
网线的接法
dcj3sjt126com
一、PC连HUB (直连线)A端:(标准568B):白橙,橙,白绿,蓝,白蓝,绿,白棕,棕。 B端:(标准568B):白橙,橙,白绿,蓝,白蓝,绿,白棕,棕。 二、PC连PC (交叉线)A端:(568A): 白绿,绿,白橙,蓝,白蓝,橙,白棕,棕; B端:(标准568B):白橙,橙,白绿,蓝,白蓝,绿,白棕,棕。 三、HUB连HUB&nb
Vimium插件让键盘党像操作Vim一样操作Chrome
dcj3sjt126com
chrome vim
什么是键盘党?
键盘党是指尽可能将所有电脑操作用键盘来完成,而不去动鼠标的人。鼠标应该说是新手们的最爱,很直观,指哪点哪,很听话!不过常常使用电脑的人,如果一直使用鼠标的话,手会发酸,因为操作鼠标的时候,手臂不是在一个自然的状态,臂肌会处于绷紧状态。而使用键盘则双手是放松状态,只有手指在动。而且尽量少的从鼠标移动到键盘来回操作,也省不少事。
在chrome里安装 vimium 插件
MongoDB查询(2)——数组查询[六]
eksliang
mongodb MongoDB查询数组
MongoDB查询数组
转载请出自出处:http://eksliang.iteye.com/blog/2177292 一、概述
MongoDB查询数组与查询标量值是一样的,例如,有一个水果列表,如下所示:
> db.food.find()
{ "_id" : "001", "fruits" : [ "苹
cordova读写文件(1)
gundumw100
JavaScript Cordova
使用cordova可以很方便的在手机sdcard中读写文件。
首先需要安装cordova插件:file
命令为:
cordova plugin add org.apache.cordova.file
然后就可以读写文件了,这里我先是写入一个文件,具体的JS代码为:
var datas=null;//datas need write
var directory=&
HTML5 FormData 进行文件jquery ajax 上传 到又拍云
ileson
jquery Ajax html5 FormData
html5 新东西:FormData 可以提交二进制数据。
页面test.html
<!DOCTYPE>
<html>
<head>
<title> formdata file jquery ajax upload</title>
</head>
<body>
<
swift appearanceWhenContainedIn:(version1.2 xcode6.4)
啸笑天
version
swift1.2中没有oc中对应的方法:
+ (instancetype)appearanceWhenContainedIn:(Class <UIAppearanceContainer>)ContainerClass, ... NS_REQUIRES_NIL_TERMINATION;
解决方法:
在swift项目中新建oc类如下:
#import &
java实现SMTP邮件服务器
macroli
java 编程
电子邮件传递可以由多种协议来实现。目前,在Internet 网上最流行的三种电子邮件协议是SMTP、POP3 和 IMAP,下面分别简单介绍。
◆ SMTP 协议
简单邮件传输协议(Simple Mail Transfer Protocol,SMTP)是一个运行在TCP/IP之上的协议,用它发送和接收电子邮件。SMTP 服务器在默认端口25上监听。SMTP客户使用一组简单的、基于文本的
mongodb group by having where 查询sql
qiaolevip
每天进步一点点 学习永无止境 mongo 纵观千象
SELECT cust_id,
SUM(price) as total
FROM orders
WHERE status = 'A'
GROUP BY cust_id
HAVING total > 250
db.orders.aggregate( [
{ $match: { status: 'A' } },
{
$group: {
Struts2 Pojo(六)
Luob.
POJO strust2
注意:附件中有完整案例
1.采用POJO对象的方法进行赋值和传值
2.web配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee&q
struts2步骤
wuai
struts
1、添加jar包
2、在web.xml中配置过滤器
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.st