分类 JavaScript 下的文章

变量声明

var 老的(逐渐淘汰)

let (推荐)

const 常量
var存在的问题:
1.允许变量重复声明
2.不限制修改
3.不支持块级作用域 – 函数级
let const 的优点:
1.不允许变量重复声明
2.const可以限制修改
3.支持块级作用域 – {}

块级作用域好处:
1.不容易重名
2.每个代码块都有自己的变量副本(这点对普通的if之类的影响不大,但对循环里影响特别大)

for循环里用var声明



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

<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>

<body>
    <button type="button">aaa</button>
    <button type="button">bbb</button>
    <button type="button">ccc</button>
    <script>
        let aBtn = document.querySelectorAll('button');

        for (var i = 0; i < aBtn.length; i++) {
            aBtn[i].onclick = function() {
                alert(i);
            }
        }
    </script>
    <!-- 
        {
            var i=0;
            aBtn[i].onclick = function() {
                alert(i);  // 3
            };
        }
        {
            var i=1;
            aBtn[i].onclick = function() {
                alert(i);  // 3
            };
        }
        {
            var i=2;
            aBtn[i].onclick = function() {
                alert(i);  // 3
            };
        }

        在这个循环里i 只有一个
        因为var是不带块级作用域的,所以就只有一个副本
        换句话说就是在循环过程中i都是同一个,如果其中一个变了,其他的都会变,跟着受影响

    -->

</body>

</html>

for循环里用let声明


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

<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>

<body>
    <button type="button">aaa</button>
    <button type="button">bbb</button>
    <button type="button">ccc</button>
    <script>
        let aBtn = document.querySelectorAll('button');

        for (let i = 0; i < aBtn.length; i++) {
            aBtn[i].onclick = function() {
                alert(i);
            }
        }
    </script>
    <!-- 
        {
            let i=0;
            aBtn[i].onclick = function() {
                alert(i);  // 0
            };
        }
        {
            let i=1;
            aBtn[i].onclick = function() {
                alert(i);  // 1
            };
        }
        {
            let i=2;
            aBtn[i].onclick = function() {
                alert(i);  // 2
            };
        }

        let就不一样了,它是一个块级作用域,每个代码块都有自己的变量副本。for也是一个代码块,for本身也在这个代码块当中
        在这个循环里i 一共有三个,且这些i都是完全互相不打扰的,任何一个i变了,其他的不会跟着变

    -->

</body>

</html>

变量作用域(scope)

全局

在所有函数之外声明的 – 可以在任何地方使用 (不推荐)
全局变量在任何地方都可以使用,之所以非常危险,是因为任何人都可以修改,也容易重名



let a=12;
function show(){
    alert(a);
}
show();
console.log(a);

局部

声明在函数内的变量叫做‘局部变量’ – 只能在函数内部使用



function show(){
    let a=12;
    
    alert(a);
};
show();

//报错
console.log(a);
// Uncaught ReferenceError: a is not defined

块级

if{} for{} function{} ...都是块级作用域
类似局部作用域,只不过在一定程度上分的更细了


<div id="box" class="text">使用classlist属性设置class属性</div>

使用元素的classList属性可以访问或者添加删除修改元素的class属性

element.classList

使用classList属性访问class属性


let oDiv = document.querySelector('#box');
console.log(oDiv.classList);
// DOMTokenList ["text", value: "text"]

element.classList.add()

通过classList调用add()的方法可以添加一个或者多个class属性,多个用,隔开


// 添加fonts一个class属性
oDiv.classList.add('fonts');
// 同时添加fonts和red两个class属性
oDiv.classList.add('fonts', 'red');

element.classList.remove()

remove()移除,移除一个或者多个class属性,多个用,隔开


// 删除fonts一个class属性
oDiv.classList.remove('fonts');
// 点击删除fonts和red两个class属性
oDiv.onclick = function() {
    this.classList.remove('fonts', 'red');
}

element.classList.toggle()

在元素中切换类名。
toggle()中的第一个参数必须参数,当元素中存在该指定的class属性时,将移除该class属性,反之就添加。
第二个参数为强制添加(参数为true时)或移除(参数为false时)第一个参数指定的class属性。


oDiv.classList.add('red');
oDiv.onclick = function() {
    // 切换class
    this.classList.toggle('fonts');
}

 // 强制移除一个class为fonts的属性 
oDiv.classList.toggle("fonts", false);
// 强制添加一个class为red的属性 
oDiv.classList.toggle("red", true);

