【JavaScript】DOM1级 2级事件及 BOM 对象 Window History Location Document

一、事件

在 JavaScript 中,事件是与用户交互或系统操作相关的动作。事件机制允许开发者在用户与网页交互时做出响应,比如点击按钮、键入文本或滚动页面。

网页中的每个元素都可以通过行为触发相应的事件,如:点击按钮 —> 产生事件 —> 执行操作。

事件的三要素是:事件源、事件、事件处理程序

  • 事件源:触发事件的元素(谁触发了事件)
  • 事件类型:如 click 单击事件(触发了什么事件)
  • 事件处理程序:事件触发后要执行的代码(函数形式),也称事件处理函数(触发事件以后要做什么)

1-1 DOM Level 0

DOM0 级事件是最初的 DOM 事件处理模型,它仅通过 HTML 属性来处理事件。这是最早期的事件处理机制,通常被称为“传统事件处理”。一个 DOM 对象同一个事件类型只能绑定一个事件处理函数,如果有多个就会覆盖。不支持事件捕获(即事件传播的阶段)和事件移除功能。

使用方式

  • 直接在 HTML 元素中使用事件处理属性,如 onclickonmouseover 等。
  • 可以在 JavaScript 中直接给 DOM 元素的事件属性赋值来指定事件处理程序。
<!-- 在 HTML 中直接指定事件处理程序 -->
<button onclick="alert('Button clicked')">Click Me</button>

<!-- 在 JavaScript 中设置事件处理程序 -->
<script>
    document.getElementById('myButton').onclick = function() {
        alert('Button clicked');
    };
</script>

onload

onload 事件在页面或资源(如图像、脚本或样式表)完全加载完成后触发。对于整个页面,这意味着所有的 HTML 内容、样式、脚本以及图像等资源都已经完全加载和解析。

页面加载完成时执行代码

<body onload="alert('页面加载完成!')">
    <h1>欢迎来到我的网站</h1>
</body>

加载图像时执行代码

<body>
    <img id="myImage" src="example.jpg" alt="Example Image">
    <script>
        var myImage = document.getElementById("myImage");
        myImage.onload = function() {
            alert("图像加载完成!");
        };
    </script>
</body>

onload 事件在页面中所有资源都加载完毕时才会触发,因此它适用于需要确保所有资源都准备好的操作,例如初始化脚本。

鼠标事件

onclick

单击事件,双击事件与事件解绑

<body>
    <button id="btn">点击</button>
    <script>
        var btn = document.getElementById("btn");
        // 点击事件
        btn.onclick = function () {
            alert("click - 1");
        } 
        // 双击事件
        btn.ondblclick = function () {
            alert("click - 2");
        } 
        // 事件属性上绑定一个null以达到解绑作用
        // btn.onclick = null; 
    </script>
</body>
onmouseover

鼠标悬停事件

<body>
    <div id="hoverArea">将鼠标悬停在这里</div>
    <script>
        var hoverArea = document.getElementById("hoverArea");
        hoverArea.onmouseover = function() {
            alert("鼠标悬停在区域上!");
        };
    </script>
</body>

键盘事件

  • onkeydown 事件在用户按下键时触发
  • onkeyup 事件在用户释放键时触发
  • onkeypress 事件则在按下并释放键时触发,主要用于处理字符输入。
  • onkeypress 主要用于处理可打印的字符; onkeydownonkeyup 适用于捕获所有类型的键盘事件。
onkeydown

键盘按下事件

<body>
    <input id="textInput" type="text" placeholder="按下键盘上的任何键">
    <script>
        var textInput = document.getElementById("textInput");
        textInput.onkeydown = function(event) {
            alert("按下的键码是:" + event.keyCode);
        };
    </script>
</body>
onkeyup

键盘释放事件

<body>
    <input id="textInput" type="text" placeholder="释放键盘上的任何键">
    <script>
        var textInput = document.getElementById("textInput");
        textInput.onkeyup = function(event) {
            alert("释放的键码是:" + event.keyCode);
        };
    </script>
</body>
onkeypress

键盘按下并释放

使用 onkeypress 事件来显示用户按下的键。用户在输入框中按下并释放一个键时,displayKey 函数会显示所按的键的字符。

<body>
    <form>
        <label for="inputField">Type something:</label>
        <input type="text" id="inputField" onkeypress="displayKey(event)">
    </form>
    <div id="keyDisplay"></div>
    <script>
        function displayKey(event) {
            var key = String.fromCharCode(event.charCode);
            document.getElementById('keyDisplay').textContent = 'You pressed: ' + key;
        }
    </script>
</body>

表单事件

onsubmit

表单提交事件

