JavaScript | 青训营笔记

155 阅读4分钟

这是我参与「第四届青训营 」笔记创作活动的的第3天

这部分笔记是过去学js时用到的,感觉27的课还有些懵,没有总结完,所以之后可能重新记一下js老师上课讲的,下面是我学js时记得部分笔记。


theme: smartblue

插入方式

内嵌

    <script>
        alert('沙漠骆驼草陀螺')
    </script>

外部引入

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

行内

<input type="button" value="hello" class="type" onclick="alert('我的老家')">

输入输出

image.png

// 这是一个输入框
        prompt('提示框');
        // 弹出警示框 展示给用户
        alert('耶!')
        // console 控制台输出, 给程序员测试使用
        console.log('控制台输出')

变量

声明变量

        var age; // 声明age变量
        age = 10; // 赋值
        console.log(age); // 输出
        var myname = 'hello world' // 变量初始化
        console.log(age); // 输出

数据类型

image.png

Number

Number.Max_Value 最大值
Number.Min_Value 最小值
​
Infinity 无穷大
-Infinity 无穷小
NaN  不是数字
​
isNaN() 判断是否是非数字

字符串

//检测获取字符串长度 length
var str = "一段话"
console.log(str.length);
​
// 字符串拼接
console.log('沙漠'+'马桶')

Boolean

true 参与运算当1
false 参与运算当0

获取数据类型

typeof 变量名

数据类型转换

数字→字符串

image.png

字符串→数字

image.png

		var age = prompt("输入年龄");
        age_num = parseInt(age); 

转换成布尔类型

image.png

布尔运算有短路运算特性

流程

if分支

	if(){
       
       }else if{
        
    }else{
        
    }

switch分支

switch(表达式)
{
	case value:
		执行语句;
		break;
}

循环

for(var i = 1;i<1000;i++)
{
	语句
}

while循环

while()
{

}

do{

}while()

数组

var 数组名 = new Aarray();

var 数组名 = ['hello' ,'you shabi'];

数组名[索引]

新增数组元素

   var arr = ['e', 'mmm']
        console.log(arr)
        arr.length = 5;
        console.log(arr)
            // 追加
        arr[5] = '芜湖'

函数

function 函数名(参数)
{
}

函数名()

arguments

function// 用于获取传递来的所有实参
function func() {
            console.log(arguments);
        }
        func(1, 2, 3);

作用域

作用域链

var num = 10;
function fun()
{
	var num = 20;
	function func()
	{
		// 可以访问num,就近原则。
		var funcNum = 300;
	}
	// 不可以访问funcNum
}

预解析

// js引擎运行js 先预解析再进行代码执行
        // 1、预解析
        // js引擎会把js中所有的var 和function提升到当前作用于的最前面
        // 变量提升时提升声明而不提升定义。

console.log(num); // 输出undefined 
var num = 10;

对象

// 创建对象用{}
        var obj = {
            uname: '葫芦娃',
            age: 5,
            sex: '男',
            sayHi: function() {
                console.log('HI');
            }
        };


// 利用new Object创建对象
        var obj2 = new Object(); // 创建一个空的对象
        obj2.uname = '大傻逼'
        obj2.sayHi = function() {

        }

构造函数创建对象

function HuLuWa(kuzi, ye) {
            this.kucha = kuzi;
            this.yeye = ye;

            this.fun = function(num) {
                console.log("hello 傻逼")
                return ?
            }
        }
        // 1、 构造函数首字母大写
        var st = new HuLuWa("花裤衩", "爷爷");
        console.log(st);
        st.fun(1);

变量的遍历

for(var k in 对象)
{
	console.log(k) ;//输出属性名
	console.log(对象[k]) ;//输出变量
	
}

随机数

Math.random() * (max - min + 1) +min;

日期

日期的构造函数

	// Date() 日期对象 是一个构造函数 必须使用new
        var date = new Date(); // 无参会返回系统的当前时间
        console.log(date);
        // 参数常用的写法
        // 数字型 2019,10,01
        // 字符串型 '2019-10-01'		
		var date1 = new Date(2019, 10, 1); // 数字型会比当前月份大一。
        console.log(date1);
        var date2 = new Date('2019-10-1 8:8:8');
        console.log(date2);

