JavaScript基础

JS简介

js也是一门编程语言(但是其内部的逻辑有很多bug, 不是很严谨)
js 也是面向对象的语言 一切皆对象
js的发展史 javascript ecmascript
主要版本 
    5.1
    6.0
JS 注释
// 单行注释
/*
多行注释1
多行注释2
*/
JS 两种引入方式
1 script 标签内部直接书写js代码
2 script 标签 src 属性引入外部 js 代码
    标准应该单独开个 js文件
js代码的书写位置
1 单独开设就是文件书写
2 还可以直接在 浏览器提供的 console 界面书写
    在浏览器书写js 的时候 左上方的清空按钮仅仅是清空当前页面
    但是代码其实还在, 最好重新开一个页面
    (推荐使用自己的html页面打开, 别人的页面可能会做一些限制)
js/python 是一门拥有动态类型的语言
name = 'zhangsan';
name = 13;
name = [1,2,3,4];
// name 可以指向任意的数据类型
但是有一些语言中, 变量名 指向一种后  后续不能更改 C Java

JS 语法结构

js 是以分号作为结束符
但是如果不写分号 问题也不大 也能够正常执行, 但是它就相当于没有结束符
变量
在 js 中首次定义个变量名的时候 需要用关键字声明

1 关键字 var
    var name = 'zhangsan'
2 es6 退出的新语法
    let name = 'zhangsan'

如果编辑器支持的版本是 5.1 那么无法使用 let
    如果是6.0 则向下兼容 var let

varlet 的区别
    varfor 循环里面定义也会影响到全局
    let 在局部定义只会在局部生效
常量
python中没有真正意义上的常量

js 是有真正意义上的常量的

const pi = 3.14

pi = 3.44   // 会报错
变量的命名规范
1 变量名只能是
    数字 字母 下划线 $
2 变量名命名规范
    js 推荐使用驼峰式命名
    python 推荐使用下划线的方式
3 变量名不能用关键字

数据类型

数值类型
var a = 11;
var b = 11.11;
typeof a ;  // 'number'

// 特殊的 NaN: 数值类型, 表示的意思是 '不是一个数字' not a number
类型转换
parseInt()
parseFloat()

parseInt('11.11') // 11     只保留小数点前面的数值
parseInt('132dasdsdasdasd')  // 132  截取数字部分 碰到字符结束转换
parseInt('jflkajd23123')   // NaN       开头就是字母 返回 NaN
字符类型
var s = "zhangsan";
undefined
typeof s    
"string"
var name = """lisi"""    // 不支持三引号
VM165:1 Uncaught SyntaxError: Unexpected string

// 模版字符串
var zhaowu = 
`
zhaowu
`
typeof zhaowu
"string"

// 模版字符串出了可以定义多行文本之外还可以实现格式化字符串的操作
var name = "zhangsan";
var age = 18;

var info = `
my name is ${name} and my age is ${age}
`
info
"my name is zhangsan and my age is 18"

var s4 =`
my name is ${jdlkajfkla}
`
// VM341:2 Uncaught ReferenceError: jdlkajfkla is not defined at <anonymous>:2:18
字符串拼接
在python 中不推荐使用 + 做拼接 join (推荐使用)
在 js 中推荐使用 + 做拼接
name + age // "zhangsan18"
字符串方法
var name = 'zhangsan'
name.length
8

var name = "   lisi  "
name.trim()
"lisi"
name.trimLeft()
"lisi  "
name.trimRight()
"   lisi"
 
name.charAt(3)
"l"
name.indexOf('l')
3

name.substring(3,5)
"li"
name.substring(0, -1)      // 识别不了 负数
""
name.slice(0,-1)            // 后面推荐使用 slice
"   lisi "

name = name.toUpperCase()
"   LISI  "
name = name.toLowerCase()
"   lisi  "

name2 = "zhangsan|lisi|wangwu|zhaoliu"
"zhangsan|lisi|wangwu|zhaoliu"
name2.split("|")
(4) ["zhangsan", "lisi", "wangwu", "zhaoliu"]
name2.split("|",2)  # 第二个参数不是限制切割字符的个数 而是 获取切割之后元素的个数
(2)["zhangsan", "lisi"]

