JavaScript

JavaScript

HTML、CSS只能写出静态效果,JS可以制作动态效果

  • JavaScript,是一门编程语言,浏览器内置了JavaScript语言的解释器,所以JavaScript代码在浏览器上就可以运行。
  • DOM,(Document Object Model)是指文档对象模型,通过它,可以操作HTML文档的相关功能,例如:对标签内容进行删除和替换等。
  • BOM,(Browser Object Model)是指浏览器对象模型,通过他,可以操作浏览器相关的功能,例如:浏览器设置定时器,浏览器定时刷新页面。

JavaScript是编程语言,DOM和BOM是两个模块,利用JavaScript语言再结合DOM、BOM模块可以让我们的页面出现动态的效果。

1.1 js基础

引入方式:
Script代码块,只能在当前页面使用。

    <script type="text/javascript">
    // 内部编写JavaScript代码
    </script>

独立js文件,可以被多个引入之后使用。

<script type="text/javascript" src="JavaScript文件路径"></script>

推荐把css在header引入,js代码放在body标签的底部,这样先加载页面文字和样式,体验较好。

js中单行注释用 // ;多行注释用 /* */

局部变量必须一个 var 开头,如果未使用var,则默认表示声明的是全局变量。


常见数据类型

typeof(a)查看类型

数字(Number):JavaScript中不区分整数值和浮点数值,JavaScript中所有数字均用浮点数值表示。

// 声明
var page = 111;
var age = Number(18);
var a1 = 1,a2 = 2, a3 = 3;
// 转换
parseInt("1.2");  // 将某值转换成数字,不成功则NaN
parseFloat("1.2");  // 将某值转换成浮点数,不成功则NaN
/*
NaN,非数字。可使用 isNaN(num) 来判断。
Infinity,无穷大。可使用 isFinite(num) 来判断。
*/

字符串(String)

 声明
var name = "anlnalanna";
var name = String("anlnalanna");
var age_str = String(18);
// 常用方法
var name = "anlnalanna";
names[0]                    // 索引
name.length                 // 获取字符串长度
name.trim()                 // 去除空白
name.charAt(index)          // 根据索引获取字符
name.substring(start,end)   // 根据索引获取子序列
str.toLowerCase()	str.toUperCase()    //大小写转换:
str1.indexOf('l')  str1.lastIndexOf('l')  //查询索引
str1.substr(1,2)//获取字符(1,2)
str1.substring(1,2)//获取字符(1)
str1.replace('e','a')//替换
str1.split('e')//切片
str1.concat('123')//连接

parseInt()向下取整	Math.ceil()向上取整	parseFloat 	eval //强制类型转换:

布尔类型(Boolean)

var status = true;
var status = false;
/*
在js中进行比较时,需要注意:
    ==       比较值相等
    !=       不等于
    ===      比较值和类型相等
    !===     不等于
    ||        或
    &&        且
*/

数组(Array)

//声明
var names = ['a', 'b', 'c']
var names = Array('anna', 'nana')

// 常见方法
names[0]                        // 索引
names.push(ele)                 // 尾部追加元素
var ele = names.obj.pop()       // 尾部移除一个元素
names.unshift(ele)              // 头部插入元素
var ele = obj.shift()           // 头部移除一个元素
names.splice(index,0,ele)       // 在指定索引位置插入元素
names.splice(index,1,ele)       // 指定索引位置替换元素
names.splice(index,1)           // 指定位置删除元素
names.slice(start,end)          // 切片
names.reverse()                 // 原数组反转
names.join(sep)                 // 将数组元素连接起来以构建一个字符串
names.concat(val,..)            // 连接数组
names.sort()                    // 对原数组进行排序
names.length //长度
.join给数字拼接
var arr=[1,2,3]
arr.Tostring()
arr.ValueOf()返回初始值
arr.concat()添加进数组里
arr.reverse()反转
arr.sort()排序//按照字母(转换成字符串)排序 所以25>100
points.sort(function(a, b){return a - b});//列表数字排序
arr.slice()切片