格式化日期

        var date = new Date();
        // 2019 年 5月1日星期三
        var year = date.getFullYear();
        var month = date.getMonth() + 11;
        var dates = date.getDate();
        console.log('今天是:' + year + '年' + month + '月' + dates + '日');
        var dayarr = ['七', '一', '二', '三', '四', '五', '六']
        console.log('星期' + dayarr[date.getDay()])

        // 格式化时分秒
        console.log(date.getHours());
        console.log(date.getMinutes());
        console.log(date.getSeconds());

总毫秒数

        var date = new Date();
        console.log(date.valueOf());
        console.log(date.getTime());

        var date1 = +new Date();
        console.log(date1)

        console.log(Date.now());

数组对象

检测是否为数组

arr instanceof Array;

Array.isArray(arr);

增删元素

增加

返回值是添加后的数组的长度

// 增添删除数组元素,在结尾加入
        arr.push('je');

        // 在开头添加
        arr.unshift('bu')

删除

返回值是被删除的元素

// 删除最后一个元素
        arr.pop();
        
// 删除第一个
        arr.shift();

反转数组

数组对象.reverse()

排序

数组对象.sort() ; // 默认是按照第一位进行排序 , 会排出1 11 2 22 这样的数字

var arr = [13, 4, 7, 11, 5];
        arr.sort(function(a, b) {
            return a - b; //升序排序
            return b - a;// 降序排序
        })
        console.log(arr);

数组索引

image.png

数组转换为字符串

        var arr = [1, 2, 3];
        console.log(arr.toString());

        console.log(arr.join("_"));

根据索引返回字符

image.png

拼接与截取

image.png

替换

image.png

DOM

获取元素

根据id获取

<div id="hulu">葫芦娃操爷爷</div>
    <script>
        // 返回的是一个元素对象
        // 先找到文档document 然后找到标签。
        var element = document.getElementById("hulu");
        console.log(element);
        // 打印我们返回的元素对象,更好的查看里面的属性和方法
        console.dir(element);
    </script>

根据标签名获取

以伪数组的形式存储 ,获取元素对象的集合

        var lis = document.getElementsByTagName('li');
        // 获取元素
        lis[0]

获取子类的元素

element.getElementsByTagName();

类名选择元素

var li1 = document.getElementsByClassName('类名');
        console.log(li1);

querySelector

只返回第一个元素

// 返回制定选择器的第一个元素 querySelector
        var firstBox = document.querySelector('.class');
        console.log(firstBox);
        var nav = document.querySelector('#id');
        console.log(nav);
        var nav2 = document.querySelector('li');
        console.log(nav2);

querySelectorAll

返回所有元素

var nav3 = document.querySelectorAll('li');
        console.log(nav3);

body和html元素获取

var body = document.body;
        console.log(body);
        console.dir(body);

        var html = document.documentElement;
        console.log(html);

事件

事件流程

<button id="huluwa">葫芦娃</button>
    <script>
        // 事件三要素: 事件源 事件类型 事件处理程序
        // 1 事件源:被触发的对象
        var btn = document.getElementById('huluwa');
        // 2 事件类型 如何处罚 什么事件
        // 3 事件处理程序 通过一个函数赋值的方式 完成
        btn.onclick = function() {
            alert('操爷爷');
        }
    </script>

改变元素内容

改变文本内容

// 点击按钮后div中文字改变
        var btn = document.getElementById('btn');
        var div = document.getElementById('time');
        // 注册事件
        function getDate() {
            date = new Date();
            var year = date.getFullYear();
            var month = date.getMonth() + 1;
            var day = date.getDate();

            return year + '-' + month + '-' + day;
        }
        btn.onclick = function() {
            // 事件处理
            div.innerText = getDate();

        }

innerHTML和 innerText标签

