全栈 - 21 Web基础 网页的关节JS
这是全栈数据工程师养成攻略系列教程的第二十一期:21 Web基础 网页的关节JS。
我们已经了解了Web三件套中的HTML和CSS,现在让我们来学习下最后的JS。
什么是JS
JS的全称是JavaScript,但是和Java关系并不大。之所以将JS比如网页的关节,是因为JS可以动态地操作DOM元素,例如插入和删除DOM元素,或者修改已有元素的样式和内容等。
JS是Web网页中的脚本编程语言,因此可以用JS来完成一些任务,例如实现一些数值计算,或者编写Web网页中的事件响应函数。Web网页中的事件包括鼠标悬浮、鼠标点击、鼠标滚动、键盘输入等,可以使用JS监听这些事件,并且在事件发生时进行相应的操作和处理,从而实现动态的页面更新和用户交互。
使用JS
使用JS的方法有两种:引入外部.js文件;直接在HTML中写JS。
如同引入外部.css文件一样,可以新建一个script.js文件,然后在里面编写JS代码,例如输入console.log("Hello World!");
,然后在HTML的head
中使用script
标签引入,src
属性指定了.js文件的相对路径。
<script src="script.js"></script>
运行写好的HTML文件,打开Chrome的开发者工具,在Console标签页中即可看到打印出来的Hello World!
。console.log()
是JS提供的打印函数,好比Python的print
,可以在Web网页中打印变量并进行调试。
如果是直接在HTML中写JS代码,则如同CSS的style
标签一样,JS代码需要写在script
标签之中,script
标签可以放在HTML网页的任意位置,每条JS代码之后应当使用分号;
结束。
<script>
console.log("Hello World!");
</script>
JS基础
在实际项目中我们一般很少直接写原生JS代码,因为已经有相当多的JS高级封装框架。这些框架在原生JS语法的基础上进一步开发,能够提供更方便更丰富的功能,例如后续章节中将介绍的JQuery,以及目前十分流行的Angular.js
、React.js
和Vue.js
等前端框架。尽管如此,我们仍需要了解一些JS基础内容。
使用document.write()
可以向body
中写入DOM元素,以下代码向body
中添加了一个h1
标签。不过这一函数比较鸡肋,因为无法灵活地控制写入的内容和位置。
document.write('<h1>Hello World!</h1>');
和Python一样,JS也是一种弱变量类型的编程语言。使用关键字var
声明一个变量,声明时无需指定其变量类型。和Python一样,JS中常用的基础变量类型包括数值(整数、浮点数)和字符串。//
表示JS注释,如同Python中的#
一样。
var a = 1; // 整数
var b = 1.1; // 浮点数
var c = 'Hello'; //字符串
console.log(a, b, c);
Python中用列表和字典分别来存储序列和键值对,在JS中同样有相应的数据结构,只不过是换了个名称,分别叫做数组和对象。它们的使用方法,包括声明、添加元素、访问元素、修改元素和删除元素等,和Python中的列表和字典都是大同小异的。
var d = []; // 数组
// 添加元素
// Python中的列表是append()
d.push(1);
d.push(2);
console.log(d);
// 打印下标为1,即第二个元素
console.log(d[1]);
// 数组长度,Python中是用len()
console.log(d.length);
var e = {}; // 对象
// 添加key和value
e['k1'] = 1;
e['k2'] = 2;
e['k3'] = 'Hello';
console.log(e);
console.log(e['k1']);
在Chrome开发者工具的Console标签页中可以进行调试并观察打印信息,可以看到数组和对象分别是用Array[]
和Object{}
表示的。
使用document.getElementById()
可以根据给定的ID获取相应的DOM元素并返回一个DOM对象,假设我们在body
里面写了一个h1
标签:
<h1 id="title">标题内容</h1>
然后便可以在JS中通过document.getElementById()
函数搜索并获取到这个h1
。通过操作变量t
,我们可以对相应的h1
标签进行一些操作,例如获取其文本内容、修改其文本内容、向其中添加DOM元素、将其删除等。
var t = document.getElementById('title');
console.log(t);
再来看一下onclick
,即DOM元素的鼠标点击响应事件。以下代码以button
标签为例,当鼠标点击这一按钮时,刚才提到的h1
标签文本将发生变化。HTML部分代码如下,可以将onclick
当作DOM元素的属性来理解,当鼠标点击这一按钮时,将触发JS中定义的myFunc()
函数。
<h1 id="title">标题内容</h1>
<button type="button" onclick="myFunc()">点我</button>
JS部分代码如下,首先我们需要定义myFunc()
函数。JS使用function
定义函数,和Python中的函数一样,也是将一些可重用的代码定义成函数,从而通过调用函数即可方便地执行一系列代码。JS函数也支持提供参数,从而根据提供的参数完成更灵活更复杂的功能。在DOM对象之后使用.
可以访问其自带的一些内部属性和函数,例如innerHTML
属性即DOM对象的HTML内容,可以设置为纯文本,也可以在其中包含HTML标签。编写代码并刷新网页,可以发现点击按钮之后,h1
标签的内容将会被替换成两个p
。
function myFunc (argument) {
var t = document.getElementById('title');
t.innerHTML = '<p>按钮被点击了</p><p>按钮被点击了</p>';
}
因此,我们可以大概总结出JS动态操作DOM元素的流程。要么一开始直接在script
中进行相关操作,要么通过onclick
等属性绑定相应的事件响应函数,然后在响应函数里完成一些操作,从而实现动态交互的网页效果。
JS中的运算符包括算术运算符、比较运算符、赋值运算符、逻辑运算符等,和Python类似。
JS中也有条件和循环,分别使用小括号()
和大括号{}
显式指定判断条件和主体部分,而Python则是依靠适当的缩进来隐式指定。对于条件,需要注意,但凡出现if
的地方都必须加上判断条件。JS循环以for
循环为主,可以用来遍历数组和对象。
// 条件
if (a == 1) {
console.log('a equal 1');
}
else {
console.log('a not equal 1');
}
if (a == 1) {
console.log('a equal 1');
}
else if (a == 2) {
console.log('a equal 2');
}
else {
console.log('a not equal 1, 2');
}
// 循环遍历数组
for (var i = 0; i < d.length; i++) {
console.log(i, d[i]);
}
// 循环遍历对象
for (var key in e) {
console.log(key, e[key]);
}
现在我们应该能逐渐体会到各种编程语言的一些通性,虽然不同的编程语言都有各自的特点和强项,但核心的编程思想都是相通和类似的,不同的无非只是一些使用上的细节。因此,熟练掌握一门自己最习惯使用的编程语言,同时了解其他多门辅助的编程语言,对于提高自己的理解能力和编程能力都是有很有帮助的。
除了以上提及的鼠标点击事件,JS中还支持很多其他类型的事件,例如鼠标悬浮、鼠标滚动、键盘输入等,我们将在后续介绍JQuery的时候再进行详细讨论。
补充学习
关于JS的更多内容可以参考以下链接,http://www.runoob.com/js/js-tutorial.html,里面提供了更为详细和系统的讲解,并结合大量实例代码加以巩固,推荐完整地浏览和尝试一遍。
掌握HTML、CSS、JS三件套之后,我们对Web基础内容应当具备了一个大致的了解。后续的学习内容包括一些进阶知识,例如基于JS、可以更加方便操作DOM元素的JQuery。Bootstrap是一款轻量的前端封装,包括CSS和JS两部分。前者提供了一些写好的CSS class,这样我们通过class的名称便可以快速使用写好的样式;后者基于JS提供了一些封装好的可以直接使用的网页动态功能,例如标签页、模态框和轮播等,如果我们自己使用原生的JS代码去实现这些动态效果,往往需要耗费更多时间和代码。
当然,前端所涉及的内容非常之多,新的好用的框架也层出不穷、不断迭代,例如之前提及的Angular.js
、React.js
和Vue.js
等。Web后端可选的框架则更为丰富,基于PHP、Python、NodeJs、Java等都可以搭建Web后端。不断学习新的知识是好事,但是应当打好Web基础,并分别熟练掌握至少一种前端框架和后端框架,这样在后续通过Web网站实现动态交互的数据可视化时,才能得心应手地实现想要的效果。
视频链接:网页的关节JS