php 页面销毁事件,JS注册事件和销毁事件

本节示例讲解 JavaScript 事件的注册和销毁。

注册事件

在 DOM 事件模型中,通过调用对象的 addEventListener() 方法注册事件。用法如下:

element.addEventListener(String type, Function listener, boolean useCaptrue);

参数说明如下:

type:注册事件的类型名。事件类型与事件属性不同,事件类型名没有 on 前缀。例如,对于事件属性 onclick 来说,所对应的事件类型为 click。

listener:监听函数,即事件处理函数。在指定类型的事件发生时将调用该函数。在调用这个函数时,默认传递给它的唯一参数是 event 对象。

useCaptrue:是一个布尔值。如果为 true,则指定的事件处理函数将在事件传播的捕获阶段触发;如果为 false,则事件处理函数将在冒泡阶段触发。

【示例1】下面示例使用 addEventListener() 为所有按钮注册 click 事件。首先,调用 document 的 getElementsByTagName() 方法捕获所有按钮对象;然后,使用 for 语句遍历按钮集(btn),并使用 addEventListener() 方法分别为每一个按钮注册事件函数,获取当前对象所显示的文本。

按 钮 1

按 钮 2

var btn = document.getElementsByTagName("button"); //捕获所有按钮

for(var i in btn){                    //遍历按钮集合

btn[i].addEventListener("click", function(){

alert(this.innerHTML);

}, true);   //为每个按钮对象注册一个事件处理函数,定义在捕获阶段进行响应

}

在浏览器中预览,单击不同的按钮,则浏览器会自动显示按钮的名称。效果如图所示:

27fc6ac92cbf95c2b5195ca895994e0f.gif

使用 addEventListener() 方法能够为多个对象注册相同的事件处理函数,也可以为同一个对象注册多个事件处理函数。为同一个对象注册多个事件处理函数对于模块化开发非常有用。

【示例2】在下面示例中,为段落文本注册两个事件:mouseover 和 mouseout。当光标移到段落文本上面时会显示为蓝色背景,而当光标移出段落文本时会自动显示为红色背景。这样就不需要破坏文档结构为段落文本增加多个事件属性。

为对象注册多个事件

var p1 = document.getElementById("p1"); //捕获段落元素的句柄

p1.addEventListener("mouseover", function () {

this.style.background = 'blue';

}, true); //为段落元素注册第1个事件处理函数

p1.addEventListener("mouseout", function () {

this.style.background = 'blue';

}, true); //为段落元素注册第2个事件处理函数

IE 事件模型使用 attachEvent() 方法注册事件。用法如下:

element.attachEvent(etype, eventName)

参数列表如下:

etype:设置事件类型,如 onclick、onkeyup、onmousemove 等。

eventName:设置时间名称,也就是事件处理函数。

【示例3】在下面示例中,为段落标签

注册两个事件:mouseover 和 mouseout,设计当光标经过时,段落文本背景色显示为蓝色,当光标移开之后,背景色显示为红色。

为对象注册多个事件

var p1 = document.getElementById("p1"); //捕获段落元素

p1.attachEvent("onmouseover", function () {

this.style.background = 'blue';

}); //注册mouseover事件

p1.attachEvent("onmouseout", function () {

this.style.background = 'red';

}); //注册mouseout事件

使用 attachEvent() 注册事件时,其事件处理函数的调用对象不再是当前事件对象本身,而是 window 对象,因此事件函数中的 this 就指向 window,而不是当前对象,如果要获取当前对象,应该使用 event 的 srcElement 属性。

IE 事件模型中的 attachEvent() 方法第 1 个参数为事件类型名称,需要加上 on 前缀,而使用 addEventListener() 方法时,则不需要这个 on 前缀,如 click。

销毁事件

在 DOM 事件模型中,使用 removeEventListener() 方法可以从指定对象中删除已经注册的事件处理函数。用法如下:

element.removeEventListener(String type, Function listener, boolean useCaptrue);

参数说明如下:

type:注册事件的类型名。事件类型与事件属性不同,事件类型名没有 on 前缀。例如,对于事件属性 onclick 来说,所对应的事件类型为 click。

listener:监听函数,即事件处理函数。在指定类型的事件发生时将调用该函数。在调用这个函数时,默认传递给它的唯一参数是 event 对象。

useCaptrue:是一个布尔值。如果为 true,则指定的事件处理函数将在事件传播的捕获阶段触发;如果为 false,则事件处理函数将在冒泡阶段触发。

【示例1】在下面示例中,分别为按钮 a 和按钮 b 注册 click 事件,其中按钮 a 的事件函数为 ok(),按钮 b 的事件函数为 delete_event()。在浏览器中预览,当单击“点我”按钮将弹出一个对话框,在不删除之前这个事件时一直存在的。当单击“删除事件”按钮之后,“点我”按钮将失去任何效果。

var a = document.getElementById("a"); //获取按钮a

var b = document.getElementById("b"); //获取按钮b

function ok(){ //按钮a的事件处理函数

alert("您好,欢迎光临!");

}

