第一节 JavaScript的DOM
JavaScript主要包括三部分内容:ECMAScript、DOM、BOM
1.1 DOM概述
通过 HTML DOM,使用 JavaScript访问 HTML 文档的所有元素, 当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model)
HTML DOM模型被构造为对象的树
通过可编程的对象模型,JavaScript 获得了足够的能力来创建动态的 HTML
- JavaScript 能够改变页面中的所有 HTML 元素。
- JavaScript 能够改变页面中的所有 HTML 属性。
- JavaScript 能够改变页面中的所有 CSS 样式。
- JavaScript 能够对页面中的所有事件做出反应。
1.2 获取HTML元素
通常,通过 JavaScript,您需要操作 HTML 元素, 为了做到这件事情,您必须首先找到该元素
- 通过 id 找到 HTML 元素
- 通过标签名找到 HTML 元素
- 通过类名找到HTML 元素
1.2.1 id找到HTML元素
在 DOM 中查找 HTML 元素的最简单的方法,是通过使用元素的 id, 本例查找 id="intro" 元素:
var x=document.getElementById("intro");
如果找到该元素,则该方法将以对象(在 x 中)的形式返回该元素, 如果未找到该元素,则x将包含 null。
1.2.2 标签名找到 HTML 元素
本例查找 id="main" 的元素,然后查找 id="main" 元素中的所有 < p> 元素
var x=document.getElementById("main");
var y=x.getElementsByTagName("p");
1.2.3 类名找到HTML 元素
本例通过 getElementsByClassName 函数来查找 class="intro" 的元素
var x=document.getElementsByClassName("intro");
1.3 修改HTML
HTML DOM 允许 JavaScript 改变 HTML 元素的内容
1.3.1 改变HTML内容
修改 HTML 内容的最简单的方法时使用 innerHTML 属性, 如需改变 HTML 元素的内容, 请使用这个语法
document.getElementById("id").innerHTML="abcd";
<html>
<body>
<p id="p1">Hello World!</p>
<script type="text/javascript">
document.getElementById("p1").innerHTML = "abcd";
</script>
</body>
</html>
1.3.2 改变HTML属性
如需改变 HTML 元素的属性,请使用这个语法: document.getElementById("id").attribute=新属性值
<!DOCTYPE html>
<html>
<body>
<img id="image" src="1.gif">
<script>
document.getElementById("image").src="2.jpg";
</script>
</body>
</html>
1.4 修改CSS样式
改变HTML的样式: 如需改变 HTML 元素的样式, 请使用这个语法: document.getElementById("id").style.property=新样式
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<p id="p1">Hello World!</p>
<p id="p2">Hello World!</p>
<script>
document.getElementById("p2").style.color="blue";
</script>
<p>以上段落通过脚本修改。</p>
</body>
</html>
1.5 元素操作
1.5.1 创建新元素
如需向 HTML DOM 添加新元素,您必须首先创建该元素(元素节点),然后向一个已存在的元素追加该元素
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<div id="div1">
<p id="p1">这是一个段落。</p>
<p id="p2">这是另一个段落。</p>
</div>
<script>
var para=document.createElement("p");
var node=document.createTextNode("这是一个新段落。");
para.appendChild(node);
var element=document.getElementById("div1");
element.appendChild(para);
</script>
</body>
</html>
也可以使用insertBefore进行插入
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<input type="button" value="创建元素" onclick="click1()">
<script type="text/javascript">
function click1() {
// document.getElementById("box").appendChild(img1);
var span1 = document.getElementById("span1");
document.getElementById("box").insertBefore(img1, span1);
}
</script>
</body>
</html>
1.5.2 删除已有的 HTML 元素
以下代码演示了如何删除元素
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<div id="div1">
<p id="p1">这是一个段落。</p>
<p id="p2">这是另一个段落。</p>
</div>
<script>
var parent=document.getElementById("div1");
var child=document.getElementById("p1");
parent.removeChild(child);
</script>
</body>
</html>
1.6 DOM事件
HTML DOM 允许我们通过触发事件来执行代码, 比如以下事件: 元素被点击, 页面加载完成, 输入框被修改;
本例改变了 id="id1" 的 HTML 元素的样式, 当用户点击按钮时:
<!DOCTYPE html>
<html>
<body>
<h1 id="id1">myH1</h1>
<button type="button" onclick="document.getElementById('id1').style.color='red'"> button</button>
</body>
</html>
HTML DOM 允许您使用 JavaScript 来向 HTML 元素分配事件
<script>
document.getElementById("myBtn").onclick=function(){
document.getElementById("myhead2").style.color='blue';
};
</script>
onload 和 onunload 事件会在用户进入或离开页面时被触发,onload 事件可用于检测访问者的浏览器类型和浏览器版本, 并基于这些信息来加载网页的正确版本
<body onload="alert('页面加载完毕')"></body>
onchange 事件常结合对输入字段的验证来使用
<input type="text" id="fname" onchange="upperCase()">
onmouseover 和 onmouseout 事件可用于在用户的鼠标移至 HTML 元素上方或移出元素时触发函数
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<div onmouseover="mOver(this)" onmouseout="mOut(this)" style="background-color:#D94A38;width:120px;height:20px;padding:40px;">Mouse Over Me</div>
<script>
function mOver(obj){
obj.innerHTML="Thank You"
}
function mOut(obj){
obj.innerHTML="Mouse Over Me"
}
</script>
</body>
</html>
1.7 EventListener
- addEventListener() 方法: 在用户点击按钮时触发监听事件, 该方法用于向指定元素添加事件句柄,添加的事件句柄不会覆盖已存在的事件句柄, 可以向同个元素添加多个同类型的事件句柄, 可以向任何 DOM 对象添加事件监听, 不仅仅是 HTML 元素
- removeEventListener() : 移除事件的监听
语法
element.addEventListener(event, function, useCapture);
- 第一个参数是事件的类型 (如 "click" 或 "mousedown"), 把on去掉
- 第二个参数是事件触发后调用的函数。
- 第三个参数是个布尔值用于描述事件是冒泡还是捕获, 该参数是可选的。
- 注意: 不要使用 "on" 前缀, 使用 "click", 而不是使用 "onclick"。
element.removeEventListener("mousemove", myFunction);
事件传递有两种方式: 冒泡与捕获
事件传递定义了元素事件触发的顺序, 如果你将 < p> 元素插入到 < div> 元素中,用户点击 < p> 元素, 哪个元素的 "click" 事件先被触发呢?
冒泡
内部元素的事件会先被触发, 然后再触发外部元素,即:< p> 元素的点击事件先触发, 然后会触发 < div> 元素的点击事件
捕获
外部元素的事件会先被触发, 然后才会触发内部元素的事件, 即:< div> 元素的点击事件先触发, 然后再触发 < p> 元素的点击事件
addEventListener() 方法可以指定 "useCapture" 参数来设置传递类型
默认值为 false, 即冒泡传递, 当值为 true 时, 事件使用捕获传递。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<input id="btn1" type="button" value="普通按钮" />
<div id="div1" style="width: 200px; height: 200px; background-color: skyblue;">
<p id="p1" style="width: 100px; height: 100px; background-color: bisque;"></p>
</div>
<script type="text/javascript">
function f1() {
console.log("hello");
}
document.getElementById("btn1").addEventListener("click", f1);
document.getElementById("btn1").addEventListener("click", function () {
console.log("world");
});
document.getElementById("btn1").addEventListener("click", function () {
console.log("java");
});
document.getElementById("btn1").removeEventListener("click", f1);
document.getElementById("div1").addEventListener("click", function () {
console.log("你点击了div1");
}, false);
document.getElementById("p1").addEventListener("click", function () {
console.log("你点击了p1");
// 阻止冒泡
event.stopPropagation();
});
</script>
</body>
</html>
第二节 JavaScript的BOM
- 浏览器对象模型 (BOM) 使 JavaScript 有能力与浏览器"对话"。
- 浏览器对象模型 (BOM):(Browser Object Model)尚无正式标准。
- 由于现代浏览器已经(几乎)实现了 JavaScript 交互性方面的相同方法和属性,因此常被认为是 BOM 的方法和属性。
2.1 window
所有浏览器都支持 window 对象, 它表示浏览器窗口, 所有 JavaScript 全局对象、函数以及变量均自动成为 window 对象的成员, 全局变量是 window 对象的属性,全局函数是 window 对象的方法, 甚至 HTML DOM 的 document 也是 window 对象的属性之一
window.document.getElementById("header");
// 等价
document.getElementById("header");
2.1.1 window尺寸
实用的 JavaScript 方案(涵盖所有浏览器)
var w=window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth;
var h=window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight;
2.1.2 window方法
- window.open() - 打开新窗口
- window.close() - 关闭当前窗口
2.2 screen
- 可用宽度: screen.availWidth 属性返回访问者屏幕的宽度, 以像素计, 减去界面特性, 比如窗口任务栏, 返回您的屏幕的可用宽度
- 可用高度: screen.availHeight 属性返回访问者屏幕的高度, 以像素计, 减去界面特性, 比如窗口任务栏, 返回您的屏幕的可用高度
2.3 location
window.location 对象用于获得当前页面的地址 (URL), 并把浏览器重定向到新的页面, 在编写时可不使用 window 这个前缀
具体实例
- location.href 属性返回当前页面的 URL。
- location.hostname 返回 web 主机的域名
- location.pathname 返回当前页面的路径和文件名
- location.port 返回 web 主机的端口 (80 或 443)
- location.protocol 返回所使用的 web 协议(http:// 或 https: //)
- location.assign() 方法加载新的文档
2.4 history
window.history 对象包含浏览器的历史, 在编写时可不使用 window 这个前缀, 为了保护用户隐私, 对 JavaScript 访问该对象的方法做出了限制。
具体实例
- history.back() - 与在浏览器点击后退按钮相同
- history.forward() - 与在浏览器中点击按钮向前相同
2.5 navigator
window.navigator对象在编写时可不使用 window 这个前缀
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<div id="example"></div>
<script>
txt = "<p>浏览器代号: " + navigator.appCodeName + "</p>";
txt+= "<p>浏览器名称: " + navigator.appName + "</p>";
txt+= "<p>浏览器版本: " + navigator.appVersion + "</p>";
txt+= "<p>启用Cookies: " + navigator.cookieEnabled + "</p>";
txt+= "<p>硬件平台: " + navigator.platform + "</p>";
txt+= "<p>用户代理: " + navigator.userAgent + "</p>";
txt+= "<p>用户代理语言: " + navigator.systemLanguage + "</p>";
document.getElementById("example").innerHTML=txt;
</script>
</body>
</html>
第三节 JavaScript计时
3.1 Date对象
var d=new Date();
document.write(d);
document.write("<br/>");
document.write("年份:"+(d.getYear()+1900));
document.write("<br/>");
document.write("年份:"+d.getFullYear());
document.write("<br/>");
document.write("月份:"+(d.getMonth()+1));
document.write("<br/>");
document.write("日期:"+d.getDate());
document.write("<br/>");
document.write("小时:"+d.getHours());
document.write("<br/>");
document.write("分钟:"+d.getMinutes());
document.write("<br/>");
document.write("秒:"+d.getSeconds());
3.2 JavaScript计时函数
- setInterval()周期执行函数, 间隔指定的毫秒数不停地执行指定的代码
- clearInterval() 方法用于停止 setInterval() 方法执行的函数代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script type="text/javascript">
var i = 0;
function show() {
document.write(i);
i++;
if (i === 10){
clearInterval(tid);
}
}
var tid = setInterval("show()", 1000);
</script>
</body>
</html>
- setTimeout() 延迟执行函数, 延迟执行指定的函数,只能执行一次
- clearTimeout() 方法用于停止执行setTimeout()方法的函数代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="div1"></div>
<script type="text/javascript">
var num = 1;
function show() {
var div1 = document.getElementById("div1");
div1.innerHTML = num;
num++;
setTimeout("show()", 1000);
}
setTimeout("show()", 5000);
</script>
</body>
</html>
动态显示时间
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="clock"></div>
<input id="btn1" type="button" value="暂停" onclick="stoptime()">
<input id="btn2" type="button" value="开始" onclick="starttime()" disabled ="disabled">
<script type="text/javascript">
var clock = document.getElementById("clock");
var btn1 = document.getElementById("btn1");
var btn2 = document.getElementById("btn2");
function showtime() {
var d = new Date();
var year = d.getFullYear();
var month = d.getMonth() + 1;
var day = d.getDate();
var h = d.getHours();
var m = d.getMinutes();
var s = d.getSeconds();
clock.innerHTML = "<h2>"+year+"-"+month+"-"+day+" "+h+":"+m+":"+s+"</h2>";
}
var tid = setInterval("showtime()", 1000);
function stoptime() {
clearInterval(tid);
btn2.disabled = false;
btn1.disabled = true;
}
function starttime() {
tid = setInterval("showtime()", 1000);
btn1.disabled = false;
btn2.disabled = true;
}
</script>
</body>
</html>