element.classList.contains()

检测元素是否包含某个class 返回布尔值


// 检测元素是否包含类名为 e 的这个属性
let bool = oDiv.classList.contains('e');
console.log(bool);
// false

// 检测元素是否包含类名为 text 的这个属性
let bool = oDiv.classList.contains('text');
console.log(bool);
// true

模拟单选


<body>
    <div class="wrap">
        <h2>模拟单选</h2>
        <div class="option">
            <a href="javascript:;" class="checked">男</a>
            <a href="javascript:;">女</a>
            <a href="javascript:;">保密</a>
        </div>
    </div>
    <script>
        // 通过css选择器获取div中的所有a元素,返回一个类数组
        let oBtns = document.querySelectorAll('.option a');

        // console.log(oBtns.length);
        // 
        for (let i = 0; i < oBtns.length; i++) {
            // console.log(i);

            // oBtns获取的是一组a的类数组,既然是伪数组,就可以使用下标去获取某一个值
            // 使用循环的数值,从0开始的 i 值,每一次拿到的都是不同的a,不同的添加事件
            oBtns[i].onclick = function() {
                // 每次点击时先消除其他元素上的class
                for (let j = 0; j < oBtns.length; j++) {
                    oBtns[j].classList.remove('checked');
                }
                // 然后给点击的元素添加上class
                this.classList.add('checked');
            }
        }
    </script>
</body>

DEMO展示

模拟复选


<body>
    <div class="wrap">
        <h2>模拟复选</h2>
        <div class="option">
            <a href="javascript:;" class="checked">油桃</a>
            <a href="javascript:;">菠萝</a>
            <a href="javascript:;">葡萄</a>
        </div>
    </div>
    <script>
        let oBtns = document.querySelectorAll('.option a');

        // console.log(oBtns.length);
        for (let i = 0; i < oBtns.length; i++) {
            oBtns[i].onclick = function() {
                this.classList.toggle('checked');
            }
        }
    </script>
</body>

DEMO展示


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

<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>

<body>
    <div id="box" class="box1">
        <a href="#">html</a>
        <a href="#">css</a>
        <a href="#">javascript</a>
    </div>
</body>

</html>

getElementById

通过id去获取元素


document.getElementById('box')

querySelector

可以使用它们的 id, , 类型, 属性, 属性值等来选取元素


// 使用id去选中
document.querySelector('#box')

// 使用class去选中
document.querySelector('.box1')

// 使用元素去选中
document.querySelector('div')

// 使用父子元素去选中的写法
document.querySelector('body div')
// 使用父子元素去选中div下的a元素时,querySelector只返回匹配的第一个元素
document.querySelector('.box1 a')

querySelectorAll

document.querySelectorAll()方法返回文档中与指定的CSS选择器或者标签等匹配的所有元素


// 获取页面中所有的 <a> 元素
document.querySelectorAll('a');

// 获取id为box元素下所有的 <a>  元素
let oAs = document.querySelectorAll('#box a');
console.log(oAs.length);

// 获取class为box1元素下所有的 <a>  元素
let oAs = document.querySelectorAll('.box1 a');
// 设置第二个a元素的字体颜色为白色
oAs[1].style.color = '#fff';

Javascript语法规范

既然要实现静态HTML页面的某些动态效果,就要引入JavaScript。书写之前至少要了解怎样在HTML页面中引入JavaScript。这样才能知道在哪编程Javascript了!
Javascript 书写位置
JavaScript的引用共有4种,与css类似,直接嵌入到html页面中
1,页头引入(head标签内);
2,页中引入(body标签内);
2,页尾引入(html标签内以及标签外);
3,元素事件中引入(标签属性中引入);
4,引入外部JS文件;
例如:

<!DOCTYPE html>
<html>
        <!--
            脚本放置位置问题:
            理论上,可以将javascript代码放在网页的任何地方.
            如果在打开网页要立即执行脚本的话,需要放到调用它的代码之前
            对于不需要一载入页面就开始执行的javascriptdiamante,可以将器放在head中,这样一般是某个事件函数,当事件触发的时候就会执行.
            根据javascript dom编程艺术书中说法,放在body结束标签和html结束标签之间,是一个不错的做法,因为javascript往往是操作DOM树,
            这样可以确保在javascript开始执行的时候,DOM树加载完毕。
        -->
    <head>
        <meta charset="utf-8" />
        <title>javascript的引用方式</title>