两个标签可以获取,是属性。

        // innerText 和 innerHTML区别
        // 1 innerText  不识别html标签
        var div = document.querySelector('div');
        div.innerText = '<strong> 今天是:</strong> 2019';
        // 2 innerHtml 识别标签
        div.innerHTML = '<strong> 今天是:</strong> 2019';

常用元素的属性操作

// 修改元素属性src
        var btn_1 = document.getElementById("btn1");
        var btn_2 = document.getElementById('btn2');
        var img = document.getElementById('img');
        // 注册事件
        btn_2.onclick = function() {
            img.src = 'sw_replace.png';
            img.title = 'btn2';
        }
        btn_1.onclick = function() {
            img.src = 'sw.jpg';
            img.title = 'btn1';

        }

改变表单的文字内容需要使用value属性而不是innerHTML 或者innerText

表单元素的属性操作

表单元素修改

// 表单中的元素需要使用value指来改变
            input.value = '被点了!';

禁用表单

// 禁用表单,不能再点击,用到disabled
            btn.disabled = true;

遍历li标签并使用精灵图

var list_img = document.querySelectorAll('li');
        for (var i = 0; i < list_img.length; i++) {
            // y坐标=索引数*44
            var index = i * 44; // y坐标
            list_img[i].style.backgroundPosition = '0 -' + index + 'px';

        }

显示隐藏表单内文本

text.onfocus = function() { //获取焦点
            console.log('hu');
        }
        text.onblur = function() { // 失去焦点
            console.log('bu');
        }

通过className更改元素样式

在script函数中将当前类的名字改变为className

css中
.类名{
	一些元素样式
}

className = '类名'

既保留原来的类名

className = '想要的类1 类2'

鼠标事件

鼠标经过
onmouseover
鼠标离开
onmouseout

自定义属性

在标签中写属性名=属性值

<script>
        var div = document.querySelector('div');
        console.log(div.getTime);
        div.setAttribute('data-time', 20);
        console.log(div.getAttribute('data-index'));
        console.log(div.getAttribute('data-list-name'));
        // 新增
        console.log(div.dataset);
        console.log(div.dataset.index);
        console.log(div.dataset['index']);
        // 有多个-时候获取时采用驼峰命名法
        console.log(div.dataset.listName);
        console.log(div.dataset['listName']);
    </script>

节点

节点至少有nodeType-节点类型、nodeName-节点名称和nodeValue三个基本属性。

元素节点 nodeType = 1

属性节点 nodeType = 2

文本节点 nodeType = 3

获取节点

       // 兄弟节点
		console.log(div.previousElementSibling); // 得到上一个元素节点
        console.log(div.nextElementSibling); // 得到下一个
         



// 1、父结点
        var erweima = document.querySelector(".erweima");
        console.log(erweima.parentNode); // 获取最近的父节点,找不到父节点返回为空。
        // 2、子节点 包括元素节点 文本节点等
        var ul = document.querySelector('ul');
        console.log(ul.childNodes);
        for (var i = 0; i < ul.childNodes.length; i++) {
            if (ul.childNodes[i].nodeType == 1) {
                // 是元素节点
                console.log(ul.childNodes[i]);
            }
        }
        // children 获取子元素节点 也是实际开发常用的
        console.log(ul.children);
        // firstChild 获得第一个子节点 不管是文本节点还是元素节点
        var ol = document.querySelector('ol');
        console.log(ol.firstChild);
        console.log(ol.lastChild);
        // 返回第一个子元素节点
        console.log(ol.firstElementChild);
        console.log(ol.lastElementChild);
        // 实际开发写法 
        console.log(ol.children[0]);
        console.log(ol.children[ol.children.length - 1]);

添加节点

        // 创建节点
        var li = document.createElement('li');
        // 添加节点
        // node.appendChile()将一个节点添加到node的结尾
        var ul = document.querySelector('ul');
        ul.appendChild(li);
        // 添加节点
        // node.insertBefore(child,指定元素)
        var lili = document.createElement('li');
        ul.insertBefore(lili, ul.children[0]);
        // 向页面添加一个新的元素 需要创建元素再添加元素

删除节点

        ul.removeChild(ul.children[0]);

阻止链接跳转