//删除子数组	x.splice(start,deleteCount,value,…)(deleteCount删除,value插入)
var a=[1,2,3,4,5,6,7];
a.splice(1,2);//[1,4,5,6,7]

  • push,pop栈操作
  • shift unshift也是栈操作:unshift在前面插入元素,shift 从前面移除元素

字典(对象Object)

// 声明
info = {
    name:'anna',
    "age":18
}
// 常用方法
var val = info['name']      // 获取
info['age'] = 20            // 修改
info['gender'] = 'male'     // 新增
delete info['age']          // 删除

其他(null、undefine)

  • null是JavaScript语言的关键字,它表示一个特殊值,常用来描述“空值”,相当于Python的None。

  • undefined是一个特殊值,表示变量声明但未定义。

var name;
console.log(typeof(name));

条件

if,else,用于判断。

var age = 18;
if(age <18){
}else if(age>=18 and 1 == 1){
}else if(age>=30){
}else{
}

switch,case,用于判断等于某些值。

var num = 18;
switch(num){
    case 10:
        console.log('未成年');
        break;
    case 18:
        console.log('成年');
        break;
    case 35:
        console.log('油腻老男人');
        break;
    case 100:
        console.log('....');
        break;
    default:
        console.log('太大了');
}

循环语句

  • for(var i in ['国产','日韩','欧美']),默认生成索引,适用于:字符串、元组、字典。

  • for(var i=0;i<10;i++),自定义索引并设置增加步长,适用于:字符串、元组。(字典索引非有序)

异常处理

在JavaScript的异常处理中有两个注意事项:

  • 主动抛异常 throw “xx” 或 throw Error({code:1000,error:’错了’})
  • catch只能破获一次,如果想要对异常精细化处理可以在catch代码块中再做类型判断。
try {
    //这段代码从上往下运行,其中任何一个语句抛出异常该代码块就结束运行
    var name = ''
}
catch (e) {
    // 如果try代码块中抛出了异常,catch代码块中的代码就会被执行。
    //e是一个局部变量,用来指向Error对象或者其他抛出的对象
}
finally {
     //无论try中代码是否有异常抛出(甚至是try代码块中有return语句),finally代码块中始终会被执行。
}

函数

JavaScript中的函数可以简单概括为以下三类:

  • 普通函数:
function func(arg){
    return arg + 1;
}
  • 匿名函数
function (arg){
    return arg + 1;
}
// 一般用于当做参数使用,例如:设置定时器 setInterval(function(){},1000)
  • 自执行函数,自动触发执行。
 (function(arg){
     console.log(arg);
 })('anna')

传入参数多了不报错,用需要的个数,少了返回NaN
json 序列化(将对象和字符串之间进行转换。)

  • JSON.stringify(object) ,序列化
  • JSON.parse(str),反序列化

网络中数据传输本质上是基于字符串进行,如果想要把一个js的对象通过网络发送到某个网站,就需要对对象进行序列化然后发送。

1.2 DOM

文档对象模型(Document Object Model,DOM)是一种用于HTML编程接口。它给文档提供了一种结构化的表示方法,可以改变文档的内容和呈现方式。更直白一点讲:DOM相当于是一个模块,提供了关于HTML文档中对标签进行操作的功能,JavaScript结合DOM可以对HTML中的标签进行操作。

DOM对象:https://www.runoob.com/jsref/dom-obj-document.html

节点:

DOM 代码必须 写在body后面。节点属性:

  • 整个文档是一个节点Document
  • 每个HTML元素是一个元素节点Element
  • HTML元素内的文本是文本节点Text
  • HTML属性是属性节点Attribute
  • 注释是注释节点comment
var ele=document.getElementsByClassName('p1')[0];
console.log(ele);
console.log('attribute',ele.attributes);
console.log('nodeType',ele.nodeType);
console.log('nodeName',ele.nodeName);
console.log('nodeValue',ele.nodeValue);
console.log('innerHTML',ele.innerHTML);	//文本包括标签
console.log('innerText',ele.innerText);	//文本不包括标签
//导航属性:
console.log(ele.parentNode);
console.log(ele.firstChild);
console.log(ele.lastChild);
console.log(ele.childNodes);
//text空文本也是节点对象
//常用导航属性:
console.log(ele.parentNode);
console.log(ele.children);
console.log(ele.firstElementChild);
console.log(ele.lastElementChild);
console.log(ele.nextElementSibling);//下一个兄弟标签元素
console.log(ele.previousElementSibling);//上一个兄弟元素标签元素
console.log(ele.childNodes);

