JavaScript进阶

六眼飞鱼酱① 提交于 2019-12-05 07:39:12

第一节 JavaScript的DOM

JavaScript主要包括三部分内容:ECMAScript、DOM、BOM

1.1 DOM概述

通过 HTML DOM,使用 JavaScript访问 HTML 文档的所有元素, 当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model)

HTML DOM模型被构造为对象的树

通过可编程的对象模型,JavaScript 获得了足够的能力来创建动态的 HTML

  1. JavaScript 能够改变页面中的所有 HTML 元素。
  2. JavaScript 能够改变页面中的所有 HTML 属性。
  3. JavaScript 能够改变页面中的所有 CSS 样式。
  4. JavaScript 能够对页面中的所有事件做出反应。

1.2 获取HTML元素

通常,通过 JavaScript,您需要操作 HTML 元素, 为了做到这件事情,您必须首先找到该元素

  1. 通过 id 找到 HTML 元素
  2. 通过标签名找到 HTML 元素
  3. 通过类名找到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

  1. 浏览器对象模型 (BOM) 使 JavaScript 有能力与浏览器"对话"。
  2. 浏览器对象模型 (BOM):(Browser Object Model)尚无正式标准。
  3. 由于现代浏览器已经(几乎)实现了 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>
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!