name.concat("zhangsan", 111)    // js 是弱类型(内部会自动转换成相同的数据类型做操作)
"   lisi  zhangsan111"

python
l = [1,2,3,4]
res = "|".join(l)  # 直接报错
布尔值
1 python中布尔值是首字母大写的
    True
    Fasle
2 js 中布尔值是全小写
    true
    false
js中布尔值是 false 的类型
    空字符串, 0, null, undefined, NaN 

nullundefined

1 null
    表示值为空 一半都是指定或者清空一个变量的时候使用
    name = "zhangsan"
    name = null
2 undefined
    表示声明了一个变量 但是没有做初始化操作(没有赋值)

运算符

算术运算符
比较运算符
弱等于 内部自动转换成相同的数据类型进行比较
1 == "1"  true
1 != "1"  false
强等于  内部不做类型转换
1 === "1"  false
1 !== "1"  true
逻辑运算符
and     or      not 
&&      ||      !

eg :  
    5 && "5"    // "5"
    0 || 1      // 1
    !5  && "5"  // 5
赋值运算符
+= *= -= /=

对象

1 数组(类似于python里面的列表)  []
2 自定义对象(类似于python中的字典)  {}
数组
var l = [1,2,34]
typeof l
"object"

var l1 = [1,"zhansan", 11.111, true]
l1[1]
"zhansan"
l1[-1]  // 不支持负数索引
undefine
数组方法
var l = [1,2,3,4,5,6]
l.length        // 6
l.push(7)       // [1,2,3,4,5,6,7]
l.pop()         // [1,2,3,4,5,6]
l.unshift(7)    // (7)[7, 1, 2, 3, 4, 5, 6]
l.shift()       // (6)[1, 2, 3, 4, 5, 6]
l.slice(0,3)    // (3)[1, 2, 3]
l.reverse()     // (6)[6, 5, 4, 3, 2, 1]
l.concat(7,8,9) // (9)[6, 5, 4, 3, 2, 1, 7, 8, 9] 需要一个变量接受, 不是在原值上更改
l.sort()        // (6)[1, 2, 3, 4, 5, 6]
l.join("$")     // "1$2$3$4$5$6"  以 "$" 为分隔符 连接成一个字符串 python: print("$".join(l))
forEach方法
var ll = [111,222,333,444,555,666]
ll.forEach(function(value){console.log(value)}, ll)
        // 一个参数 就是数组中 每一个元素对象
VM887:1 111
VM887:1 222
VM887:1 333
VM887:1 444
VM887:1 555
VM887:1 666
ll.forEach(function(value, index){console.log(value, index)}, ll)
        // 两个元素  元素 + 元素索引
VM945:1 111 0
VM945:1 222 1
VM945:1 333 2
VM945:1 444 3
VM945:1 555 4
VM945:1 666 5
ll.forEach(function(value,index, arr){console.log(value,index, arr)}, ll)
        // 三个元素 元素 + 元素索引 + 元素来源
VM1047:1 111 0 (6) [111, 222, 333, 444, 555, 666]
VM1047:1 222 1 (6) [111, 222, 333, 444, 555, 666]
VM1047:1 333 2 (6) [111, 222, 333, 444, 555, 666]
VM1047:1 444 3 (6) [111, 222, 333, 444, 555, 666]
VM1047:1 555 4 (6) [111, 222, 333, 444, 555, 666]
VM1047:1 666 5 (6) [111, 222, 333, 444, 555, 666]
ll.forEach(function(value,index, arr,xxx){console.log(value,index, arr,xxx)}, ll)
        // 最多加三个元素
