JavaScript基础
温故而知新。
之前已经写过一点JavaScript事件的内容了,今天再来补充一点。
JavaScript事件
HTML 事件是发生在 HTML 元素上的事情。
当在 HTML 页面中使用 JavaScript 时, JavaScript 可以触发这些事件。
事件可以用于处理表单验证,用户输入,用户行为及浏览器动作:
- HTML 事件属性可以直接执行 JavaScript 代码
- HTML 事件属性可以调用 JavaScript 函数
- 你可以为 HTML 元素指定自己的事件处理程序
- 可以阻止事件的发生
HTML 事件
HTML 事件可以是浏览器行为,也可以是用户行为。
常见的HTML事件实例:
- onchange HTML的元素发生改变
- onclick 点击HTML元素
- onmouseover 在HTML元素上面移动鼠标
- onmouseout 从HTML元素上移开鼠标
- onkeydown 按下键盘按键
- onload 浏览器已完成页面加载
简单的事件实例:
还是之前已经用过多次的Date()函数来显示当前的时间
<button onclick="this.innerHTML=Date()">现在的时间是?</button>
运行结果如下图:
点击按钮后
在这个例子中我们用到了this对象,用它来实现修改自身元素的内容。
在实际的应用中不推荐使用 HTML 元素中可以添加事件属性 的方式来添加属性。因为这不符合软件工程中所讲的"高内聚,低耦合"的编程原则,高内聚是说模块内部要高度聚合,低耦合是说模块与模块之间的藕合度要尽量低。前者是说模块内部的关系,后者是说模块与模块间的关系。
监听器的使用
<input id="test" type="button" value="点我"/>
<script>
window.onload = function(){
var test = document.getElementById("test");
test.addEventListener("click",myfun2);
test.addEventListener("click",myfun1);
}
function myfun1(){
alert("hello!");
}
function myfun2(){
alert("my friend");
}
</script>
运行结果如下图
点击按钮后
点击确定后
在这个例子中我们对"click"事件设置了两个监听器,只要有"click"事件发生,就会调用监听器中方法。可以看到监听器是按照代码中的顺序从上往下执行的,这里在点击完确定后为什么在显示"hello"的弹框中会多出一行"阻止此页面创建更多对话框"呢?
这其实是火狐自带的一个功能,是为了屏蔽恶意弹窗网站设置的。如果想要取消这个设置的话可以按照以下的步骤操作:
1)在firefox里输入about:config
2)在列表框里右键->新建->整数
3)输入选项名dom.successive_dialog_time_limit,值设为0,点击确认。
一点小小的细节
JavaScript变量提升
JavaScript 中变量的声明都将被提升到函数的最顶部。也就是说变量可以在使用后声明,也就是变量可以先使用再声明。但是变量的初始化不会提升。
<p id="demo"></p>
<script>
x = 5;
elem = document.getElementById("demo"); // 查找元素
elem.innerHTML = "x 为:" + x + ",y 为:" + y; // 显示 x 和 y
var x;
var y = 7; // 初始化 y
</script>
运行结果如下
可以看到我们在声明变量x之前就使用了变量x,并且得到了正确的结果,但是对变量y我们进行了初始化的操作,所以这个变量并没有被提前,所以结果显示的是undefined,表示未被定义。
严格模式
如果你之前就有良好的编程习惯,那么建议你在使用JavaScript的时候直接使用严格模式(use strict)
<p id="demo"></p>
<script>
"use strict";
x = 5;
document.getElementById("demo").innerHTML="x为:"+x+" y为:"+y; // 查找元素
var x;
var y = 7; // 初始化 y
</script>
运行结果与上次的一致。
如果我们删掉变量x的声明
<p id="demo"></p>
<script>
"use strict";
x = 5;
document.getElementById("demo").innerHTML="x为:"+x+" y为:"+y; // 查找元素
var y = 7; // 初始化 y
</script>
再次运行,就会发现浏览器中没有任何显示
这是因为在严格模式下,使用未定义的变量会直接报错,从而导致JavaScript的代码不会执行,我们打开浏览器的查看器,点击控制台,我们可以看到报错了
上面的那一段代码不在严格模式下是可以运行并得到正确的结果的,想要尝试的小伙伴可以删掉"use strict"那一行后再运行一下即可。
严格模式下受限的地方如下:
- 不允许使用未声明的变量或对象
- 不允许删除变量或对象
- 不允许删除函数
- 不允许变量重名(在函数参数中不能有两个同名的参数)
- 不允许使用八进制(对变量赋值的时候等号右边不能是八进制数)
- 不允许使用转义字符
- 不允许对只读属性赋值
- 不允许对一个使用getter方法读取的属性进行赋值
- 不允许删除一个不允许删除的属性
- 禁止this关键字指向全局对象。(使用构造函数时,如果忘了加new,this不再指向全局对象,而是报错)
使用严格模式可以消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为:
- 消除代码运行的一些不安全之处,保证代码运行的安全
- 提高编译器效率,增加运行速度
- 为未来新版本的Javascript做好铺垫
"严格模式"体现了Javascript更合理、更安全、更严谨的发展方向,包括IE 10在内的主流浏览器,都已经支持它,许多大项目已经开始全面拥抱它。
另一方面,同样的代码,在"严格模式"中,可能会有不一样的运行结果;一些在"正常模式"下可以运行的语句,在"严格模式"下将不能运行。掌握这些内容,有助于更细致深入地理解Javascript,让你变成一个更好的程序员。
知之为知之,不知为不知。