完整的 JavaScript 实现是由以下 3 个不同部分组成的:
核心(ECMAScript)
文档对象模型(DOM) Document object model (整合js,css,html)
浏览器对象模型(BOM) Broswer object model(整合js和浏览器)
ECMA Script是一个标准,JavaScript是一种实现规则的版本。
JavaScript引入方式
<script>
// 在这里写你的JS代码
</script>
引入额外的JS文件
<script src="myscript.js"></script>
JavaScript语言规范
1. // 这是单行注释
2. /*
这是
多行注释
*/
3. JavaScript中的语句要以分号(;)为结束符。
语法
变量声明
JavaScript的变量名可以使用_,数字,字母,$组成,不能以数字开头。
声明变量使用 var 变量名; 的格式来进行声明
var name = "Alex";
var age = 18;
注意:
变量名是区分大小写的。
推荐使用驼峰式命名规则。
保留字不能用做变量名。
注意:
ES6新增了let命令,用于声明变量。其用法类似于var,但是所声明的变量只在let命令所在的代码块内有效。例如:for循环的计数器就很适合使用let命令。
for (let i=0;i<arr.length;i++){...}
ES6新增const用来声明常量。一旦声明,其值就不能改变。
const PI = 3.1415;
JS是动态语言:不需要指明数据类型
JavaScript不区分整型和浮点型,就只有一种数字类型。
还有一种NaN,表示不是一个数字(Not a Number)。
常用方法:
parseInt("123") // 返回123
parseInt("ABC") // 返回NaN,NaN属性是代表非数字值的特殊值。该属性用于指示某个值不是数字。
parseFloat("123.456") // 返回123.456
字符串(String)
var a = "Hello"
var b = "world;
var c = a + b;
console.log(c); // 得到Helloworld
常用方法:
方法 说明
.length 返回长度(语句)
.trim() 移除空白(方法)
.trimLeft() 移除左边的空白
.trimRight() 移除右边的空白
.charAt(n) 返回第n个字符
.concat(value, ...) 拼接 (后面跟多个值拼接)拼接字符串一般使用“+”
.indexOf(substring, start) 子序列位置(start是开始位置,默认0)
.substring(start, end) 根据索引获取子序列类似切片()
.slice(start, end) 切片
.toLowerCase() 小写
.toUpperCase() 大写
.split(delimiter, num) 分割(num是分割出几个数)
模板字符串
模板字符串(template string)是增强版的字符串,用反引号标识。它可以当做普通字符串使用,也可以用来定义多行字符串,或者在字符串中嵌入变量。
// 普通字符串
`这是普通字符串!`
// 多行文本
`这是多行的
文本`
// 字符串中嵌入变量
var name = "q1mi", time = "today";
`Hello ${name}, how are you ${time}?`
注意:
如果模板字符串中需要使用反引号,则在其前面要用反斜杠转义。
布尔值(Boolean)
区别于Python,true和false都是小写。
var a = true;
var b = false;
""(空字符串)、0、null、undefined、NaN都是false。
null和undefined
null表示值是空,一般在需要指定或清空一个变量时才会使用,如 name=null;
undefined表示当声明一个变量但未初始化时,该变量的默认值是undefined。还有就是函数无明确的返回值时,返回的也是undefined。
null表示变量的值是空,undefined则表示只声明了变量,但还没有赋值
对象(Object)
JavaScript 中的所有事物都是对象:字符串、数值、数组、函数...此外,JavaScript 允许自定义对象。
JavaScript 提供多个内建对象,比如 String、Date、Array 等等。
对象只是带有属性和方法的特殊数据类型。
数组(Array)
数组对象的作用是:使用单独的变量名来存储一系列的值。类似于Python中的列表。
var a = [123, "ABC"];
console.log(a[1]); // 输出"ABC"
常用方法:
方法 说明
.length 数组的大小
.push(ele) 尾部追加元素
.pop() 获取尾部的元素
.unshift(ele) 头部插入元素
.shift() 头部移除元素
.slice(start, end) 切片
.reverse() 反转
.join(seq) 将数组元素连接成字符串
.concat(val, ...) 连接数组
.sort() 排序
.forEach() 将数组的每个元素传递给回调函数
.splice() 删除元素,并向数组添加新元素。
.map() 返回一个数组元素调用函数处理后的值的新数组
splice()语法:
语法:
splice(index,howmany,item1,.....,itemX)
.sort()是按支付编码排序,需要制定函数,才按大小排序
function sortNumber(a,b){
return a - b
}
var arr1 = [11, 100, 22, 55, 33, 44]
arr1.sort(sortNumber)
.splice(x,y,z...)删除数组中x元素,删y个,添加z...元素
遍历一个数组;
var a = [10, 20, 30, 40];
for (var i=0;i<a.length;i++) {
console.log(a[i]);
}
- Array(数组)
var a1 = [11, 22, 33] - 自定义对象
{name: '夏雨豪', age: 9000,, 'hobby': '戴帽子'}
Symbol
ES6新引入了一种新的原始数据类型(Symbol),表示独一无二的值。它是JavaScript语言的第7种数据类型。
类型查询(typeof)
typeof是一个一元运算符(就像++,--,!,- 等一元运算符),不是一个函数,也不是一个语句。
typeof "abc" // "string"
typeof null // "object"
typeof true // "boolean"
typeof 123 // "number"
运算符:
算术:+ - * / % ++ --
比较:> >= < <= != == === !==
逻辑:&& || !
赋值:= += -= *= /=
强等于:===
弱等于:== (不区分数据类型)
流程控制
if-else:(双分支)
var a = 10;
if (a > 5){
console.log("yes");
}else {
console.log("no");
}
if-else if-else:(多分支)
var a = 10;
if (a > 5){
console.log("a > 5");
}else if (a < 5) {
console.log("a < 5");
}else {
console.log("a = 5");
}
switch:
default(没有条件满足,就执行这个语句)
break语句,条件满足终止switch语句
var day = 5;
switch(day){
case 0:
console.log('不是0');
break;
case 1:
console.log('不是1');
break;
case 5:
console.log('yes');
break;
default:
console.log('...');
};
for
for (var i=0;i<10;i++) {
console.log(i);
}
---死循环
for (;;){
conlose.log('戴帽子')
}
while
var i = 0;
while (i < 10) {
console.log(i);
i++;
}
三元运算
var a = 1;
var b = 2;
var c = a > b ? a:b;
函数
arguments.length:函数参数跟踪返回输入了几个参数
函数定义
function 函数名(参数...){
代码块
console.log(arguments); // 内置的arguments对象
return 返回值
}
匿名函数:多用于回调函数中(和别的函数配合使用)
var sum = function(a, b){
return a + b;
}
立即执行函数(匿名函数的一种,python中也能这么用)
(function(a, b){
return a + b;
})(1, 2);
箭头函数(匿名函数的简写)
var 变量名=参数=>返回值
//相当于---
var 变量名=function(参数){
return 返回值
}
var 函数名=(无参数)=>返回值
注意事项:
1. 参数:传多、传少、不传都不会报错,没有传值的相当于传了undefined
2. 返回值:如果返回多个值,默认只返回最后一个
3. 函数只能返回一个值,如果要返回多个值,只能将其放在数组或对象中返回。
函数的全局变量和局部变量
局部变量:同python,只能在函数内部使用
全局变量:同python,网页上的所有脚本和函数都能访问它。
变量生存周期:
局部变量会在函数运行以后被删除。
全局变量会在页面关闭后被删除。
作用域:
在函数内部查找变量,找不到则到外层函数查找,逐步找到最外层。
闭包:
var city = "BeiJing";
function f(){
var city = "ShangHai";
function inner(){
console.log(city);
}
return inner;
}
var ret = f();
ret();
先在局部空间找,在到全局名称空间
var city = "BeiJing";
function Bar() {
console.log(city);
}
function f() {
var city = "ShangHai";
function Bar() {
console.log(city);
}
return Bar;
}
var ret = f();
ret();
结果:ShangHai
JavaScript中在调用函数的那一瞬间,会先进行词法分析。
AO对象:
函数内部无论是使用参数还是使用局部变量都到AO上找。
1.函数参数,有参数,则AO.参数名=undefined,没有不做任何操作
2.变量声明,如果AO上有同名的值,则不做任何操作。如果没有,则将此变量赋值给AO,并且值为undefined。
3:函数声明,如果AO上有,则会将AO上的对象覆盖。如果没有,则不做任何操作。
var age = 18;
function foo(){
console.log(age);
var age = 22;
console.log(age);
function age(){
console.log("呵呵");
}
console.log(age);
}
foo(); // 执行后的结果是?
词法分析过程:
1、分析参数,有一个参数,形成一个 AO.age=undefine;
2、分析变量声明,有一个 var age, 发现 AO 上面已经有一个 AO.age,因此不做任何处理
3、分析函数声明,有一个 function age(){...} 声明, 则把原有的 age 覆盖成 AO.age=function(){...};
最终,AO上的属性只有一个age,并且值为一个函数声明
执行过程:
注意:执行过程中所有的值都是从AO对象上去寻找
1、执行第一个 console.log(age) 时,此时的 AO.age 是一个函数,所以第一个输出的一个函数
2、这句 var age=22; 是对 AO.age 的属性赋值, 此时AO.age=22 ,所以在第二个输出的是 2
3、同理第三个输出的还是22, 因为中间再没有改变age值的语句了
内置对象和方法
var name = '何青松'
var name = String(‘何青松’)
typeof name ===》都是string
var name1 = new String(‘何青松’);就是一个对象(S要大写)
typeof name ===》object
var name1 = new String('何青松');
undefined
name1
String {"何青松"}0: "何"1: "青"2: "松"length: 3__proto__: String[[PrimitiveValue]]: "何青松"
自定义对象
JavaScript的对象(Object)本质上是键值对的集合(Hash结构),但是只能用字符串作为键。
BUT:
ES6中提供了Map数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当做键。
也就是说,Object结构提供了“字符串--值”的对应,Map结构提供了“值--值”的对应,是一种更完善的Hash结构实现。
取对象中的属性
var a = {"name": "Alex", "age": 18};
console.log(a.name);
console.log(a["age"]);
遍历对象中的内容:
var a = {"name": "Alex", "age": 18};
for (var i in a){
console.log(i, a[i]);
}
在JavaScript中,对象是拥有属性和方法的数据。
// 面向对象,ES5中没有类的概念
// 构造函数,首字母大写
function Person(name) {
this.name = name
}
// 给人加统一的方法
Person.prototype.dream = function () {
console.log(this.name + '梦想是:不上班!');
};
// 使用new关键字进行实例化
var p1 = new Person('夏雨豪');
console.log(p1.name);
p1.dream();
对象属性的set get has delete
var m = new Map();
var o = {p: "Hello World"}
m.set(o, "content"}
m.get(o) // "content"
m.has(o) // true
m.delete(o) // true
m.has(o) // false
Date对象
//方法1:不指定参数
var d1 = new Date();
console.log(d1.toLocaleString());
//方法2:参数为日期字符串
var d2 = new Date("2004/3/20 11:12");
console.log(d2.toLocaleString());
var d3 = new Date("04/03/20 11:12");
console.log(d3.toLocaleString());
//方法3:参数为毫秒数
var d3 = new Date(5000);
console.log(d3.toLocaleString());
console.log(d3.toUTCString());
//方法4:参数为年月日小时分钟秒毫秒
var d4 = new Date(2004,2,20,11,12,0,300);
console.log(d4.toLocaleString()); //毫秒并不直接显示
Date对象的方法:
var d = new Date();
//getDate() 获取日
//getDay () 获取星期(0-6)
//getMonth () 获取月(0-11)
//getFullYear () 获取完整年份
//getHours () 获取小时
//getMinutes () 获取分钟
//getSeconds () 获取秒
//getMilliseconds () 获取毫秒
//getTime () 返回累计毫秒数(从1970/1/1午夜)
JSON对象
var str1 = '{"name": "Alex", "age": 18}';
var obj1 = {"name": "Alex", "age": 18};
// JSON字符串转换成对象
var obj = JSON.parse(str1);
// 对象转换成JSON字符串
var str = JSON.stringify(obj1);
RegExp对象
//RegExp对象
//创建正则对象方式1
// 参数1 正则表达式(不能有空格)
// 参数2 匹配模式:常用g(全局匹配;找到所有匹配,而不是在第一个匹配后停止)和i(忽略大小写)
// 用户名只能是英文字母、数字和_,并且首字母必须是英文字母。长度最短不能少于6位 最长不能超过12位。
// 创建RegExp对象方式(逗号后面不要加空格)
var reg1 = new RegExp("^[a-zA-Z][a-zA-Z0-9_]{5,11}$");
// 匹配响应的字符串
var s1 = "bc123";
//RegExp对象的test方法,测试一个字符串是否符合对应的正则规则,返回值是true或false。
reg1.test(s1); // true
// 创建方式2
// /填写正则表达式/匹配模式(逗号后面不要加空格)
var reg2 = /^[a-zA-Z][a-zA-Z0-9_]{5,11}$/;
reg2.test(s1); // true
// String对象与正则结合的4个方法
var s2 = "hello world";
s2.match(/o/g); // ["o", "o"] 查找字符串中 符合正则 的内容
s2.search(/h/g); // 0 查找字符串中符合正则表达式的内容位置
s2.split(/o/g); // ["hell", " w", "rld"] 按照正则表达式对字符串进行切割
s2.replace(/o/g, "s"); // "hells wsrld" 对字符串按照正则进行替换
// 关于匹配模式:g和i的简单示例
var s1 = "name:Alex age:18";
s1.replace(/a/, "哈哈哈"); // "n哈哈哈me:Alex age:18"
s1.replace(/a/g, "哈哈哈"); // "n哈哈哈me:Alex 哈哈哈ge:18" 全局匹配
s1.replace(/a/gi, "哈哈哈"); // "n哈哈哈me:哈哈哈lex 哈哈哈ge:18" 不区分大小写
// 注意事项1:
// 如果regExpObject带有全局标志g,test()函数不是从字符串的开头开始查找,而是从属性regExpObject.lastIndex所指定的索引处开始查找。
// 该属性值默认为0,所以第一次仍然是从字符串的开头查找。
// 当找到一个匹配时,test()函数会将regExpObject.lastIndex的值改为字符串中本次匹配内容的最后一个字符的下一个索引位置。
// 当再次执行test()函数时,将会从该索引位置处开始查找,从而找到下一个匹配。
// 因此,当我们使用test()函数执行了一次匹配之后,如果想要重新使用test()函数从头开始查找,则需要手动将regExpObject.lastIndex的值重置为 0。
// 如果test()函数再也找不到可以匹配的文本时,该函数会自动把regExpObject.lastIndex属性重置为 0。
var reg3 = /foo/g;
// 此时 regex.lastIndex=0
reg3.test('foo'); // 返回true
// 此时 regex.lastIndex=3
reg3.test('xxxfoo'); // 还是返回true
// 所以我们在使用test()方法校验一个字符串是否完全匹配时,一定要加上^和$符号。
// 注意事项2(说出来你可能不信系列):
// 当我们不加参数调用RegExpObj.test()方法时, 相当于执行RegExpObj.test("undefined"), 并且/undefined/.test()默认返回true。
var reg4 = /^undefined$/;
reg4.test(); // 返回true
reg4.test(undefined); // 返回true
reg4.test("undefined"); // 返回true
Math对象
abs(x) 返回数的绝对值。
exp(x) 返回 e 的指数。
floor(x) 对数进行下舍入。
log(x) 返回数的自然对数(底为e)。
max(x,y) 返回 x 和 y 中的最高值。
min(x,y) 返回 x 和 y 中的最低值。
pow(x,y) 返回 x 的 y 次幂。
random() 返回 0 ~ 1 之间的随机数。
round(x) 把数四舍五入为最接近的整数。
sin(x) 返回数的正弦。
sqrt(x) 返回数的平方根。
tan(x) 返回角的正切。
JS中没有模块概念,函数可以从不同的文件共享内存,执行从文件导入先后顺序(从上到下,一个文件一个文件的执行,在前面执行的文件中没有的变量不会再后面的文件中取值)
总结:
2. 函数
1. 函数的定义(3种)
1. 基本的函数
function foo(x,y){
return x + y
}
2. 匿名函数:多用于和其他的函数/方法搭配使用
function(x,y){
return x + y
}
3. 立即执行函数: JS种没有模块的概念,多通过立即执行函数实现变量的私有
(function(x,y){
return x + y
})(10, 20);
2. 函数的注意事项:
1. 参数: 少传、不传、不传都不报错,不传或者少传时对应的形参都是undefined
2. 返回值:如果返回多个值得话,默认只会返回最后一个。可以将多个返回值包在数组中
3. JS内置对象和方法
1. 对象的概念
1. 创建对象用new关键字
2. JS中的构造函数
function Person(name){
this.name = name
}
Person.protoType.dream = function(){}
3. JS中一切皆对象
2. Date对象
1. new Date()
2. 内置方法
3. JSON
1. JSON.parse() 字符串 -> JS中的数据类型
2. JSON.stringify JS中的数据类型 -> 字符串
4. RegExp
1. 两种创建方法
1. new RegExp(正则表达式)
2. /正则表达式/
2. 三个坑
1. /^[a-zA-Z][a-zA-Z0-9]$/.test() 不传值,相当于传了undeined,内部当成'undeinfed'处理
2. JS中正则表达式中间不能出现空格
3. 两种匹配模式g和i
1. g:全局匹配-> lastIndex属性会记录下一次匹配的开始位置
2. i: 忽略大小写
5. Math
1. Math.abs()
2。。。
作业
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
// 把当前的时间输出成 2018-10-16 09:22 星期二
function f() {
var weekMap = {
1: '星期一',
2: '星期二',
3: '星期三',
4: '星期四',
5: '星期五',
6: '星期六',
0: '星期日',
};
var now = new Date();
var year = now.getFullYear();
var month = now.getMonth() + 1; // 0~11
var day = now.getDate();
var hour = now.getHours();
var minute = now.getMinutes();
var week = now.getDay(); // 0~6
// 字符串拼接
var msg = year + '-' + month + '-' + day + ' ' + hour + ':' + minute + ' ' + weekMap[week]
// ES6 模板字符串
var msg1 = `${year}-${month}-${day} ${hour}:${minute} ${weekMap[week]}`;
console.log(msg);
console.log(msg1);
}
f()
</script>
</head>
<body>
</body>
</html>
BOM和DOM
JavaScript分为 ECMAScript,DOM,BOM。
BOM(Browser Object Model)是指浏览器对象模型,它使 JavaScript 有能力与浏览器进行“对话”。
DOM (Document Object Model)是指文档对象模型,通过它,可以访问HTML文档的所有元素。
Window对象是客户端JavaScript最高层对象之一,由于window对象是其它大部分对象的共同祖先,在调用window对象的方法和属性时,可以省略window对象的引用。
例如:window.document.write()可以简写成:document.write()。
window对象:
所有 JavaScript 全局对象、函数以及变量均自动成为 window 对象的成员。
全局变量是 window 对象的属性。全局函数是 window 对象的方法。
接下来要讲的HTML DOM 的 document 也是 window 对象的属性之一。
常用的Window方法:
window.innerHeight - 浏览器窗口的内部高度
window.innerWidth - 浏览器窗口的内部宽度
window.open() - 打开新窗口
window.close() - 关闭当前窗口
window的子对象
navigator对象
navigator.appName // Web浏览器全称
navigator.appVersion // Web浏览器厂商和版本的详细字符串
navigator.userAgent // 客户端绝大部分信息
navigator.platform // 浏览器运行所在的操作系统
screen对象
screen.availWidth - 可用的屏幕宽度
screen.availHeight - 可用的屏幕高度
history对象
window.history 对象包含浏览器的历史。
history.forward() // 前进一页
history.back() // 后退一页
location对象:
window.location 对象用于获得当前页面的地址 (URL),并把浏览器重定向到新的页面。
常用属性和方法:
location.href 获取URL
location.href="URL" // 跳转到指定页面
location.reload() 重新加载页面
弹出框
JavaScript 中创建三种消息框:警告框、确认框、提示框
警告框
alert("你看到了吗?");
确认框(确认框如果用户点击确认,那么返回值为 true。如果用户点击取消,那么返回值为 false。()
)
confirm("你确定吗?")
提示框(如果用户点击确认,那么返回值为输入的值。如果用户点击取消,那么返回值为 null。)
prompt("请在下方输入","你的答案")
计时相关:(函数自动执行无需调用)
setTimeout()
通过使用 JavaScript,我们可以在一定时间间隔之后来执行代码,而不是在函数被调用后立即执行。我们称之为计时事件。
语法:
第二个参数指示从当前起多少毫秒后执行第一个参数(1000 毫秒等于一秒)。
var t=setTimeout("JS语句",毫秒)
clearTimeout()
语法:
clearTimeout(setTimeout_variable)
举个例子:
// 在指定时间之后执行一次相应函数
var timer = setTimeout(function(){alert(123);}, 3000)
// 取消setTimeout设置
clearTimeout(timer);
setInterval()
setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭。由 setInterval() 返回的 ID 值可用作 clearInterval() 方法的参数。
语法:
setInterval("JS语句",时间间隔)
setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式
clearInterval():
clearInterval() 方法可取消由 setInterval() 设置的 timeout。
clearInterval() 方法的参数必须是由 setInterval() 返回的 ID 值。
语法:
clearInterval(setinterval返回的ID值)
举个例子:
// 每隔一段时间就执行一次相应函数
var timer = setInterval(function(){console.log(123);}, 3000)
// 取消setInterval设置
clearInterval(timer);
DOM:
DOM(Document Object Model)是一套对文档的内容进行抽象和概念化的方法。
HTML DOM 树
DOM标准规定HTML文档中的每个成分都是一个节点(node):
文档节点(document对象):代表整个文档
元素节点(element 对象):代表一个元素(标签)
文本节点(text对象):代表元素(标签)中的文本
属性节点(attribute对象):代表一个属性,元素(标签)才有属性
注释是注释节点(comment对象)
JavaScript 可以通过DOM创建动态的 HTML:
JavaScript 能够改变页面中的所有 HTML 元素
JavaScript 能够改变页面中的所有 HTML 属性
JavaScript 能够改变页面中的所有 CSS 样式
JavaScript 能够对页面中的所有事件做出反应
查找标签(返回数组)
document.getElementById(‘id‘名) 根据ID获取一个标签
document.getElementsByClassName (‘类名’) 根据class属性获取
document.getElementsByTagName‘(‘标签名’) 根据标签名获取标签合集
间接查找
parentElement 父节点标签元素
children 所有子标签
firstElementChild 第一个子标签元素
lastElementChild 最后一个子标签元素
nextElementSibling 下一个兄弟标签元素
previousElementSibling 上一个兄弟标签元素
节点操作:
创建节点
语法:
createElement(标签名)
示例:
var divEle = document.createElement("div");
添加节点:
语法:
追加一个子节点(作为最后的子节点)
somenode.appendChild(newnode);
把增加的节点放到某个节点的前边。
somenode.insertBefore(newnode,某个节点);
示例:
var imgEle=document.createElement("img");
imgEle.setAttribute("src", "http://image11.m1905.cn/uploadfile/s2010/0205/20100205083613178.jpg");
var d1Ele = document.getElementById("d1");
d1Ele.appendChild(imgEle);
删除节点:
语法:
获得要删除的元素,通过父元素调用该方法删除。
somenode.removeChild(要删除的节点)
替换节点:
语法:
somenode.replaceChild(newnode, 某个节点);
属性节点
获取文本节点的值:
var divEle = document.getElementById("d1")
divEle.innerText
divEle.innerHTML
设置文本节点的值:
var divEle = document.getElementById("d1")
divEle.innerText="1"
divEle.innerHTML="<p>2</p>"
attribute操作(设置属性值)
var divEle = document.getElementById("d1");
divEle.setAttribute("age","18")
divEle.getAttribute("age")
divEle.removeAttribute("age")
// 自带的属性还可以直接.属性名来获取和设置
imgEle.src
imgEle.src="..."
获取值操作
语法:
elementNode.value
适用于以下标签:
.input
.select
.textarea
获取值
var iEle = document.getElementById("i1");
console.log(iEle.value);
var sEle = document.getElementById("s1");
console.log(sEle.value);
var tEle = document.getElementById("t1");
console.log(tEle.value);
class的操作
object.className 获取所有样式类名(字符串)
object.classList.remove(cls) 删除指定类
object.classList.add(cls) 添加类
object.classList.contains(cls) 存在返回true,否则返回false
object.classList.toggle(cls) 存在就删除,否则添加
指定CSS操作
obj.style.backgroundColor="red"
JS操作CSS属性的规律:
1.对于没有中横线的CSS属性一般直接使用style.属性名即可。如:
obj.style.margin
obj.style.width
obj.style.left
obj.style.position
2.对含有中横线的CSS属性,将中横线后面的第一个字母换成大写即可。如:
obj.style.marginTop
obj.style.borderLeftWidth
obj.style.zIndex
obj.style.fontFamily
事件
(绑定事件的方式-->两种)
网友评论