<!--
<script type="text/javascript">……</script>格式是固定的,JavaScript代码必须在<script></script>标签内编写,并且必须设置type属性值为“text/javascript”。
-->
        <script type="text/javascript">
        //这里编写JavaScript程序
        </script>
    </head>

    <body>
        <script type="text/javascript">
        //这里编写JavaScript程序
        </script>
       <!--         
       文件调用:JavaScript代码写到另一个文件当中(其后缀通常为“.js”),然后用格式为“<script src="javascript.js"></script>”的标记把它嵌入到文档中
       -->
        <script src="js1.js" type="text/javascript" charset="utf-8"></script>
    </body>
        <script type="text/javascript">
        //这里编写JavaScript程序
        </script>
</html>

JavaScript的转义字符及注释

\":转双引
\':转单引
\n:转换行(不常用)
\r:转回车(不常用)
//:单行注释
/* */:多行注释

写一个简单的JavaScript程序。

程序永远的Hello, world


<script type="text/javascript">
    document.write("Hello, world");
</script>

简单的JavaScript程序


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>一个简单的javascript程序</title>
    <script type="text/javascript">
        function entermes()
        {
            alert("你好!Xiaomo blog")
        }
        window.onload=entermes();
    </script>
</head>
<body>
    
</body>
</html>

JavaScript的概念

JavaScript一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言,内置支持类型。它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标准通用标记语言下的一个应用)网页上使用,用来给HTML网页增加动态功能.
解释:
1,动态语言

动态语言,是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化。JavaScript便是一个动态语言。除此之外如Ruby、Python等也都属于动态语言,而C、C++等语言则不属于动态语言。比如在JavaScript中可以在对象定义之后动态的为其添加属性和方法
2,脚本语言

脚本语言是为了缩短传统的编写-编译-链接-运行(edit-compile-link-run)过程而创建的计算机编程语言,只在被调用时进行解释或编译,然后执行。它的命名起源于一个脚本“screenplay”,每次运行都会使对话框逐字重复。早期的脚本语言经常被称为批量处理语言或工作控制语言。

3,弱类型

弱/强类型指的是语言类型系统的类型检查的严格程度,弱类型的语言在声明变量的时候不必进行变量类型的确定,语言的运行时会隐式做数据类型转换,对于弱类型语言来说,不同类型的变量可以进行直接运算,而强类型的则不可以。

什么是JavaScript?

JavaScript 是在互联网上最流行的脚本语言,这门语言可用于 HTML 和 web,更可广泛用于服务器、PC、笔记本电脑、平板电脑和智能手机等设备。JavaScript,就是我们通常所说的JS,是一种嵌入到HTML页面中的脚本语言,由浏览器一边解释一边执行。

为什么学习javascript?

因为在Web世界里,HTML页面是静态的(只供浏览),只有JavaScript能跨平台、跨浏览器驱动网页,与用户交互。把静态的页面转换成支持用户交互并响应相应事件的动态页面。
HTML、CSS和JavaScript的关系如下(W3c规范):
☞结构标准(网页的结构) html
☞表现标准(网页的外观) css
☞行为标准(页面的行为) js

关于JavaScript

JavaScript的组成:
ECMAScript:JavaScript的语法标准。
DOM:JavaScript操作网页上的元素的API
BOM:JavaScript操作浏览器的部分功能的API
JavaScript的组成

Javascript 使用范围:
客户端数据计算
客户端表单合法性验证
浏览器对象的调用
浏览器事件的触发
网页特殊显示效果制作
.....

JavaScript的特点:

1.解释性脚本语言,javascript不需要编译,只需要嵌入到html代码中,由浏览器逐行加载解释执行。
2.javascript是一种基于对象的语言,使用已经创建好的对象来,和面向对象的先锋需设计语言不同,javascript并不支持继承和重载。
3.语言简单,弱类型,语法和java,C语言类似,变量不需要声明和指定类型即可使用,是一种弱类型语言。
4.javascript语言相对来说比较安全,仅由浏览器执行,不允许javascript访问本地硬盘,以及操作服务器上的数据,只用来显示浏览器的网页效果和实时交互。
5.动态性,使用javascript可以在前端实现一些和服务器完全没有联系的效果,javascript采用事件驱动的方式进行,html页面的相关控件的相关事件在处触发的时候会自动执行响应的脚本或者函数。
6.运行环境一般来说是浏览器,只需要浏览器支持即可,如果不支持(或者用户禁用了javascript),浏览器会忽略掉这些javascript代码。