VM1147:1 111 0 (6) [111, 222, 333, 444, 555, 666] undefined
VM1147:1 222 1 (6) [111, 222, 333, 444, 555, 666] undefined
VM1147:1 333 2 (6) [111, 222, 333, 444, 555, 666] undefined
VM1147:1 444 3 (6) [111, 222, 333, 444, 555, 666] undefined
VM1147:1 555 4 (6) [111, 222, 333, 444, 555, 666] undefined
VM1147:1 666 5 (6) [111, 222, 333, 444, 555, 666] undefined
splice 方法
ll              // (6) [111, 222, 333, 444, 555, 666]
ll.splice(0,3)  // (3) [111, 222, 333]
    // 俩个参数 第一个是起始位置 第二个是删除的个数
ll              // (3) [444, 555, 666]
ll.splice(1,3,777)  // (2) [555, 666]
    // 第三个参数 在删除的位置添加第三个参数
ll              // 
ll.splice(0,1,[11,22,33,44,55,66])  // (2) [444, 777]
ll              // (2) [Array(6), 777]
                        0: (6) [11, 22, 33, 44, 55, 66]
                        1: 777
                        length: 2
                        __proto__: Array(0)
map 方法
var lll = [1,2,3,4,5,6,7]
undefined
lll.map(function(value){console.log(value)}, lll)
VM1630:1 1
VM1630:1 2
VM1630:1 3
VM1630:1 4
VM1630:1 5
VM1630:1 6
VM1630:1 7
(7) [undefined, undefined, undefined, undefined, undefined, undefined, undefined]

lll.map(function(value,index){console.log(value, index); return value * index}, lll)
VM1749:1 1 0
VM1749:1 2 1
VM1749:1 3 2
VM1749:1 4 3
VM1749:1 5 4
VM1749:1 6 5
VM1749:1 7 6
(7) [0, 2, 6, 12, 20, 30, 42]

lll.map(function(value,index, arr){console.log(value, index, arr); return value * index}, lll)
VM1838:1 1 0 (7) [1, 2, 3, 4, 5, 6, 7]
VM1838:1 2 1 (7) [1, 2, 3, 4, 5, 6, 7]
VM1838:1 3 2 (7) [1, 2, 3, 4, 5, 6, 7]
VM1838:1 4 3 (7) [1, 2, 3, 4, 5, 6, 7]
VM1838:1 5 4 (7) [1, 2, 3, 4, 5, 6, 7]
VM1838:1 6 5 (7) [1, 2, 3, 4, 5, 6, 7]
VM1838:1 7 6 (7) [1, 2, 3, 4, 5, 6, 7]
(7) [0, 2, 6, 12, 20, 30, 42]
自定义对象
可以看成 python 中的字典
但是 js 中的自定义对象要比 python里面的字典操作起来更加的方便
创建自定义对象
第一种创建的方式
    var d1 = {'name':'zhangsan', 'age':18};
    tpyeof d;   // "object"
    d['name']   // zhangsan
    d.name      // zhagnsan   比 python 从字典里面获取值更加的方便
    d.age       // 18
    
第二种创建的方式 需要使用关键字  new
var d2 = new Object();  // {}
d2.name = "zhangsan";
d2.age = 18
d2          // {name:"zhangsan", age:18}

for (let i in d) {
        console.log(i, d[i]);
    }   # 支持 for 循环 暴露给外界可以直接获取的也是 键
name zhangsan
age 18

流程控制

if 判断
var age = 10;
if (条件) {条件成立的之后指向的代码块}
if (age > 18){
    console.log("join college");
}else if (age > 9){
    console.log("you are too young");
}else{
    console.log("ask for your parents");
}
switch 语法
var num = 2;
switch(num){
    case 0:
        console.log("swim");
        break;
    case 1:
        console.log("sing");
        break;
    case 2:
        console.log("swing");
        break;
    case 3:
        console.log("dance");
        break;
    default:  // 条件都没有匹配 默认走的流程
        console.log("fuck off");
        break;
}
for 循环
for(let a = 0; a < 10 ; a++){
    console.log(a)j
}
for(起始条件; 循环条件; 循环结束操作){
    循环体
}
while 循环
var i = 0j
while(i < 100){
    console.log(i)j
    i++j
}
三元运算符
python 
    res = 1 if 1 > 2 else 3
js
    res = 1>2?1:3

函数

关键字
    python 
        def 
    js 
        function