<body>
    <form id="myForm">
        <input type="text" placeholder="输入内容">
        <input type="submit" value="提交">
    </form>
    <script>
        var form = document.getElementById("myForm");
        form.onsubmit = function(event) {
            event.preventDefault(); // 阻止表单提交
            alert("表单提交被拦截!");
        };
    </script>
</body>
onchange

表单元素事件

<!-- 输入框值变化时执行代码 -->
<body>
    <input id="myInput" type="text" placeholder="输入一些内容">
    <script>
        var myInput = document.getElementById("myInput");
        myInput.onchange = function() {
            alert("输入框的值已经改变为:" + myInput.value);
        };
    </script>
</body>
<!-- 下拉菜单选择变化时执行代码 -->
<body>
    <select id="mySelect">
        <option value="1">选项 1</option>
        <option value="2">选项 2</option>
        <option value="3">选项 3</option>
    </select>
    <script>
        var mySelect = document.getElementById("mySelect");
        mySelect.onchange = function() {
            alert("选择的值是:" + mySelect.value);
        };
    </script>
</body>

onchange 事件通常在控件的值被修改并失去焦点时触发。对于文本输入框,如果希望在用户每次输入时都能触发事件,可以考虑使用 oninput 事件。

onblur

元素失去焦点

使用 onblur 事件来验证输入框的内容。用户在输入框失去焦点时,validateInput 函数会被调用。如果输入框的值为空,会弹出一个警告框。

<body>
    <form>
        <label for="username">Username:</label>
        <input type="text" id="username" onblur="validateInput()">
    </form>
    <script>
        function validateInput() {
            var input = document.getElementById('username');
            if (input.value.trim() === '') {
                alert('Username cannot be empty.');
            }
        }
    </script>
</body>
onfocus

元素获得焦点

使用 onfocus 事件来提示用户输入信息。当用户点击或聚焦在输入框上时,showTooltip 函数会显示一个提示框。当用户离开输入框时,hideTooltip 函数会隐藏提示框。

<style>
#tooltip {display: none;background-color: #f9f9f9;border: 1px solid #ccc;padding: 5px;position: absolute;z-index: 1;}
</style>
<body>
    <form>
        <label for="username">用户名: </label>
        <input type="text" id="username" onfocus="showTooltip()" onblur="hideTooltip()">
        <div id="tooltip">请输入用户名......</div>
    </form>
    <script>
        function showTooltip() {
            var tooltip = document.getElementById('tooltip');
            tooltip.style.display = 'block';
        }

        function hideTooltip() {
            var tooltip = document.getElementById('tooltip');
            tooltip.style.display = 'none';
        }
    </script>
</body>

1-2 DOM Level 1

DOM1 级事件是 DOM 事件模型的一个扩展,它引入了 addEventListener 方法,用于更灵活和强大的事件处理。允许一个元素绑定多个事件处理程序,而不像 DOM0 级事件那样只允许一个事件处理程序(对于相同类型的事件)。

  • 提供了更多的事件控制选项,比如事件捕获和事件冒泡。
  • 提供了 removeEventListener 方法来移除事件处理程序。
<button id="myButton">Click Me</button>
<script>
    // 使用 addEventListener 绑定事件处理程序
    document.getElementById('myButton').addEventListener('click', function() {
        alert('Button clicked');
    });

    // 还可以添加多个处理程序
    document.getElementById('myButton').addEventListener('click', function() {
        console.log('Another handler');
    });
</script>

二、BOM 对象

BOM(Browser Object Model)浏览器对象模型

BOM 提供了独立于内容的、可以与浏览器窗口进行互动的对象结构

在这里插入图片描述

BOM 可实现功能

  • 弹出新的浏览器窗口

  • 移动、关闭浏览器窗口以及调整窗口的大小

  • 页面的前进、后退

2-1 Window 对象

window 对象是浏览器中最顶级的对象,它代表了浏览器窗口,并且在全局作用域中所有的全局变量和函数都作为 window 对象的属性存在。

常用属性

属性名称说明
history有关客户访问过的 URL 的信息
location有关当前 URL 的信息
window.属性名 = "属性值"
window.location = "http://www.baidu.com";      

常用方法

方法名称说明
prompt()显示可提示用户输入的对话框
alert()显示带有一个提示信息和一个确定按钮的警示框
confirm()显示一个带有提示信息、确定和取消按钮的对话框
close()关闭浏览器窗口
open()打开一个新的浏览器窗口,加载给定 URL 所指定的文档
setTimeout()在指定的毫秒数后调用函数或计算表达式
setInterval( )按照指定的周期(以毫秒计)来调用函数或表达式
// confirm() 将弹出一个确认对话框
confirm("对话框中显示的纯文本")
<script type="text/javascript">
    var flag = confirm("确认要删除此条信息吗?");
    if(flag == true)
        alert("删除成功!");
    else
        alert("你取消了删除");
