js学习笔记(上)

一、初识JS
1.1 js的简介

  • java与js是没有联系的,是雷锋与雷峰塔之间的关系

  • 是一种运行在客户端的脚本语言(Script是脚本的意思)

  • 脚本语言:不需要编译,运行过程中逐行解释并执行

  • 作用:密码强度检验;网页特效;APP;桌面程序;服务端开发(前后端都有涉及)
    1.2浏览器的组成

  • 渲染引擎:用来解析HTML和CSS,速成内核

  • JS引擎:用来解析JS

  • 网页是不能执行JS代码的,是先通过JS引擎来将JS代码转为二进制,然后让浏览器执行

  • JS代码是被解释一行,浏览器执行一行,解释一行,执行一行,逐行被解释,所以被归为脚本语言
    1.3 JS的三部分组成

  • ECMAScript(基础语法)

  • Dom(文档对象模型)

  • Bom(浏览器对象窗口模型)
    1.4 JS的三种书写位置

  • 行内式(特殊情况下使用):写在body内;在js中一般不用双引号,而用单引号

  • 内嵌式(学习中用的比较多):写在head的script标签中

  • 外部JS文件(JS代码量比较大的时候使用):引用JS文件的script标签中间不能写代码
    1.5 JS注释

  • 单行注释与多行注释格式与C语言一样
    1.6输入输出语句

  • prompt():弹出输入框,用户可以输入

  • alert():弹出警示框

  • console.log:在控制台显示给程序员看的
    1.7变量

  • 在内存中申请的用来存储数据的一块空间

  • 声明变量用var

  • 声明多个变量可以之间用逗号隔开

  • 不声明直接赋值是可以正常显示的,但是并不提倡;不声明,不赋值会报错;声明但不赋值是undefined;

  • 命名遵循驼峰原则:首字母小写,后面单词的首字母大写

  • 一般不采用name作为变量名,在一些浏览器中,name有特殊含义
    二、数据类型
    2.1数据类型简介

  • js的数据类型是根据等号右边的数据来确定的

  • js是一种动态语言,一个变量可以变化多个数据类型
    2.2数据型分类

  • 简单数据类型(Number,String,Boolean,Null,Undefined)

  • 复杂数据类型(object)

  • Number:八进制在数字前加0,十六进制在数字前加0x,未赋值默认为0

  • String:js中字符串建议用单引号,字符串内的引号嵌套可以使用内单外双或者内双外单来实现;比较常用的转义符(写在引号内部):\n,\t

  • str.lenth可以测得字符串长度;字符串+任意类型数据=拼接后的新字符串

  • Boolean:布尔型参与加法运算的时候-false当0,right当1

  • Undefined:如果一个变量只声明未赋值就是这个

  • NULL:与数字做加法显示原始数值

  • typeof可以检测数据类型,prompt取过来的数值是字符型的,无法进行想要的加法运算
    -转换为字符类型:利用+拼接字符串的方法,+‘’即可

  • 转换为数字类型(重点):parseInt(变量)与parseFloat(变量),前者是取整,两者都可以去掉后面的单位;Number(‘字符串’)强制转换;Js隐式转换(利用加减乘除进行转换)
    -转换为布尔类型:Boolean()
    -拓展资料:编译型语言(吃炒菜):所有的都炒完了才能吃。解释型语言(吃火锅):边涮边吃
    三、运算符
    3.1 算数运算符
    -浮点数精度很高,但是在计算上的准确度上并不如整数
    -前置递增先自加,后返回值。后置则相反
    3.2 比较运算符
    3.3逻辑运算符
    -逻辑与的短路中断(&&):表达式1为真时,返回表达式2;表达式1为假时,返回表达式1
    -逻辑或的短路终端(||):表达式1为真时,返回表达式2为真。
    -短路原理;当表达式1的布尔类型可以确定的时候,后面的表达式就不用再计算
    四、流程控制
    -三元表达式:条件表达式 ?表达式1:表达式2(条件为真则执行前者)
    -switch分支语句:switch(表达式),用表达式的值和case后面的值相匹配,来有选择的执行语句
    -while循环与for循环的不同之处在于for主要用来计数,while可以进行一些复杂条件的判断
    -continue:跳出当前次的循环,进行下一次的循环
    -写注释的时候//后面加上一个空格。if后面小括号的前后加上一个空格
    五 、数组
    -数组长度:数组名.length
    -想要输出多个变量,用逗号分隔即可
    -新增数组元素:arr[4]=’’,直接追加索引号
    -冒泡排序:一次比较两个元素,如果顺序错误就交换过来;外面的for控制趟数(length-1);里面的for控制次数(length-1-i)
    六、函数
    -函数就是封装了的一段可以重复使用的代码块
    -关键字function,其他与c语言一致
    -声明函数的小括号里的是形参,调用小括号里的是实参
    -形参与实参个数不匹配问题(实参>形参,取到形参的个数);(实参<形参,多的形参被定义为undefined,最终结果为NaN;
    -在实参个数不确定的情况下,可以不写形参,用arguments,这里面存储了所有的实参。这是一种伪数组,也有长度,也可以用索引号来引出数据
    七、JS作用域
    -特殊情况:没有声明直接出现在函数中赋值的变量也是全局变量
    -全局变量只有在浏览器关闭的时候才会销毁,比较占用内存。局部变量使用之后就会销毁,比较节省内存
    -作用域链:就近原则
    -js引擎运行js分为预解析和代码运行两部分:预解析会将所有的var和function提取到“当前”作用域的最前面
    -变量提升:提升变量的声明,但不提升赋值
    -函数提升:提升函数的声明, 但不调用函数
    八、对象
    8.1 自定义对象
    -字面值声明对象:{大括号},里面放属性和方法,每一个之间都用逗号隔开
    -调用属性:对象名.属性名 调用方法:对象名.方法名()
    -变量与属性的区别:变量是单独存在的,属性是寄托于对象之内的,是不用声明的;函数与方法的区分点也是如此
    -new Object声明对象:var obj = new Object ()
    -构造函数:将对象中相同的属性和方法抽象出来封装到函数中去
    -遍历对象:for(var k in Star):输出k是属性名,输出Star[k]输出的是属性值
    8.2 Math对象
    -绝对值:Math.abs()
    -取整:Math.floor(向下取整) Math.ceil (向上取整) Math.round(四舍五入取整,.5特殊,会往大了取)
    -随机数:Math.random(),返回一个[0,1)之间的随机小数,并可借此完成随机点名
    8.3 Date对象
    -必须用new来先创建
    -getFullYear(获取当前年) getMonth(获取当年月,输出的会比真实小1) getDate(获取当前日) getDay(返回星期几,0是周日)getHours(小时)
    getSeconds(秒)getMinutes(分钟)valueOf getTime(距离1970年1.1过了多少毫秒)
    8.4 数组对象
    -Array.isArray(参数)要求IE9版本及以上 参数名instanceof Array
    -push在后面添加,unshift在前面添加,返回值是数组的长度
    -pop删除最后一个,shift删除第一个,返回的被删除的元素
    -reverse(反转数组) sort(冒泡排序,后面还需要多加一个方法)
    -返回索引号:indexof,lastIndexof(从后面开始查找)
    -将数组转换为字符串:数组名.toString 数组名.join()
    8.5 字符串对象、
    -字符串的不可变性:字符串的内容是不可变的,看起来是更换了 数据,但其实地址已经改变了,内存中新开辟了一块内存空间
    -charAt(index)返回索引号位置的字符 charCodeAt(index)返回ASCII码值
    str[index]存在兼容性问题
    -substr(开始的位置,截取多长),截取字符串
    -替换字符:replace(‘要替换的字符’,‘替换成为的字符’) 字符转换为字符:split('分隔符‘)
    -简单数据类型直接存储在栈里面,存放的是值。复杂数据类型是在栈里面放的地址,数据放在了地址指向的堆里面
    第二阶段:Web API
    一、
    1.1 Web API
    -Web API(js独有):DOm+Bom
    -API是一个接口,大多是方法,我们无需了解内部构造,只需要知道如何使用就可以,是针对于浏览器做交互效果
    1.2 Dom获取元素方式

  • getElementByid

<body>
    <div id="time">2022-1-3</div>
    <script>
        // 文档从上往下加载,script谢到标签下面
        var timer = document.getElementById('time');
        console.log(typeof timer);
        // console.dir更好查看里面的属性与方法
        console.dir(timer);
    </script>
</body>
  • getElementByTagName
<body>
    <li>知否知否,应是等你好久1</li>
    <li>知否知否,应是等你好久2</li>
    <li>知否知否,应是等你好久3</li>
    <script>
        // 1、返回的是 获取过来的元素对象的集合 以伪数组形式存储
        var lis = document.getElementsByTagName('li');
        // 2、进行遍历
        for (var i = 0; i < lis.length; i++) {
            console.log(lis[i]);
        }
    </script>
</body>
  • getElementsByClassName+Selector
<body>
    <div class="box">盒子1</div>
    <div class="box">盒子2</div>
    <ul>
        <li>首页</li>
        <li>产品</li>
    </ul>
    <script>
        var boxs = document.getElementsByClassName('box');
        console.log('box');
        // 1、querySelector 返回指定选择器的第一个元素对象
        var firstBox = document.querySelector('.box');
        console.log(firstBox);
        // 2、querySelector返回选择器的所有元素对象集合
        var allBox = document.querySelectorAll('.box');
        console.log(allBox);
    </script>
</body>

-获取body元素(document.body) 获取html元素(document.documentElement)
1.3 事件

  • 事件三要素
<body>
    <button id="btn">唐伯虎</button>
    <script>
        // 事件三要素:事件源(谁被触发了) 事件类型(如何触发) 事件处理程序(做什么事,函数赋值)
        var btn = document.getElementById('btn');
        btn.onclick = function() {
            alert('点秋香');
        }
    </script>
</body>
  • 执行事件步骤
    在这里插入图片描述
<body>
    <div>123</div>
    <script>
        // 1、获取事件源
        var div = document.querySelector('div');
        // 2、绑定事件
        // div.onclick()
        // 3、添加事件处理程序
        div.onclick = function() {
            console.log('被点击了');
        }
    </script>
</body>
  • innerText与innerHTML
<body>
    <div>显示当前系统时间</div>
    <button>某个时间</button>
    <script>
        var btn = document.querySelector('button');
        var div = document.querySelector('div');
        //innerText不识别Html标签,不保留格式;
        //innerHTML识别,保留格式,两者都能修改内容
        btn.onclick = function() {
                div.innerHTML = '<strong>2022</strong>-1-3';
            }
            // 显示盒子内的文本内容
        console.log(div.innerHTML);
    </script>
</body>
  • 修改表单案例
<body>
    <button>按钮</button>
    <input type="text" name="" id="" value="输入内容">
    <script>
        var btn = document.querySelector('button');
        var input = document.querySelector('input');
        btn.onclick = function() {
            // 不能使用innerHTML来修改,这是修改普通盒子里内容德
            input.value = '被点击了';
            // 点击后禁用
            btn.disabled = true;
            // this指向的是事件函数的调用者
            this, disabled = true;

        }
    </script>
</body>

-lable和input经常在一起搭配使用,一个按钮多次点击切换可以使用flag,根据flag值的变化来实现点击效果的切换
-js修改CSS样式

<body>
    <!-- css部分省略 -->
    <div></div>
    <script>
        var div = document.querySelector('div');
        div.onclick = function() {
            /* div.style里面的属性采取驼峰命名法 */
            this.style.background = 'purple';
            this.style.width = '250px';
            // js改的生成行内样式,CSS权重更高
        }
    </script>
</body>

-获得焦点与失去焦点

<body>
    <input type="text" value="手机">
    <script>
        var input = document.querySelector('input');
        // 获得焦点事件,onfocus
        input.onfocus = function() {
                if (this.value == '手机') {
                    this.value = '';
                }
            }
        // 失去焦点事件,onblur
        input.onblur = function() {
            if (this.value == '') {
                this.value = '手机';
            }
        }
    </script>
</body>
  • className修改样式
<body>
    <div>文本</div>
    <script>
        var div = document.querySelector('div');
        // 通过className修改样式,适用于样式较多的修改
        //但会覆盖掉原来的类名
        div.onclick = function() {
                this.className = 'change';
            }
            //如果不想被覆盖,就在这边写两个
        this.className = 'first change';
    </script>
</body>

-排他思想

<body>
    <button>按钮1</button>
    <button>按钮2</button>
    <button>按钮3</button>
    <script>
        var btns = document.getElementsByTagName('button');
        // 使用for循环的方法循环绑定
        for (var i = 0; i < btns.length; i++) {
            btns[i].onclick = function() {
                // 排他思想:先去掉其他人,再设置自己
                for (var i = 0; i < btns.length; i++) {
                    // 这里不可以再用this,因为这里的调用者还是btns[i]
                    btns[i].style.backgroundColor = '';
                }
                this.style.backgroundColor = 'pink';
            }
        }
    </script>
</body>

-onmouseover(鼠标经过) onmouseout(鼠标离开)
-获取、设置、移除属性值

<body>
    <div id="demo" index="1"></div>
    <script>
        var div = document.querySelector('div');
        // 设置元素属性值的两种方法
        // 1、element.属性='值'
        doiv.id = 'test';
        // 2、element.setatribute=setAttribute('属性','值'),主要针对自定义属性    
        div.setAttribute('class', 'footer');
        // 3、移除属性值
        div.removeAttribute('index');
        // 4、自带的用原来的方法就可以,自定义再用attribute
    </script>
</body>
  • tab栏切换
<script>
        var tab_list = document.querySelector('.tab_list');
        var lis = tab_list.querySelectorAll('li');
        var items = document.querySelectorAll('.item');
        for (var i = 0; i < lis.length; i++) {
            // 给表头的添加index自定义属性
            lis[i].setAttribute('index', i);
            // 排他思想实现表头的点击变化
            lis[i].onclick = function() {
                for (var i = 0; i < lis.length; i++) {
                    lis[i].className = '';
                }
                this.className = 'current';
                // 获取被点击盒子的index,再一次进行排他思想实现切换
                var index = this.getAttribute('index');
                for (var i = 0; i < items.length; i++) {
                    items[i].style.display = 'none';
                }
                items[index].style.display = 'block';
            }
        }
    </script>

-自定义属性统一规范以data-开头,获取方式:element.dateset.自定义属性值(智能获取date-开头的)

  • 节点操作
    在这里插入图片描述
  • 获取结点
<script>
        // DOM 提供的方法(API)获取
        var ul = document.querySelector('ul');
        var lis = ul.querySelectorAll('li');
        // 1. 子节点  childNodes 所有的子节点 包含 元素节点 文本节点等等
        console.log(ul.childNodes);
        console.log(ul.childNodes[0].nodeType);
        console.log(ul.childNodes[1].nodeType);
        // 2. children 获取所有的子元素节点 也是我们实际开发常用的
        console.log(ul.children);
    </script>
  • 获取第一个节点与最后一个结点
// 3. 实际开发的写法  既没有兼容性问题又返回第一个子元素
        console.log(ol.children[0]);
        console.log(ol.children[ol.children.length - 1]);
  • 父节点(使用很少)
<body>
    <div>我是div</div>
    <span>我是span</span>
    <script>
        var div = document.querySelector('div');
        // nextSibling下一个结点,包含元素结点或文本结点
        console.log(div.nextSibling);
        console.log(div.previousSibling);
        // nextElementSibling下一个元素结点
        console.log(div.nextElementSibling);
        console.log(div.previousElementSibling);
    </script>
</body>

-创建和添加结点

<body>
    <ul></ul>
    <script>
        // 1、创建节点
        var li = document.createElement('li');
        // 2、添加结点 node.appendChild(child) node-父级
        var ul = document.querySelector('ul');
        ul.appendChild(li);
        // 3、添加结点
        var lili = document.createElement('li');
        ul.insertBefore(lili, ul.children[0]);
    </script>
</body>

-删除结点:node.removeChild(child)
-阻止链接跳转:herf后面不用#,改用javascript:;
-复制结点

<body>
    <ul>
        <li>1</li>
        <li>2</li>
    </ul>
    <script>
        var ul = document.querySelector('ul');
        // 如果括号内为false或者空,则为浅拷贝,不拷贝节点内容
        // 写true则为深拷贝
        var lili = ul.children[0].cloneNode(true);
        ul.appendChild(lili);
    </script>
</body>

二、DOM高级事件部分
2.1方法监听注册事件

<body>
    <button>方法监听注册事件</button>
    <script>
        // 同一个事件可以添加多个侦听器,优于传统的onclick
        var btn = document.querySelector('button');
        btn.addEventListener('click', function() {
            alert(22);
        })
        btn.addEventListener('click', function() {
            alert(33);
        })
    </script>
</body>

2.2删除事件(解绑事件)

<body>
    <div>1</div>
    <div>2</div>
    <div>3</div>
    <script>
        var divs = document.querySelectorAll('div');
        // 传统方式解绑
        divs[0].onclick = function() {
                alert(22);
                divs[0].onclick = null;
            }
            // 事件监听方式解绑,fn后面不需要加括号
        divs[1].addEventListener('click', fn)

        function fn() {
            alert(22);
            divs[1].removeEventListener('click', fn);
        }
    </script>
</body>

2.3DOM事件流

 // dom 事件流 三个阶段
        // 1. JS 代码中只能执行捕获或者冒泡其中的一个阶段。
        // 2. onclick 和 attachEvent(ie) 只能得到冒泡阶段。
        // 3. 捕获阶段 如果addEventListener 第三个参数是 true 那么则处于捕获阶段  document -> html -> body -> father -> son
        // var son = document.querySelector('.son');
        // son.addEventListener('click', function() {
        //     alert('son');
        // }, true);
        // var father = document.querySelector('.father');
        // father.addEventListener('click', function() {
        //     alert('father');
        // }, true);
        // 4. 冒泡阶段 如果addEventListener 第三个参数是 false 或者 省略 那么则处于冒泡阶段  son -> father ->body -> html -> document
        var son = document.querySelector('.son');
        son.addEventListener('click', function() {
            alert('son');
        }, false);
        var father = document.querySelector('.father');
        father.addEventListener('click', function() {
            alert('father');
        }, false);
        document.addEventListener('click', function() {
            alert('document');
        })

2.4事件对象

<body>
    <div>123</div>
    <script>
        // 事件对象有了事件才会存在,是系统自动创建的,不需要传参
        // 事件对象:跟事件相关的一系列相关数据的集合,鼠标坐标等
        // 事件对象可以自己命名,如event、e、evt
        var div = document.querySelector('div');
        div.onclick = function(e) {
            console.log(e);
        }
    </script>
</body>

2.5 事件对象的属性
e.targer与this的区别:e.target返回的是触发的元素,this返回的是被绑定的元素
e.type:获取事件类型
e.preventDefalut:让链接不跳转,点按钮不提交、无反应
e.stopPropagation:阻止事件冒泡
2.6事件委托

<body>
    <ul>
        <li>123</li>
        <li>123</li>
        <li>123</li>
    </ul>
    <script>
        //事件委托核心原理:给父节点添加监听器,利用事件冒泡影响每一个结点
        // 点击了li,冒泡到ul,ul有监听器,弹出对话框,不用挨个绑定li了,提高了效率
        var ul = document.querySelector('ul');
        ul.addEventListener('click', function() {
            alert('弹出对话框');
        })
    </script>
</body>

2.7禁止选择

<body>
    我是一段不愿意分享的文字
    <script>
        // 1、contextmenu 禁用右键菜单
        document.addEventListener('contextmenu', function(e) {
                e.preventDefault();
            })
            //    2、禁止选中文字 selectstart
        document.addEventListener('selectstart', function(e) {
            e.preventDefault();
        })
    </script>
</body>

2.8鼠标事件对象

<script>
        document.addEventListener('click', function(e) {
            // 返回鼠标在可视区的xy,不随页面滚动变化
            console.log(e.clientX);
            console.log(e.clientY);
            // *****返回鼠标在页面文档的xy,随页面滚动变化
            console.log(e.pageX);
            console.log(e.pageY);
            // *返回鼠标在电脑屏幕的xy
            console.log(e.screenX);
            console.log(e.screenY);
        })
    </script>

mouseover:鼠标移动时间(跟随手表小天使案例)
2.9常用键盘事件

<body>
    <script>
        //keyup按键弹起时候触发
        document.addEventListener('keyup', function() {
                console.log('我弹起了');
            })
            //keydown按键按下时候触发
        document.addEventListener('keydown', function() {
                console.log('我按下了down');
            })
            //keypress按键按下时候触发,不识别功能键,但搭配keyCode使用识别大小写
        document.addEventListener('keypress', function() {
                console.log('我按下了press');
            })
            // 执行顺序:down>press>keyup
    </script>
</body>

e.keyCode:获得按下键的ASCII码,只有press能识别大小写
第三章:BOM
3.1BOM概述
在这里插入图片描述
在这里插入图片描述
3.2窗口事件

<script>
        // 当页面所有元素加载完成后,开始执行,这样js放哪里都不影响了
        window.addEventListener('load',function(){
            alert(22);
        })
        // 当页面所有DOM元素加载完成后,开始执行,不包含图片、flash、css,
        // 执行速度较快
        window.addEventListener('DOMContentLoaded',function(){
            alert(33);
        })
    </script>

3.3调整窗口大小事件

<script>
        // resize:窗口大小调整事件
        window.addEventListener('resize', function() {
                console.log('变化了');
            })
            // window.innerWidth:获取当前页面的大小
    </script>

3.4定时器

<script>
        // setTimeout(调用函数,延迟时间),延迟可省略;
        function callback() {
            console.log('爆炸了')
        }
        var timer1 = setTimeout(callback, 3000);
        var timer2 = setTimeout(callback, 5000);
    </script>

clearTimeout(timeoutID):去除计时器;setInterval(回调函数,间隔时间):每隔多长时间再调用一次;clearInterval:去除定时器
3.5JS同步与异步
js是单线程的;js同步(按顺序进行);js异步(同步进行)
在这里插入图片描述
3.6JS执行机制
在这里插入图片描述
3.7locationd对象常见属性与方法
search:锚点;href:网址;input要设置name才能提交
在这里插入图片描述
在这里插入图片描述

  • navigator对象
    根据访问设备的不同跳转到不同的y
 if ((navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i))) {
            window.location.href = "../H5/index.html"; //手机
        }

第四章 PC端网页特效
4.1 offset偏移
在这里插入图片描述
注:要以有定位的盒子为基准;返回的数值不带单位;
在这里插入图片描述
4.2京东放大镜效果案例
外嵌式js要先添加缓存事件

window.addEventListener('load', function())

让遮罩层跟着鼠标移动`

// 获取鼠标在盒子内的坐标
        var x = e.pageX - this.offsetLeft;
        var y = e.pageY - this.offsetTop;
        // 让鼠标位于遮罩层中心处去带着移动
        mask.style.left = x - mask.offsetWidth / 2 + 'px';
        mask.style.top = y - mask.offsetWidth / 2 + 'px';

4.3client系列
在这里插入图片描述
与offset系列的不同就是含不含边框
立即执行函数`

// 立即执行函数,无需引用,立即执行
        // 创建了一个独立作用域,避免了名称冲突的问题
        // 1、(function(){})()
        // 2、(function(){}())

4.4元素滚动scroll系列
在这里插入图片描述

//如果是获得元素的被卷去元素用的element.scollTop.如果是页面的用window.pageYOffset

4.5三大系列总结
在这里插入图片描述
offset系列区别于另外两者是带边框;client区别于scroll是不包含超出部分的大小
在这里插入图片描述
4.6mouseover与mouseenter区别
相同点:都是鼠标碰上触发
在这里插入图片描述
第五章:动画
5.1d

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值