格式  
    function 函数名 (形参1, 形参2, 形参3...)
        {
            函数体代码
        }
调用
    函数名()
无参函数
function funcTest(){
    console.log("hello world")
}
有参函数
function func(a,b){
    console.log(a,b)
}

func(1,2)

特殊:
    func(1,2,3,4,5,6,7) // 1, 2 传多了, 不报错, 只取需要的个数
    func(1) // 1 undefined 少了也没有关系, 没传的默认 undefined

关键字 arguments 参数列表
function func2(a,b){
    if (argument.length < 2){
        console.log("参数不足");
    else if (argument.length > 2){
        console.log("参数过多");
    }else {
        console.log("正常代码正在执行");
    }
}
函数的返回值
function index(){
    return 666,777,888,999;
}
res = index()  // 999 只获得最后一个

function index(){
    return [666,777,888,999];
}
res = index()   // (4) [666, 777, 888, 999]
// js 不支持解压赋值
匿名函数
function (){
    console.log("hhahah");
}
var res = function(){
    console.log("hahahha");
}
箭头函数
var func1 = v => v;
等价于
var func1 = function(v){
    return v;
}

var func2 = (arg1,arg2) => arg1 + arg2
等价于
var func1 = function(arg1,arg2){
    return arg1 + arg2;
}

JS 对象

date对象
let d3 = new Date()

d3.toLocaleString()

let d4 = new Date("2200/11/11 11:11:11")
d4.toLocaleString()

let d6 = new Date()
d6.getDay()         // 星期
d6.getTime()        // 时间戳
d6.getFullYear()    // 年
d6.getMonth()       // 月份 0-11
d6.getDate()        // 日
d6.getHours()       // 小时
d6.getMinutes()     // 分钟
d6.getSeconds()     // 秒
d6.getMilliseconds()// 毫秒
json对象
在python中序列化反序列化
    dumps 序列化
    loads 反序列化
在js中也有序列化和反序列化
    JSON.stringify()        dumps
    JSON.parse()            loads

let d7 = {'name':'zhangsan', 'age':18}
let res = JSON.stringify(d7)
res    			    // "{"name":"zhagnsan", "age":18}"
JSON.parse(res) 	// {"name":"zhagnsan", "age":18}
RegExp 对象
在 python 中如果需要正则 需要借助 re模块
在js中需要创建正则对象

第一种方法定义正则
let reg1 = new RegExp('[1-5][A-Z]{5,11}')
第二种方法定义正则
let reg2 = /[1-5][A-Z]{5,11}/

eg: 获取字符串里面所有的字母
let ss = "zhangsan dsb dsb"
sss.match(/s/)  // 拿到了第一个s, index=5
sss.match(/s/g)  // 全局匹配 拿到三个 s
全局匹配问题一
let reg = /^[a-zA-Z][a-zA-Z0-9]{5,9}/g
reg.test('zhangsan dsb')        // 全局模式有一个 lastIndex 属性
true      // 当返回结果为 true  lastIndex 会停留在最后一个字符的后面
reg.test('zhangsan dsb')  // 再次test 会从lastindex 后开始匹配
false     // 当返回结果为 false 时 lastIndex 再次清零
reg.test('zhangsan dsb')    // true
reg.test('zhangsan dsb')    // false
reg.lastIndex   // 0
reg.test('zhangsan dsb')    // true
reg.lastIndex   // 8
全局匹配问题二
let reg = /^[a-zA-Z][a-zA-Z0-9]{5,9}/
reg.test()  // 什么都不传 默认传的是 undefined
true
reg.test()
true
reg.test(undefined)
true
let reg2 = /undefined/
reg2.test('zhangsan')
false
reg2.test()
true

BOM操作

# Windows对象
window 对象只带的就是浏览器窗口
	方法 
window.innerHeight 	// 浏览器窗口的高度
window.innerWidth 	// 浏览器窗口的宽度

window.open("https://www.baidu.com", "",'height=400px, width=400px,top=200px,left=400px')
// 新建窗口打开页面 第二个参数写空即可, 第三个参数写新建的窗口的大小与位置
// 扩展: 父子页面通信 window.opener() 了解即可
window.close() 关闭当前页面
windows子对象
window.navigator.appName
"Netscape"
window.navigator.userAgent
"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36"
window.navigator.appVersion
"5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36" 
window.navigator.platform
"Win32"
// 如果是window的子对象, 那么 window 可以不写

扩展: 仿爬(navigator对象)
1 最简单的最常用的一个就是校验当前请求的发起者是否是一个浏览器
	navigator.userAgent
	user-agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36
	
	如何破解
		在代码中 加上 user_agent 配置即可
		
History对象
window.history.back()		// 回到上一页 
window.history.forward()	// 返回下一页
location对象
>>>window.location
Location {replace: ƒ, assign: ƒ, href: "https://ai.taobao.com/?pid=mm_12431063_4230865_56758591", ancestorOrigins: DOMStringList, origin: "https://ai.taobao.com",}
>>>window.location.href		// 获取当前页面的url
"https://ai.taobao.com/?pid=mm_12431063_4230865_ 56758591"
let url = 'https://www.baidu.com'
window.location.href = url // 跳转到指定的url
window.location.reload() // 刷新页面 浏览器左上方的刷新按钮
弹出框
alert("不要这样呀!!!!")  // 警告框
confirm("are you sure to do this?") // 确认框  会返回用户选择的值 true 或者  false
prompt("请输入帐号")  // 提示框, 会在用户界面弹出一个小框, 里面有一个文本框, 和一个确认按钮和取消按钮
"你想的美"  // 提示框返回值, 用户在文本框里面输入什么就返回什么
计时器

<script>
    function func1() {
        alert(123)
    }

    function func2() {
        alert(456)
    }

    setTimeout(func1, 1000) // 毫秒为单位 3秒之后自动执行 func1 函数
    let e = setTimeout(func2, 2000)
    clearTimeout(e)      // 取消定时任务 如果想要清除定时任务 需要定义变量只带定时任务

    function show() {
        let t = setInterval(func2, 1000)  // 每隔1秒执行一次
        function inner() {
            clearInterval(t)     // 清除定时器
        }

        setTimeout(inner, 4000) // 4秒之后触发
    }

    show()	// 出现四次 456 之后就不再出现
</script>

DOM操作

DOM 树的概念
所有的标签都可以称之为是节点

JavaScript 可以通过 DOM 创建动态的 HTML 

JavaScript 能够改变页面中的所有 HTML 元素
JavaScript 能够改变页面中的所有 HTML 属性
JavaScript 能够改变页面中的所有 CSS 样式
JavaScript 能够对页面中的所有事件做出反应

DOM 操作 操作的是标签 而一个html页面上的标签有很多
1 先学如何查找标签
2 在学 DOM 操作标签
DOM 操作需要用关键字 document 开始
查找标签
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div id="d1">
        <div id="d2"> div>div</div>
        <p id="p1" class="c1">div>p</p>
    </div>
    <div id="d3">div+div</div>
</body>
</html>
直接查找
id 查找 
	document.getElementById('d1')  // 返回对象本身
类查找
	document.getElementsByClassName('c1')  // 返回一个容器类型
通过标签名称查找
	document.getElementsByTagName('div')  // 返回一个容器类型
// 用变量名指代标签对象  (一般推荐变量名书写成 xxxEle)
let divEle = document.getElementsByTagName('div')[1]
间接查找
>>>
let pEle = document.getElementsByClassName("c1")[0]
>>> pEle = pEle[0]
   < p id ="p1" class="c1" > div > p  < /p> 
>>> pEle.parentElement
< div id = "d1" ></div> 
>>>pEle.parentElement.parentElement
< body >
< div id = "d1" ></div>
	<div id= "d3" > div + div  < /div>
<script></script>
</body> 
>>>pEle.parentElement.parentElement.parentElement
< html lang = "en" >
< script id = "allow-copy_script" ></script>
<head></head>
<body></body>
<div id= "photoShowViewer" class= "sb_BingCA photoShow" ></div>
</html>
>>> pEle.parentElement.parentElement.parentElement.parentElement
null
>>>let divEle = document.getElementById('d1')
undefined
>>>divEle.children			// 获取所有的子标签
HTMLCollection(2) [div#d2, p#p1.c1, d2: div#d2, p1: p#p1.c1]
     0: div#d2
     1: p#p1.c1
     length: 2
     d2: div#d2
     p1: p#p1.c1
     __proto__: HTMLCollection
>>>divEle.children[0]	// 获取第一个子标签
<div id= "d2">  div>div </div> 
>>>divEle.firstElementChild	// 获取第一个子标签
<div id= "d2">  div>div </div> 
>>>divEle.lastElementChild	// 获取最后一个子标签
<p id= "p1" class= "c1"> div>p </p> 
>>>divEle.nextElementSibling	// 获取同级别下面的第一个标签
<div id= "d3"> div+div </div> 
>>>divEle.previousElementSibling //  
<div> div上面的div </div> 
节点操作
通过
DOM
操作动态的创建img标签
并且给标签添加属性
最后将标签添加到文本中
img标签操作
let imgEle = document.createElement('img') 	// 创建标签
imgELe.src = 'img.png'	// 设置 img 默认属性   '.' 只能设置默认属性
imgEle.setAttribute(username)  // 设置自定义属性  (可以设置默认属性也可以设置自定义属性)
imgEle.setAttribute('title', "a photo")  // 设置默认属性
let divEle = document.getElementById('d1')
divEle.appendChild(imgEle)		// 标签内部添加元素(尾部追加)
a标签操作
let aEle = document.createElement('a')
aEle.href = "https://www.baidu.com"
aEle.innerText = '点我有你好看'		// 给标签设置文本内容
let divEle = document.getElementById('d1')
let pEle = document.getElementById('p1')
divEle.insertBefore(aEle, pEle)		// 指定位置添加标签
额外补充
appendChild()	// 添加标签
removeChild()	// 删除标签
replaceChild()	// 替换标签

setAttribute()  // 设置属性
getAttribute()  // 获取属性
removeAttribute()  // 移除属性

let divEle = document.getElementById('d1')
>>> divEle.innerText		// 获取标签内部所有文本
"div
div>p
div>span"
>>> divEle.innerHTML		// 内部文本和标签都可以拿得到
" div
        <p id="p1">div&gt;p</p>
        <span>div&gt;span</span>
    "
>>> divEle.innerText = "<h1>hello world</h1>"  // 不识别标签 打什么浏览器就给什么
>>> divEle.innerHtml = "<h1>hello world</h1>"	// 识别标签 给一个 h1 标题样式的 hello world
获取值操作
// 获取用户数据标签内部的数据
let seEle = document.getElementById('d1')
seEle.value  获取用户选择的option 的 value
// 获取用户上传的文件数据
let fileEle = document.getElementById('f1')
fileEle.value	// 获取到文件的路径
"C:\fakepath\Crossfire20210812_0000.bmp"
fileEle.files	// 获取到文件字典
FileList {0: File, length: 1}
fileEle.files[0]	// 获取文件数据
File {name: "Crossfire20210812_0000.bmp", lastModified: 1628773896321, lastModifiedDate: Thu Aug 12 2021 21:11:36 GMT+0800 (中国标准时间), webkitRelativePath: "", size: 1440054,}
cklss, css 操作
let divEle = document.getElementById('d1')
divEle.classList 	// 获取标签所有属性
DOMTokenList(3) ["c", "bg_red", "bg_green", value:"c1 bg_red bg_green"]

divEle.classList.remove("bg_red")  // 移除某个属性
divEle.classList.add("bg_red") 	// 添加某个属性
divEle.classList.contains("c1")	// 验证是否存在某个属性
true
divEle.classList.contains("c2")	// 验证是否存在某个属性
false
divEle.classList.toggle('bg_red')	// 如果有此属性 则删除 如果没有此属性 则添加
flase
divEle.classList.toggle('bg_red')	// 如果有此属性 则删除 如果没有此属性 则添加
true

DOM操作 操作标签样式 统一用 style起手
let pEle = document.getElementById('p')[0]
pEle.style.color = 'red'
pEle.style.fontSize = '28px'
pEle.style.backgroundColor = 'yellow'
pEle.style.border = '3px bolder red'
事件
# 达到某个事先设定的条件 自动触发的动作
 <!--  绑定事件的两种方式  -->
<body>
    <!--  第一种绑定方式(有可能出现代码冗余)  -->
    <button onclick="func1()">click me</button>	
    <button id="d1">click me</button>
    
    <script>
        function func1(){
            alert(111)
        }
        let btnEle = document.getElementById('d1');	// 第二种绑定事件的方式 (推荐使用)
        btnEle.onclick = function (){
            alert(222)
        }
    </script>
</body>

# script 标签 既可以放在 head 里面 也可以放在 body里面
# 但是由于 html 页面是从上往下加载的有的对象没有创建就调用会报错
# 故最好推荐 将 script 标签放在body的最后面
# 如果必须想要在 head 里面写 script 可以用 window.onload 方法
<script>
    // 等待浏览器窗口加载完毕之后在
    window.onload = function () {
        function func1() {
            alert(111)
        }

        let btnEle = document.getElementById('d1');
        btnEle.onclick = function () {
            alert(222)
        }
    }
</script>

原生事件绑定

案例1 : 模拟红绿灯
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .c1 {
            width: 400px;
            height: 400px;
            border-radius: 50%;
        }
        .bg_green {
            background-color: green;
        }
        .bg_red {
            background-color: red;
        }
    </style>
</head>
<body>
<div id="d1" class="c1 bg_red bg_green"></div>
<button id="b1">change the color</button>

<script>
    let btnEle = document.getElementById('b1')
    let divEle = document.getElementById('d1')
    btnEle.onclick = function func1() {   // 绑定点击事件
        divEle.classList.toggle("bg_red")
    }
</script>
</body>
</html>
案例2: input 框 获取焦点及失去焦点
<body>
<input type="text" value="请输入账号" id="i1">

<script>
    let iEle = document.getElementById('i1')
    iEle.onfocus = function (){
        iEle.value = ""
    }
    iEle.onblur = function (){
        iEle.value = "请输入账号!!!"
    }
</script>

案例3: 计时器

<body>
<input type="text" id="t1">
<button id="b1">开始计时</button>
<button id="b2">停止计时</button>
<script>
    let iEle = document.getElementById("t1")
    let btn1Ele = document.getElementById("b1")
    let btn2Ele = document.getElementById("b2")

    function showTime(){
        let currentTime = new Date()
        iEle.value = currentTime.toLocaleString()
    }
    t = setInterval(showTime, 10)

    btn1Ele.onclick = function (){
        if (!t) {
            t = setInterval(showTime, 10)
        }
    }
    btn2Ele.onclick = function (){
        clearTimeout(t)
        t = null
    }
</script>
</body>
案例4: 省市选择
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<select name="" id="s1">
    <option selected disabled value="">---请选择---</option>
</select>
<select name="" id="s2"></select>


<script>
    let s1ELe = document.getElementById('s1')
    let s2ELe = document.getElementById('s2')
    data = {
        '辽宁': ['沈阳', '大连', '葫芦岛'],
        '上海': ['静安', '黄埔', '浦东'],
        '北京': ['朝阳', '海淀', '昌平'],
        '山东': ['临沂', '烟台', '威海']
    }
    for(let key in data){
        let opEle = document.createElement('option')
        opEle.value = key

        opEle.innerText = key

        s1ELe.appendChild(opEle)
    }
    s1ELe.onchange = function (){
        let city = data[s1ELe.value]
        let opd = '<option selected disabled>---请选择---</option>'
        s2ELe.innerHTML = opd

        for (let i = 0; i < city.length; i++){
            let value = city[i]
            let opEle = document.createElement('option')
            opEle.value = value
            opEle.innerText = value
            s2ELe.appendChild(opEle)
        }
    }
</script>
</body>
</html>
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值