JS的导入
```python
定义:运行在浏览器上的前端脚本编程语言
作用:处理前端数据、渲染页面、修改样式、完成交互、前后台数据通信
三种导入方式:
行间式:写在标签中的事件属性
例:<!--<div id="dd" onclick="alert('hello js')"></div>-->
内联式:写在script标签中,script标签应该出现在body的最下方(可以将其放在body结束后)
例子:
<script>
dd.onclick = function () {
alert('hello js') }
</script>-->
外联式:通过script标签的src属性,链接外部js文件
例:<script src="js/js导入.js">
特别注意!
// 一个script标签拥有src引入外部js文件后,就相当于单标签,所以内部的代码会被自动屏蔽
即有了外联式,内联式将会被屏蔽!!!
```
## JS语法:
```python
let aaa = 123;
let bbb = '123';
console.log(aaa == bbb); // == 只做数据比较
console.log(aaa === bbb); // === 做数据与类型比较
// 弱语言类型:会自己根据环境决定如何选择类型存储数据
console.log(1 + 2); // 3
console.log('1' + '2'); // 12
console.log(1 + '2'); // 12
console.log(1 - '2'); // -1
```
## 数据类型:
```python
三、数据类型
值类型
1) 数字类型
let a = 123;
console.log(a, typeof(a));
a = 3.14;
console.log(a, typeof(a));
2) 布尔类型
let b = false;
console.log(typeof(b), b);
3) 字符串类型:'' "" ``
let c = '123'
// 常量声明时必须赋初值,且一旦赋值,不可改变
console.log(c, typeof(c));
4) 未定义类型:未初始化的变量
let d;
console.log(d, typeof(d));
引用类型
5) 数组(相当于list):
let arr = [1, 2, 3];
console.log(arr, typeof(arr));
6) 对象(相当于dict):所有的key必须是字符串
let sex = '男';
let dic = {
name: 'Owen',
age: 17.5,
sex, // value如果是变量,变量名与key同名,可以简写
};
console.log(dic, typeof(dic));
7) 函数类型
function fn() { }
console.log(fn, typeof(fn));
8) null类型
let x = null;
console.log(x, typeof(x));
</script>
<script>
// 二、变量与常量
let num = 123;
num++;
console.log(num);
const str = '123';
// str = '456'; // 常量声明时必须赋初值,且一旦赋值,不可改变
console.log(str);
```
三种输出信息的方式:
```python
一、三种输出信息的方式
控制台输出语句
console.log('你丫真帅')
弹出框提示信息
alert('你丫确实帅')
将内容书写到页面
document.write('<h2 style="color: red">你丫帅掉渣</h2>')
```
## 运算符:
```python
自增自减
console.log(n1);
++在前优先级最高,++在后优先级最低(比赋值符=还低)
res = n1++; // 先将n1的值赋值给res,自己再自增1
res = ++n1; // 先自己自增1, 再将n1的值赋值给res
逻辑运算符
let x = 10;
res = 0 && ++x;
console.log(res, x);
res = 100 || ++x;
console.log(res, x);
console.log(!!x);
三元运算符
// 条件 ? 结果1 : 结果2
res = 10 == '10' ? '相等' : '不等';
console.log(res);
```
## 流程控制
```python
顺序、分支、循环
if (条件) {
} else if (条件) {
} else {
}
拓展:随机数 [0, 1) => [m, n]
[0, 1) * 11 => [0, 11) parseInt() => [0, 10] + 5 => [5, 15]
[0, 1) * (n - m + 1) => [0, n - m + 1) parseInt() => [0, n - m] + m => [m, n]
公式:parseInt(Math.random() * (max - min + 1)) + min
循环
while (条件) {
循环体
}
do {
} while (条件);
for (循环变量初始化①; 循环条件②; 循环增量③) {
循环体④;
}
```
## 函数:
```python
函数的定义
function 函数名(参数列表) {
函数体;
return 返回值
}
function:定义函数的关键字
函数名:使用函数的依据,就是一个变量,可以赋值给其他变量,也可以存储在容器中,也可以作为函数的参数与返回值
参数列表:都是按位置传,形参与实参个数不需要统一,但是一定是按位赋值 (你传你的,我收我的)
函数体:完成功能的主体代码
返回值:只能返回一个值
匿名函数
function () {
// 没有名字的函数就是匿名函数
}
匿名函数自调用:一次性使用
(function (a, b) {
console.log('匿名函数自调用:', a, b)
})(10, 20, 30);
let abc = 10;
hhh.onclick = function () {
console.log(abc);
};})()
```
## 四种变量
```python
let a = 10;
const b = 20;
var c = 30;
d = 40;
console.log(a); // 有{}就不能被外界访问
console.log(b); // let和const有块级作用域,不允许重复定义
console.log(c); // var没有块级作用域, 但有局部作用域,可以重复定义
console.log(d); // 没有关键字声明的变量是全局变量,在函数内部声明的外部也可以用
```
## 字符串、数组、字典数据类型的应用:
```python
字符串
1)定义:
let ss = '123abc呵呵';
let res;
console.log(ss);
2)索引
res = ss[0];
console.log(res);
3)切片
res = ss.slice(3, 6);
console.log(res);
4)替换
res = ss.replace('abc', 'ABC');
console.log(res);
5)拆分: string => array
res = ss.split('');
console.log(res);
6) 拼接
res = ss + ss;
console.log(res);
7) 迭代
for (s of ss) {
console.log(s);
}
数组
array => string
let arr = [3, 1, 2, 4, 5];
res = arr.join(''); // 默认, | '' | '自定义符合'
console.log(res);
迭代
for (a of arr) {
console.log(a);
}
排序
arr.sort();
arr.reverse();
console.log(arr);
增删改查
console.log(arr[4]);
arr[4] = 555;
console.log(arr[4]);
arr.push(100); // 尾增
arr.unshift(200); // 头增
console.log(arr);
arr.pop(); // 尾删
arr.shift(); // 头增
console.log(arr);
重点:增删改
console.log(arr);
开始操作的索引 操作的长度 操作后的结果(不定长0~n个)
arr.splice(2, 1, 222, 333, 444);
console.log(arr);
不定长参数: ...变量名
function f(...a) {
console.log(a)
}
f(1, 2, 3, 4, 5, 6)
字典
增删改查
dic = {};
增
dic['name'] = 'owen';
dic.age = 18;
改
dic.age = 20;
// 对象的删除
delete dic.age;
console.log(dic);
查
console.log(dic.name);
字典的迭代用 for in
for (k in dic) {
console.log(k);
}//为什么这时候用dic.k不行???k是变量?
特别注意:这里不是真正意义上的字典。而是object类型!!!
```
## JS的选择器:
```python
一、js选择器:js如何与html标签建立起联系
1)
let h1 = document.getElementById('hhh');
console.log(h1);
console.log(hhh); // id是标签的唯一标识,所以js通过id名可以直接拿到标签
let h2s = document.getElementsByClassName('hh2');
let h2s = document.getElementsByTagName('h2');
console.log(h2s);
console.log(h2s[0]);
2) 同css3选择器
querySelector就是获取一个
h1 = document.querySelector('#hhh');
h1 = document.querySelector('body h1#hhh');
console.log(h1);
h21 = document.querySelector('#hhh ~ .hh2');
console.log(h21);
// querySelectorAll就是获取多个
h2s = document.querySelectorAll('#hhh ~ .hh2');
console.log(h2s);
// 优势:通过id、class或标签,都可以快速定位到某一个或某几个
h22 = document.querySelector('.hh2:nth-of-type(2)');
console.log(h22);
```
## JS操作步骤
```python
1)找目标标签
let h1 = document.querySelector('h1');
let fontSize = h1.style.fontSize;
console.log(fontSize);
标签.style.属性名 只能获取行间式!!!
getComputedStyle(ele_name, 伪类选择器通常用null填充) 能获取所有方式的样式(内联与外联叫计算后样式)
let bgColor = getComputedStyle(h1, null).backgroundColor;
console.log(bgColor);
console.log(h1.innerText);
console.log(h1.innerHTML);
console.log(h1.getAttribute('id'));
console.log(h1.getAttribute('owen'));
3)修改样式、内容、属性
h1.style.color = 'red'; // js可以直接修改样式 - 修改的是行间式
h1.style.borderRadius = '50%'; // css的 - 链接语法对应 js的 小驼峰命名法
h1.innerText = '修改过后的内容';
h1.innerHTML = '<i>修改过后的内容</i>';
h1.setAttribute('owen', 'oooooooooooooooo');
let img = document.querySelector('img');
if (Math.random() > 0.5) {
img.setAttribute('src', 'https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=255676174,1347478056&fm=26&gp=0.jpg')
} else {
img.setAttribute('src', 'https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=3706411226,1037337437&fm=26&gp=0.jpg')
}
表单内容
let inp = document.querySelector('input');
console.log(inp.value);
inp.value = 67890;
console.log(inp.getAttribute('value'));
inp.setAttribute('value', '0000000000000');
```
## 键盘、鼠标事件:
```python
为某个标签绑定事件,去控制页面中任何一个标签(绑定事件中的this就代表自身)
键盘事件
只要在窗口下,点击鼠标就可以触发
onkeydown、onkeyup、onkeypress
/*
document.onkeydown = function (ev) {
console.log(ev.keyCode);
if (ev.keyCode == 37) {
console.log('你按了左键');
} else if (ev.keyCode == 38) {
console.log('你按了上键');
}
console.log(ev.altKey);
if (ev.ctrlKey && ev.keyCode == 13) {
console.log('留言');
}
}
*/
let inp = document.querySelector('input');
inp.onkeydown = function (ev) {
console.log(ev.keyCode)
鼠标事件
let h1 = document.querySelector('h1');
onclick、ondblclick、onmouseover、onmouseleave、onmousemove、onmousedown、onmouseup
h1.onclick = function (ev) {
console.log(ev); // 包含着鼠标的相关信息
鼠标点击点
console.log(ev.clientX, ev.clientY);
特殊按键
console.log(ev.altKey, ev.ctrlKey, ev.shiftKey);
};
h2 = document.querySelector('h2');
h2.onmouseover = function () {
h1.innerText = 'h2被悬浮了';
h1.style.color = 'green';
};
h2.onmouseleave = function () {
h1.innerText = 'h2被放开了';
h1.style.color = 'red';
};
let count = 1;
h2.onmousemove = function () {
++count;
h1.innerText = '鼠标在h2身上游走' + count + '下';
this.innerText = '鼠标在h2身上游走' + count + '下';
};
```