选择器

  • 直接查找
document.getElementById(arg)             // 根据ID获取一个标签对象
document.getElementsByClassName(arg)     // 根据class属性获取标签对象集合
document.getElementsByName(arg)       // 根据name属性值获取标签对象集合
document.getElementsByTagName(arg)       // 根据标签名获取标签对象集合
  • 间接查找
var tag = document.getElementById(arg);
tag.parentElement           // 找当前标签对象的父标签对象
tag.children                // 找当前标签对象的所有子标签对象
tag.firstElementChild       // 找当前标签对象的第一个子标签对象
tag.lastElementChild        // 找当前标签对象最后一个子标签对象
tag.nextElementtSibling     // 找当前标签对象下一个兄弟标签对象
tag.previousElementSibling  // 找当前标签对象上一个兄弟标签对象

DOM 元素对象

DOM元素属性和方法:https://www.runoob.com/jsref/dom-obj-all.html

  • element.appendChild() 为元素添加一个新的子元素
  • element.removeChild() 删除一个子元素
  • element.replaceChild() 替换一个子元素
  • element.remove() 删除这个元素
  • nodelist.length 返回节点列表的节点数目。(元素之间的空格是文本,文本是节点)

如删除表格一行数据:

<td>
    <input type="button" value="删除" onclick="deleteRow(this);">
</td>

<script>
//删除表格中当前行的数据
function deleteRow(self) {
    var rowTr = self.parentElement.parentElement;
    rowTr.remove();
}
</script>

文本操作

对标签内部文本进行操作时,可以通过 innerText 和 innerHTML来进行。

  • innerText
    • 标签对象.innerText,读取标签内容(仅文本)。
    • 标签对象.innerText="an",修改标签内容(仅文本)。
  • innerHTML
    • 标签对象.innerHTML,读取标签内容(含标签)。
    • 标签对象.innerText="<a href='#'>an</a>",修改标签内容(标签、文本)。

属性对象

值操作针对与用户交互相关的标签,其中内部使用value属性进行操作。

input,textarea,select

单选框radio复选框checkbox,通过value可以取值。但在应用时常常是以选择形式出现,所以在使用过程中还会去判断他是否已被选中。
扩展:标签对象.checked可以对选中状态进行读取和设置。

var radios = document.getElementsByName('gender');
for (var i = 0; i < radios.length; i++) {
    if (radios[i].value === "male") {
        radios[i].checked = true;
    }
}

class 属性操作

DOM中主要提供了三个帮助我们操作class属性值的功能:

  • 标签对象.className,class属性对应的值直接操作。
  • 标签对象.classList.remove(cls),class属性对应值删除某个样式。
  • 标签对象.classList.add(cls),class属性中添加样式。

模态对话框

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        body{
            margin: 0;
        }
        .container{
             980px;
            margin: 0 auto;
        }
        .header{
            height: 48px;
            background-color: #499ef3;
        }
        .shade{
            position: fixed;
            top: 0;
            bottom: 0;
            left: 0;
            right: 0;
            background-color: black;
            opacity: 0.7;
        }
        .login{
             400px;
            height: 300px;
            background-color: white;
            border: 1px solid #dddddd;
            position: fixed;
            top: 60px;
            left: 50%;
            margin-left: -200px;
        }
        .hide{
            display: none;
        }
    </style>
</head>
<body>
    <div class="header">
        <div style="float: right;margin: 10px;">
            <a onclick="showDialog();" style="padding: 5px 10px;background-color: goldenrod;color: white;">登录</a>
        </div>
    </div>
    <div class="body">
        <div class="container" style="text-align: center">
            <img src="https://w.wallhaven.cc/full/ox/wallhaven-ox83gp.jpg" alt="">
        </div>
    </div>
    <!--遮罩层-->
    <div id="shade" class="shade hide"></div>
    <!--登录框-->
    <div id="login" class="login hide">
        <h2 style="text-align: center">用户登录</h2>
        <a onclick="hideDialog();" style="padding: 5px 10px;background-color: cornflowerblue;color: white;">关闭</a>
    </div>
    <script type="text/javascript">
        function showDialog() {
            document.getElementById('shade').classList.remove('hide');
            document.getElementById('login').classList.remove('hide');
        }
        function hideDialog() {
            document.getElementById('shade').classList.add('hide');
            document.getElementById('login').classList.add('hide');
        }
    </script>