function delete_event(){ //按钮b的事件处理函数

a.removeEventListener("click",ok,false); //移出按钮a的click事件

}

a.addEventListener("click",ok,false); //默认为按钮a注册事件

b.addEventListener("click",delete_event,false); //默认为按钮b注册事件

演示效果如下图所示:

4bd5a39bd3e69c22511cded44f93f2a3.gif

removeEventListener() 方法只能删除 addEventListener() 方法注册的事件。如果使用 onclick 等直接卸载元素上的事件,将无法使用 removeEventListener() 方法删除。

当临时注册一个事件时,可以在处理完毕之后迅速删除它,这样能够节省系统资源。

IE 事件模型使用 detachEvent() 方法注销事件。用法如下:

element.detachEvent(etype, eventName)

参数说明如下:

etype:设置事件类型,如 onclick、onkeyup、onmousemove 等。

eventName:设置时间名称,也就是事件处理函数。

由于 IE 怪异模式不支持 DOM 事件模型,为了保证页面的兼容性,开发时需要兼容两种事件模型,以实现在不同浏览器中具有相同的交互行为。

【示例2】下面示例设计段落标签

仅响应一次光标经过行为。当第 2 个光标经过段落文本时所注册的事件不再有效。

IE 事件注册

var p1 = document.getElementById("p1"); //捕获段落元素

var f1 = function () { //定义事件处理函数1

p1.style.background = 'blue';

};

var f2 = function () { //定义事件处理函数2

p1.style.background = 'red';

p1.detachEvent("onmouseover", f1); //当触发mouseout事件后,注销mouseover事件

p1.detachEvent("onmouseout", f2); //当触发mouseout事件后,注销mouseout事件

};

p1.attachEvent("onmouseover", f1); //注册mouseover事件

p1.attachEvent("onmouseout", f2); //注册mouseout事件

【示例3】为了能够兼容 IE 事件模型和 DOM 事件模型,下面示例使用 if 语句判断当前浏览器支持的事件处理模型,然后分别使用 DOM 注册方法和 IE 注册方法为段落文本注册 mouseover 和 mouseout 两个事件。当触发 mouseout 事件之后,再把 mouseover 和 mouseout 事件注销掉。

IE 事件注册

var p1 = document.getElementById("p1"); //捕获段落元素

var f1 = function () { //定义事件处理函数1

p1.style.background = 'blue';

};

var f2 = function () { //定义事件处理函数2

p1.style.background = 'red';

if (p1.detachEvent) { //兼容IE事件模型

p1.detachEvent("onmouseover", f1); //注销事件mouseover

p1.detachEvent("onmouseout", f2); //注销事件mouseout

} else { //兼容DOM事件模型

p1.removeEventListener("mouseover", f1); //注销事件mouseover

p1.removeEventListener("mouseout", f2); //注销事件mouseout

}

};