</script>

confirm()alert()prompt() 区别

  • alert( ):一个参数,仅显示警告对话框的消息,无返回值,不能对脚本产生任何改变
  • prompt( ):两个参数,输入对话框,用来提示用户输入一些信息,单击“取消”按钮则返回null,单击“确定”按钮则返回用户输入的值,常用于收集用户关于特定问题而反馈的信息
  • confirm( ):一个参数,确认对话框,显示提示对话框的消息、“确定”按钮和“取消”按钮,单击“确定”按钮返回true,单击“取消”按钮返回false,因此与if-else语句搭配使用
// open() 打开一个新选项卡
window.open(url, windowName, windowFeatures);

弹出层组件 layer

layer 组件通常指的是一种用于创建弹出层、对话框或者模态窗口(modal)的前端UI组件。这类组件能够帮助开发者轻松地在网页上添加各种类型的浮层效果,如提示信息、确认框、加载层等。

2-2 History 对象

属性描述
length返回历史列表中的网址数
方法描述
back()加载 history 列表中的前一个 URL
forward()加载 history 列表中的下一个 URL
go()加载 history 列表中的某个具体页面
history.back()    == 等价 ==> history.go(-1)   浏览器中的“后退”
history.forward() == 等价 ==> history.go(1)    浏览器中的“前进”
<body>
    <a href="index.html">点我跳转到首页</a>
    <button id="btn1">点击前进一页</button>
    <button id="btn2">点击后退一页</button>
    
    <script>
        var btn1 = document.querySelector('#btn1')
        var btn2 = document.querySelector('#btn2')
        btn1.onclick = function (){
            history.forward() // history.go(1)
        }
		btn2.onclick = function () {
            history.back() // history.go(-1)
        }    
    </script>
</body>

2-3 Location 对象

常用属性