</body>
</html>

style 样式操作

如果想要对样式操作的粒度更细一些,可以使用style样式操作,他比class属性对样式的操作粒度更细。

document.getElementById('header').style.backgroundColor = 'green';

点赞+1效果

function doFavor(self) {
    var plusTag = document.createElement('span');
    var fontSize = 10;
    var marginLeft = 10;
    var marginTop = 10;
    var opacity = 1;
    plusTag.innerText = "+1";
    plusTag.style.color = 'green';
    plusTag.style.position = 'absolute';
    plusTag.style.fontSize = fontSize + 'px';
    plusTag.style.marginLeft = marginLeft + 'px';
    plusTag.style.marginTop = marginTop + 'px';
    plusTag.style.opacity = opacity;
    self.appendChild(plusTag);
    var interval = setInterval(function() {
        fontSize += 5;
        marginLeft += 5;
        marginTop -= 5;
        opacity -= 0.2;
        plusTag.style.fontSize = fontSize + 'px';
        plusTag.style.marginLeft = marginLeft + 'px';
        plusTag.style.marginTop = marginTop + 'px';
        plusTag.style.opacity = opacity;
        if (opacity <= 0) {
            self.removeChild(plusTag);
            clearInterval(interval);
        }
    }, 100)
}

DOM属性对象(element.attributes[0])

//获取属性值
document.getElementsByTagName("button")[0].attributes[0].value;
//改变属性值
var h=document.getElementsByTagName("H1")[0];
h.getAttributeNode("style").value="color:green";

node的增删改

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .div1,.div2,.div3,.div4{
             400px;height: 150px}
        .div1{background: skyblue}
        .div2{background: lightgoldenrodyellow}
    </style>
</head>
<body>
    <div class="div1">
        <button onclick="add()">增加</button>
        <button onclick="del()">删除</button>
    </div>
    <div class="div2">
        <button onclick="change()">change</button>
        <p>这是P标签</p>
    </div>
</body>
<script>
    function add() {
        var ele=document.createElement("p");
        var father=document.getElementsByClassName("div1")[0];
        ele.innerHTML="hello P";//添加文本
        father.appendChild(ele);//父节点添加子节点
    }
    function del() {
        var father=document.getElementsByClassName("div1")[0];
        var son=father.getElementsByTagName("p")[0];// var son=father.lastElementChild;
        father.removeChild(son);
    }
    function change() {
        var father=document.getElementsByClassName("div2")[0];
        var img=document.createElement("img");
        img.src="1.png";
        var son=father.getElementsByTagName("p")[0];
        father.replaceChild(img,son) // father.removeChild(son);father.append(img);
    }
</script>
</html>

修改HTML内容InnerHTML和innertext

修改cssele.style.color="red";
修改属性:
img.setAttribute("src","1.png");
创建建属性:
var ele=document.createElement("p");
删除属性:
father.removeChild(son);
关于类的操作:

  • ele.className
  • ele.classList.add
  • ele.classList.remove

input的checked属性

反选:input.checked=!input.checked
其他事件:https://www.runoob.com/jsref/dom-obj-event.html


事件

DOM中可以为标签设置事件,给指定标签绑定事件之后,只要对应事件被处罚,就会执行对应代码。常见事件有:

  • onclick,单击时触发事件
  • ondblclick,双击触发事件
  • onchange,内容修改时触发事件
  • onfocus,获取焦点时触发事件
  • onblur,失去焦点触发事件
  • onsubmit 只能给表单使用
<!-- 标签上绑定的函数,this为window,不是标签,要让变成标签,要传入参数this,并且在函数中传入参数arg,调用arg  -->
<iframe frameborder="1" id="iframe" name="ifr" onload="reloadiframe()"></iframe>