if (p1.attachEvent) {

p1.attachEvent("onmouseover", f1);

p1.attachEvent("onmouseout", f2);

} else {

p1.addEventListener("mouseover", f1);

p1.addEventListener("mouseout", f2);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以提供一些示例代码供您参考。请注意,这些代码只是示例,需要根据实际情况进行调整。 1. 创建数据库和用户表 在 MySQL 中创建一个名为“email”的数据库,并创建一个名为“users”的表,包含以下字段: ```sql CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(255) NOT NULL, `password` varchar(255) NOT NULL, `email` varchar(255) NOT NULL, `created_at` datetime NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ``` 2. 注册页面 ```html <!DOCTYPE html> <html> <head> <title>注册页面</title> </head> <body> <h1>注册页面</h1> <form action="register.php" method="post"> <label for="username">用户名:</label> <input type="text" name="username" id="username" required><br> <label for="password">密码:</label> <input type="password" name="password" id="password" required><br> <label for="confirm_password">确认密码:</label> <input type="password" name="confirm_password" id="confirm_password" required><br> <label for="email">邮箱:</label> <input type="email" name="email" id="email" required><br> <input type="submit" value="注册"> </form> </body> </html> ``` 在 register.php 文件中,我们需要对用户提交的数据进行验证,并将其添加到“users”表中: ```php <?php // 连接数据库 $host = 'localhost'; $username = 'root'; $password = ''; $dbname = 'email'; $conn = new mysqli($host, $username, $password, $dbname); if ($conn->connect_error) { die('连接失败:' . $conn->connect_error); } // 处理用户提交的数据 $username = $_POST['username']; $password = $_POST['password']; $confirm_password = $_POST['confirm_password']; $email = $_POST['email']; // 验证用户名和邮箱是否已被注册 $sql = "SELECT * FROM users WHERE username='$username' OR email='$email'"; $result = $conn->query($sql); if ($result->num_rows > 0) { echo '用户名或邮箱已被注册'; } else { // 验证密码和确认密码是否一致 if ($password !== $confirm_password) { echo '密码和确认密码不一致'; } else { // 添加用户到数据库 $created_at = date('Y-m-d H:i:s'); $sql = "INSERT INTO users (username, password, email, created_at) VALUES ('$username', '$password', '$email', '$created_at')"; if ($conn->query($sql) === TRUE) { echo '注册成功'; } else { echo '注册失败:' . $conn->error; } } } // 关闭数据库连接 $conn->close(); ?> ``` 3. 登录页面 ```html <!DOCTYPE html> <html> <head> <title>登录页面</title> </head> <body> <h1>登录页面</h1> <form action="login.php" method="post"> <label for="username">用户名:</label> <input type="text" name="username" id="username" required><br> <label for="password">密码:</label> <input type="password" name="password" id="password" required><br> <input type="submit" value="登录"> </form> </body> </html> ``` 在 login.php 文件中,我们需要验证用户名和密码是否正确,并使用 session 保存用户信息: ```php <?php session_start(); // 连接数据库 $host = 'localhost'; $username = 'root'; $password = ''; $dbname = 'email'; $conn = new mysqli($host, $username, $password, $dbname); if ($conn->connect_error) { die('连接失败:' . $conn->connect_error); } // 处理用户提交的数据 $username = $_POST['username']; $password = $_POST['password']; // 验证用户名和密码是否正确 $sql = "SELECT * FROM users WHERE username='$username' AND password='$password'"; $result = $conn->query($sql); if ($result->num_rows > 0) { // 保存用户信息到 session $_SESSION['username'] = $username; $_SESSION['password'] = $password; echo '登录成功'; } else { echo '用户名或密码错误'; } // 关闭数据库连接 $conn->close(); ?> ``` 4. 邮箱页面 ```html <!DOCTYPE html> <html> <head> <title>邮箱页面</title> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script> <script> $(document).ready(function() { // 每隔 5 秒钟自动刷新邮件列表 setInterval(function() { $('#email-list').load('email-list.php'); }, 5000); }); </script> </head> <body> <h1>欢迎,<?php echo $_SESSION['username']; ?></h1> <a href="logout.php">注销</a> <h2>邮件列表</h2> <div id="email-list"> <?php include 'email-list.php'; ?> </div> </body> </html> ``` 在 email-list.php 文件中,我们可以从数据库中获取邮件列表,并使用正则表达式解析邮件内容: ```php <?php // 连接数据库 $host = 'localhost'; $username = 'root'; $password = ''; $dbname = 'email'; $conn = new mysqli($host, $username, $password, $dbname); if ($conn->connect_error) { die('连接失败:' . $conn->connect_error); } // 获取邮件列表 $username = $_SESSION['username']; $sql = "SELECT * FROM users WHERE username='$username'"; $result = $conn->query($sql); if ($result->num_rows > 0) { $row = $result->fetch_assoc(); $email = $row['email']; // 模拟邮件列表 $emails = array( array( 'sender' => 'test@test.com', 'subject' => '测试邮件', 'body' => '这是一封测试邮件。', 'date' => '2021-07-01 10:00:00', ), array( 'sender' => 'example@example.com', 'subject' => '示例邮件', 'body' => '这是一封示例邮件。', 'date' => '2021-07-01 11:00:00', ), ); // 显示邮件列表 foreach ($emails as $email) { echo '<div>'; echo '<strong>发件人:</strong>' . $email['sender'] . '<br>'; echo '<strong>主题:</strong>' . $email['subject'] . '<br>'; echo '<strong>时间:</strong>' . $email['date'] . '<br>'; echo '<a href="email.php?sender=' . urlencode($email['sender']) . '&subject=' . urlencode($email['subject']) . '">查看</a>'; echo '</div>'; } } else { echo '用户不存在'; } // 关闭数据库连接 $conn->close(); ?> ``` 在 email.php 文件中,我们可以从 URL 参数中获取邮件内容,并使用正则表达式解析邮件内容: ```php <?php // 获取 URL 参数 $sender = urldecode($_GET['sender']); $subject = urldecode($_GET['subject']); // 解析邮件内容 $body = ''; if (preg_match('/From: (.*)\r\n/', $email, $matches)) { $body .= '<strong>发件人:</strong>' . $matches[1] . '<br>'; } if (preg_match('/Subject: (.*)\r\n/', $email, $matches)) { $body .= '<strong>主题:</strong>' . $matches[1] . '<br>'; } if (preg_match('/Date: (.*)\r\n/', $email, $matches)) { $body .= '<strong>时间:</strong>' . $matches[1] . '<br>'; } if (preg_match('/\r\n\r\n(.*)/', $email, $matches)) { $body .= '<strong>内容:</strong>' . nl2br($matches[1]) . '<br>'; } // 显示邮件内容 echo $body; ?> ``` 5. 注销功能 在 logout.php 文件中,我们可以使用 session_destroy() 函数销毁 session,实现注销功能: ```php <?php session_start(); session_destroy(); header('Location: login.php'); ?> ``` 以上就是一个基本的邮箱网站的实现,包括注册登录、邮箱页面、邮件列表、邮件内容和注销功能。当然,具体的实现方式还需要根据实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值