属性描述
location.search返回 URL 的查询字符串部分,包括问号 ?
location.hash返回 URL 的哈希部分,包括井号 #
location.host返回 URL 的主机部分,包括端口号(如果有的话)
location.hostname返回 URL 的主机名部分(不包括端口号)
location.href返回整个 URL 或设置 URL
location.pathname返回 URL 的路径部分
location.port返回 URL 的端口号部分(如果有的话)
location.protocol返回 URL 的协议部分(例如 http:https:
location.origin返回当前页面的原始 URL 的基础部分 包含协议、主机名(和端口号,如果有的话)
// 1、location.search
console.log(window.location.search); // 例如: "?query=123"

// 2、location.hash
console.log(window.location.hash); // 例如: "#section"

// 3、location.host
console.log(window.location.host); // 例如: "example.com:80"

// 4、location.hostname
console.log(window.location.hostname); // 例如: "example.com"

// 5、location.href
console.log(window.location.href); // 例如: "https://example.com/path?query=123"

// 6、location.pathname
console.log(window.location.hostname); // 例如: "example.com"

// 7、location.port
console.log(window.location.port); // 例如: "80"

// 8、location.protocol
console.log(window.location.protocol); // 例如: "https:"

// 9、location.origin
// 假设当前页面的 URL 是 "https://example.com:8080/path/page.html"
console.log(window.location.origin); // 输出: "https://example.com:8080"

常用方法

方法描述
assign(url)将浏览器的当前 URL 修改为指定的 URL
reload(forcedReload)重新加载当前页面。如果 forcedReload 参数为 true,则强制从服务器重新加载
replace(url)将浏览器的当前 URL 修改为指定的 URL,但不会在历史记录中留下记录
<body>
    <button>点我跳转百度</button>
    <button>点我跳转有道</button>
    <button>点我跳转csdn</button>
    <button>点我刷新</button>

    <script>
        var btn = document.querySelectorAll('button')
        btn[0].onclick = function () {
            location.href = 'https://www.baidu.com/'
        }
        btn[1].onclick = function () {
            location.assign('https://fanyi.youdao.com/')
        }
        btn[2].onclick = function () {
            location.replace('https://www.csdn.net/')
            // 不记录历史记录,直接替换当前页面
        }
        btn[3].onclick = function () {
            location.reload(true)
            // true 强制从服务器端重新获取当前资源(ctrl+f5)
            // false 浏览器是从缓存中读取内容
        }
    </script>
</body>

location 和 history 对象的应用

<a href="javascript:location.href='https://www.baidu.com/'">百度</a>
<a href="javascript:history.back()">后退</a>
<a href="javascript:history.forward()">前进</a>
<a href="javascript:location.reload()">刷新本页</a>

2-4 Document 对象

常用属性

属性描述
referrer返回载入当前文档的 URL
URL返回当前文档的 URL

应用

  • 判断页面是否是链接进入
  • 自动跳转到登录页面
var preUrl = document.referrer;  //载入本页面文档的地址
if(preUrl == ""){	
      document.write("<h2>您还未登录,5秒后将自动跳转到登录页面</h2>");
      setTimeout("javascript:location.href='login.html'",5000);
}

常用方法

querySelectorgetElement* 系列方法(如 getElementById, getElementsByClassName, getElementsByTagName, getElementsByName)都是用于在DOM中选择元素的方法,但它们在功能和使用方式上有一些重要的区别。

方法描述补充
getElementById(id)返回对拥有指定id的第一个对象的引用对象的 id 唯一
getElementsByName(name)返回带有指定名称的对象的集合相同 name 属性
getElementsByTagName(tagName)返回带有指定标签名的对象的集合相同的元素
getElementsByClassName(className)返回带有指定类名的对象的集合相同类名的元素
querySelector(selector)返回文档中第一个匹配指定CSS选择器的元素支持复杂的CSS选择器
querySelectorAll(selectors)返回文档中所有匹配指定CSS选择器的元素返回静态的NodeList
write()向文档写文本、HTML 表达式或 JavaScript 代码

使用 getElementsByNamegetElementsByTagName 方法来获取表单输入元素的值,并将这些值拼接成一个字符串,然后插入到页面中的某个元素里

<body>
    <form>
        <input type="text" name="season" value="Spring">
        <input type="text" name="season" value="Summer">
        <input type="text" name="season" value="Autumn">
        <input type="text" name="season" value="Winter">
    </form>

    <div id="replace"></div>

    <script>
        // 使用 getElementsByName
        var aInputByName = document.getElementsByName("season");
        if (aInputByName) {
            var sStrByName = Array.from(aInputByName).map(input => input.value).join('  ');
            document.getElementById("replace").innerHTML = "By Name: " + sStrByName;
        }

        // 使用 getElementsByTagName
        var aInputByTag = document.getElementsByTagName("input");
        if (aInputByTag) {
            var sStrByTag = Array.from(aInputByTag).map(input => input.value).join('  ');
            document.getElementById("replace").innerHTML += "<br>By Tag: " + sStrByTag;
        }
    </script>
</body>

使用 getElementsByClassName 方法将获取所有具有特定类名的元素,并将它们的值或内容拼接成一个字符串,然后插入到页面中的某个元素里

<body>
    <div class="item">Item 1</div>
    <div class="item">Item 2</div>
    <div class="item">Item 3</div>

    <div id="result"></div>

    <script>
        // 使用 getElementsByClassName 获取所有 class 为 "item" 的元素
        var items = document.getElementsByClassName("item");

        // 初始化一个空字符串来存储结果
        var resultStr = "";

        // 遍历所有找到的元素
        for (var i = 0; i < items.length; i++) {
            // 将每个元素的内容添加到结果字符串中,并在每个元素之间添加换行符
            resultStr += items[i].innerHTML + "<br>";
        }

        // 将结果字符串设置为 id 为 "result" 的元素的 innerHTML
        document.getElementById("result").innerHTML = resultStr;
    </script>
</body>

querySelector 返回文档中第一个匹配指定CSS选择器的元素。如果没有找到匹配的元素,则返回 null

语法:document.querySelector(selector)

// 获取第一个具有 "example" 类名的元素
var element = document.querySelector(".example");

// 获取 ID 为 "uniqueId" 的元素
var elementById = document.querySelector("#uniqueId");

// 获取所有具有 "data-category='fruit'" 属性的第一个元素
var fruitElement = document.querySelector("[data-category='fruit']");

querySelectorAll 允许使用 CSS 选择器来选取文档中的多个元素。方法返回一个静态的 NodeList

语法:document.querySelectorAll(selectors);

// 获取所有 class 为 "item" 的元素
var items = document.querySelectorAll(".item");

// 获取所有 class 为 "item" 或 "highlight" 的元素
var elements = document.querySelectorAll(".item, .highlight");

// 获取 id 为 "container" 下的所有 class 为 "item" 的元素
var items = document.querySelectorAll("#container .item");
单个元素对象(直接使用[返回具体的标签元素,不需要用序号取值])集合(需要通过[序号]来获取对应的节点)
document.getElementById()document.getElementsByClassName()
不兼容IE9以下的
document.querySelector()
不兼容IE7及以下的浏览器
document.getElementsByTagName()
不兼容IE7及以下的浏览器
document.querySelectorAl1()
不兼容IE7及以下的浏览器

document.write 直接操作整个文档,用于将指定的字符串写入到文档中。如果在文档加载完成后调用,它会覆盖整个文档。

// 在文档中写入内容
document.write('<p>这是一个段落。</p>');
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值