默认绑定的事件先发生,再submit。如果返回false,就不会执行submit按钮的事件了

事件传播

两个嵌套的div绑定事件,两个都会执行,先执行里面的,再执行外面的,要阻止传播,使用e.stopPropagation()

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>event</title>
    <style>
        .inner{ 1000px;height:100px;background: gray}
        .outer{ 3000px;height:300px;background: indianred}
    </style>
</head>
<body>
    <div class="outer">
        <div class="inner"></div>
    </div>
</body>
<script>
    var inner=document.getElementsByClassName("inner")[0];
    var outer=document.getElementsByClassName("outer")[0];
    inner.onclick=function() {
        this.style.background="black";
        alert("inner");
        event.stopPropagation();//防止传播
    }
    outer.onclick=function () {
        alert("outer");
    }
</script>
</html>

左侧菜单点击切换:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>CSS学习</title>
    <style>
        body {
            margin: 0;
        }
        
        .header {
            height: 48px;
            background-color: #499ef3;
        }
        
        .body .menu {
            position: fixed;
            top: 48px;
            left: 0;
            bottom: 0;
             220px;
            border-right: 1px solid #dddddd;
            overflow: scroll;
        }
        
        .body .content {
            position: fixed;
            top: 48px;
            right: 0;
            bottom: 0;
            left: 225px;
            /* 超出范围的话,出现滚轮 */
            overflow: scroll;
        }
        
        .body .menu .title {
            padding: 8px;
            border-bottom: 1px solid #dddddd;
            background-color: #5f4687;
            color: white;
        }
        
        .body .menu .child {
            border-bottom: 1px solid #dddddd;
        }
        
        .body .menu .child a {
            display: block;
            padding: 5px 10px;
            color: black;
            text-decoration: none;
        }
        
        .body .menu .child a:hover {
            background-color: #dddddd;
        }
        
        .hide {
            display: none;
        }
    </style>
</head>

<body>
    <div class="header"></div>
    <div class="body">
        <div class="menu">
            <div class="item">
                <div class="title" onclick="showMenu(this);">国产</div>
                <div class="child">
                    <a href="#">少年的你</a>
                    <a href="#">我不是药神</a>
                    <a href="#">我和我的祖国</a>
                </div>
            </div>
            <div class="item">
                <div class="title" onclick="showMenu(this);">欧美</div>
                <div class="child hide ">
                    <a href="#">战争之王</a>
                    <a href="#">华尔街之狼</a>
                    <a href="#">聚焦</a>
                </div>
            </div>
        </div>
        <div class="content"></div>
    </div>
    <script type="text/javascript">
        function showMenu(self) {
            var childList = document.getElementsByClassName('child');
            for (var i = 0; i < childList.length; i++) {
                childList[i].classList.add('hide');
            }
            self.nextElementSibling.classList.remove('hide');
        }
    </script>
</body>
</html>

搜索关键字:

function getFocus(self) {
    self.className = 'black';
    if (self.value === '请输入关键字' || self.value.trim().length === 0) {
        self.value = '';
    }
}
function leave(self) {
    if (self.value.length === 0) {
        self.value = '请输入关键字';
        self.className = 'gray';
    } else {
        self.className = 'black';
    }
}

1.3 BOM

BOM(Browser Object Model)是指浏览器对象模型,通过他,可以操作浏览器相关的功能。更直白一点讲:BOM相当于是一个模块,提供了关于浏览器操作的功能。

提示框

  • alert,提示框。
  • confirm,确认框(有确认,取消)。

浏览器URL

  • location.href,获取当前浏览器URL。
  • location.href = "url",设置URL,即:重定向。
  • location.reload(),重新加载,即:刷新页面。

定时器

  • setInterval(function(){},1000),创建多次定时器。(1000为1秒)
  • clearInterval(定时器对象),删除多次定时器。
  • setTimeout(function(){},1000),创建单次定时器。
  • clearTimeout(定时器对象),删除单次定时器。

其他BOM:https://www.runoob.com/jsref/obj-window.html

原文地址:https://www.cnblogs.com/Neroi/p/12727134.html