href = javascriptvoid(0) 
或者Javascript:;

复制节点

node.cloneNode();

批量添加节点优化

// innerHTML创建元素
        var inner = document.querySelector('.inner');
        // for (var i = 0; i < 100; i++) {

        //     inner.innerHTML += '<a href="#" > 百度 </a> ';
        // }

        var arr = [];
        for (var i = 0; i < 100; i++) {
            arr.push('<a href="#"> 百度 </a>');
        }
        inner.innerHTML = arr.join('');

        var create = document.querySelector('.create');
        for (var i = 0; i < 100; i++) {
            var a = document.createElement('a');
            create.appendChild(a);
        }

事件

两种注册事件

 // 1、传统注册方式

        // 同一个元素只能注册一个函数
        // 会将上一个处理函数覆盖掉
        var btns = document.querySelectorAll('button');
        btns[0].onclick = function() {
            alert('hi');
        }
        btns[0].onclick = function() {
            alert('hao!');
        }


// 2、方法监听注册方式
        // eventTarget.addEventListener(type,listener[,useCapture])
        // type 事件类型字符串 如 click  mouseover
        // listener 事件处理函数 事件发生时会调用该监听函数
        btns[1].addEventListener('click', function() {
            alert(22);
        })
        btns[1].addEventListener('click', function() {
            alert(33);
        })

删除事件


        // 传统方式解绑
        divs[0].onclick = function() {
            alert('只会弹出来一次');
            divs[0].onclick = null;
        }

        divs[1].addEventListener('click', fn)

        function fn() {
            alert(22);
            // 移除监听事件
            divs[1].removeEventListener('click', fn)
        }

事件对象

var div = document.querySelector('div');
        div.onclick = function(e) {
            // event 就是一个事件对象
            // 事件对象有了事件才会存在,是系统自动创建的 不需要传递参数
            //事件对象是我们一系列相关数据的集合
            console.log(e);
            // 解决兼容性问题
            e = e || window.event
            console.log(e);
        }

阻止默认行为

子类对象所获取到的点击对象会一层一层向上传递,直到document,使得父类全部获取到点击事件。

            e.stopPropagation();

事件委托

事件委托的原理 不给子节点设置事件监听器,将事件监听器设置给父节点,利用冒泡原理设置子节点。

eg如果ul中包括多个li,利用事件对象的targit获取当前点击的li,事件冒泡到ul,ul有注册事件,会触发监听器。

        var ul = document.querySelector('ul');
        ul.addEventListener('click', function(e) {
            alert('哇达西,不知道在打什么');
            // e.target 可以获得点击的对象
            e.target.style.backgroundColor = 'pink';
        })

常用的鼠标事件

image.png

禁止鼠标右键菜单

document.addEventListener('contextmenu', function(e) {
            e.preventDefault();
        });

禁止选用左键选中文字

// 禁止选中文字
        document.addEventListener('selectstart', function(e) {
            e.preventDefault();
        })

鼠标点击位置

        document.addEventListener('click', function(e) {
            // 返回鼠标相对于浏览器窗口可视区的X坐标
            // 返回鼠标相对于浏览器可视区的Y坐标
            console.log('X:' + e.clientX);
            console.log('Y:' + e.clientY);
            // 返回页面文档的x和y坐标
            console.log("ABX:" + e.pageX);
            console.log("ABY:" + e.pageY);
        })

鼠标移动定位

        document.addEventListener('mousemove', function(e) {}

常见键盘事件

image-20210801143948750

		document.addEventListener('keyup', function() {
            console.log('up');
        });
        document.addEventListener('keydown', function() {
            console.log('down');
        });
        // 不识别功能键 ,比如ctrl和shift和箭头等。
        document.addEventListener('keypress', function() {
            console.log('press');
        });
        // 三个事件的执行顺序 keydown  --  keypress  -- keyup

获取按键的ASCII码

	e.keyCode

搜索框获得焦点

                search.focus(); // 搜索框获得焦点

input失去焦点和获得焦点

        jd_input.addEventListener('blur', function() {});
        jd_input.addEventListener('focus', function() {});