JavaScript学习教程,从入门到精通,JavaScript BOM (Browser Object Model) 详解(18)
JavaScript BOM (Browser Object Model) 详解
1. BOM 介绍
BOM (Browser Object Model) 是浏览器对象模型,它提供了独立于内容而与浏览器窗口进行交互的对象。BOM的核心对象是window,它表示浏览器的一个实例。
BOM包含的主要对象:
- window:浏览器窗口
- navigator:浏览器信息
- screen:显示器信息
- history:浏览器历史记录
- location:URL信息
2. window 对象
window对象是BOM的核心,所有全局JavaScript对象、函数和变量自动成为window对象的成员。
全局变量和函数
var globalVar = "我是全局变量"; // 等同于 window.globalVarfunction globalFunc() {console.log("我是全局函数");
}
// 等同于 window.globalFunc()
3. 全局作用域
在全局作用域中声明的变量和函数都会成为window对象的属性和方法。
// 示例:全局作用域
var a = 10;
console.log(window.a); // 10function test() {console.log("测试函数");
}
window.test(); // "测试函数"
4. 系统对话框
浏览器提供了三种系统对话框:
- alert()
- confirm()
- prompt()
alert() 示例
// 显示警告框
window.alert("这是一个警告信息"); // 简写为 alert("这是一个警告信息")
confirm() 示例
// 显示确认框,返回布尔值
let isConfirmed = confirm("你确定要删除吗?");
if (isConfirmed) {console.log("用户点击了确定");
} else {console.log("用户点击了取消");
}
prompt() 示例
// 显示提示框,返回用户输入的字符串
let userName = prompt("请输入你的名字", "默认名字");
if (userName !== null) {console.log(`你好, ${userName}`);
} else {console.log("用户取消了输入");
}
5. 打开和关闭窗口
window.open() 方法
// 打开新窗口
let newWindow = window.open("https://www.example.com", // URL"exampleWindow", // 窗口名称"width=400,height=300" // 窗口特性
);// 检查窗口是否被阻止
if (newWindow === null) {alert("弹出窗口被浏览器阻止了!");
}
window.close() 方法
// 关闭当前窗口
function closeCurrentWindow() {if (confirm("确定要关闭窗口吗?")) {window.close();}
}// 关闭之前打开的窗口
if (newWindow && !newWindow.closed) {newWindow.close();
}
6. 窗口位置
获取窗口位置
// 跨浏览器获取窗口位置
let windowLeft = window.screenLeft !== undefined ? window.screenLeft : window.screenX;
let windowTop = window.screenTop !== undefined ? window.screenTop : window.screenY;console.log(`窗口位置 - 左: ${windowLeft}, 上: ${windowTop}`);
移动窗口位置
// 移动窗口到指定位置
function moveWindowTo(x, y) {window.moveTo(x, y); // 绝对位置// window.moveBy(dx, dy); // 相对当前位置移动
}// 使用示例
moveWindowTo(100, 200);
7. 窗口大小
获取窗口大小
// 跨浏览器获取视口大小
let viewportWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
let viewportHeight = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;console.log(`视口大小 - 宽: ${viewportWidth}, 高: ${viewportHeight}`);// 获取屏幕大小
console.log(`屏幕大小 - 宽: ${screen.width}, 高: ${screen.height}`);
调整窗口大小
// 调整窗口大小
function resizeWindow(width, height) {window.resizeTo(width, height); // 绝对大小// window.resizeBy(dWidth, dHeight); // 相对当前大小调整
}// 使用示例
resizeWindow(500, 400);
8. 框架操作
访问框架
<!-- HTML框架示例 -->
<frameset cols="25%,50%,25%"><frame name="leftFrame" src="left.html"><frame name="mainFrame" src="main.html"><frame name="rightFrame" src="right.html">
</frameset>
// 访问框架
let leftFrame = window.frames["leftFrame"]; // 或 window.leftFrame// 在框架中访问父窗口
if (window.parent !== window) {// 当前窗口是框架console.log("当前窗口是框架");
}// 访问顶层窗口
let topWindow = window.top;
iframe 操作
<!-- iframe示例 -->
<iframe id="myIframe" src="https://www.example.com" width="600" height="400"></iframe>
// 获取iframe元素
let iframe = document.getElementById("myIframe");// 访问iframe内容
iframe.onload = function() {try {let iframeDoc = iframe.contentDocument || iframe.contentWindow.document;console.log("iframe加载完成", iframeDoc.title);} catch (e) {console.log("跨域访问被拒绝");}
};// 改变iframe src
function changeIframeSrc(url) {iframe.src = url;
}
9. 示例:第三方跳转
/*** 第三方跳转函数* @param {string} url - 要跳转的URL* @param {string} [target="_blank"] - 打开方式 (_blank, _self, _parent, _top)* @param {Object} [features] - 窗口特性 (width, height等)*/
function redirectToThirdParty(url, target = "_blank", features = null) {// 安全检查 - 验证URLif (!url || typeof url !== "string") {console.error("无效的URL");return;}// 简单的URL格式验证try {new URL(url); // 如果URL无效会抛出错误} catch (e) {console.error("URL格式不正确:", e.message);return;}// 如果是新窗口且有特性参数if (target === "_blank" && features) {let featuresStr = Object.entries(features).map(([key, value]) => `${key}=${value}`).join(",");window.open(url, target, featuresStr);} else {// 普通跳转window.location.href = url;}// 记录跳转console.log(`跳转到第三方网站: ${url}`);
}// 使用示例1: 简单跳转
redirectToThirdParty("https://www.google.com");// 使用示例2: 在新窗口中打开并指定大小
redirectToThirdParty("https://www.baidu.com","_blank",{ width: 800, height: 600 }
);// 使用示例3: 在当前窗口打开
redirectToThirdParty("https://github.com", "_self");
防止跳转劫持的安全措施
// 安全跳转函数 - 防止跳转劫持
function safeRedirect(url, delay = 0) {// 显示用户控制界面const redirectInfo = document.createElement("div");redirectInfo.style.position = "fixed";redirectInfo.style.top = "0";redirectInfo.style.left = "0";redirectInfo.style.width = "100%";redirectInfo.style.backgroundColor = "#ffeb3b";redirectInfo.style.padding = "10px";redirectInfo.style.textAlign = "center";redirectInfo.style.zIndex = "1000";redirectInfo.style.boxShadow = "0 2px 5px rgba(0,0,0,0.2)";redirectInfo.innerHTML = `<p>即将跳转到: ${url}</p><button id="continueRedirect">继续跳转</button><button id="cancelRedirect">取消跳转</button><span id="countdown">${delay}</span>秒后自动跳转`;document.body.appendChild(redirectInfo);// 倒计时功能let remaining = delay;const countdownElement = document.getElementById("countdown");const countdownInterval = setInterval(() => {remaining--;countdownElement.textContent = remaining;if (remaining <= 0) {clearInterval(countdownInterval);performRedirect();}}, 1000);// 按钮事件document.getElementById("continueRedirect").addEventListener("click", () => {clearInterval(countdownInterval);performRedirect();});document.getElementById("cancelRedirect").addEventListener("click", () => {clearInterval(countdownInterval);document.body.removeChild(redirectInfo);});function performRedirect() {document.body.removeChild(redirectInfo);window.location.href = url;}
}// 使用示例
safeRedirect("https://www.example.com", 5);
以上代码提供了BOM相关功能的全面实现,包括窗口操作、对话框、框架操作等,并且包含了详细的注释和安全措施。
以下是基于BOM(浏览器对象模型)的具体开发案例,结合了窗口操作、对话框、定时器等核心功能,并附有详细代码注释:
一、窗口操作案例
1. 新窗口创建与内容注入
// 创建新窗口并写入内容
const newWindow = window.open('', 'demoWindow', 'width=600,height=400');
if (newWindow) {newWindow.document.write('<h1>新窗口内容</h1><p>通过BOM动态生成</p>');// 5秒后自动关闭窗口setTimeout(() => newWindow.close(), 5000);
} else {alert('弹出窗口被浏览器阻止!');
}
功能:通过window.open()创建新窗口并注入HTML内容,5秒后自动关闭。
2. 窗口居中显示
function openCenteredWindow(url, width, height) {const left = (screen.width - width) / 2;const top = (screen.height - height) / 2;window.open(url, '', `width=${width},height=${height},left=${left},top=${top}`);
}
功能:计算屏幕居中坐标,打开指定大小的窗口。
二、对话框与用户交互
1. 表单提交确认
document.querySelector('form').addEventListener('submit', (e) => {const isConfirmed = confirm('确认提交数据吗?');if (!isConfirmed) e.preventDefault(); // 取消提交
});
功能:提交前弹出确认框,避免误操作。
2. 输入验证提示
const age = prompt('请输入您的年龄', '18');
if (age >= 18) {alert('欢迎访问成人内容!');
} else {window.location.href = 'https://child-safe-site.com';
}
功能:通过prompt获取用户输入并跳转不同页面。
三、定时器与动态效果
1. 倒计时跳转页面
let countdown = 10;
const timer = setInterval(() => {document.getElementById('countdown').textContent = `${countdown}s后跳转`;if (countdown-- <= 0) {clearInterval(timer);window.location.href = 'https://example.com';}
}, 1000);
功能:显示倒计时并自动跳转,常用于广告页或登录后重定向。
2. 防抖窗口 resize 事件
let resizeTimer;
window.addEventListener('resize', () => {clearTimeout(resizeTimer);resizeTimer = setTimeout(() => {console.log('窗口稳定大小:', window.innerWidth, window.innerHeight);}, 200);
});
功能:避免频繁触发resize事件,优化性能。
四、框架与跨窗口通信
1. 父窗口与iframe交互
<iframe id="myFrame" src="child.html"></iframe>
<script>const frame = document.getElementById('myFrame');frame.onload = () => {// 向iframe发送消息frame.contentWindow.postMessage('Hello from parent!', '*');};// 接收子窗口消息window.addEventListener('message', (e) => {if (e.origin === 'https://trusted-domain.com') {console.log('子窗口消息:', e.data);}});
</script>
功能:使用postMessage实现跨域安全通信。
五、实战案例:拖拽模态框
// 获取模态框元素
const modal = document.querySelector('.modal');
const header = modal.querySelector('.modal-header');
let isDragging = false;
let offsetX, offsetY;header.addEventListener('mousedown', (e) => {isDragging = true;offsetX = e.clientX - modal.offsetLeft;offsetY = e.clientY - modal.offsetTop;
});document.addEventListener('mousemove', (e) => {if (!isDragging) return;modal.style.left = `${e.clientX - offsetX}px`;modal.style.top = `${e.clientY - offsetY}px`;
});document.addEventListener('mouseup', () => isDragging = false);
功能:通过计算鼠标偏移量实现模态框拖拽。
六、安全跳转案例
function safeRedirect(url) {if (url.startsWith('https://trusted.com')) {window.location.href = url;} else {console.error('拒绝跳转到非信任域名!');}
}
功能:防止恶意重定向攻击。
以上案例覆盖了BOM的核心应用场景,可根据实际需求调整参数或扩展功能。更多高级用法(如结合Electron开发桌面应用)可参考Electron官方文档。
相关文章:
JavaScript学习教程,从入门到精通,JavaScript BOM (Browser Object Model) 详解(18)
JavaScript BOM (Browser Object Model) 详解 1. BOM 介绍 BOM (Browser Object Model) 是浏览器对象模型,它提供了独立于内容而与浏览器窗口进行交互的对象。BOM的核心对象是window,它表示浏览器的一个实例。 BOM包含的主要对象: window…...
人工智能与云计算:技术融合与实践
1. 引言 人工智能(AI)和云计算是当今科技领域最具变革性的两项技术。AI通过模拟人类智能解决问题,而云计算则提供了弹性可扩展的计算资源。两者的结合创造了前所未有的可能性,使企业能够以更低的成本部署复杂的AI解决方案。 本文将探讨AI与云计算的技术融合,包括核心概念、…...
42.[前端开发-JavaScript高级]Day07-手写apply-call-bind-块级作用域
手写apply-call-bind <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevi…...
ObjectInputStream 终极解析与记忆指南
ObjectInputStream 终极解析与记忆指南 一、核心本质 ObjectInputStream 是 Java 提供的对象反序列化流,继承自 InputStream,用于读取由ObjectOutputStream序列化的Java对象。 核心特性速查表 特性说明继承链InputStream → ObjectInputStream核心功能实现Java对象反序列化…...
数据结构有哪些类型(对于数据结构的简述)
在学习计算机时,数据结构是不可忽视的一点,从考研时的408课程,再到工作中编写软件,网站,要想在计算机领域站住脚跟,数据结构是必备的 在这里,我对于数据结构进行了汇总,并简要描述&…...
Vscode 插件开发
文章目录 1、使用vscode官方插件生成框架,下载脚手架2、使用脚手架初始化项目,这里我选择的是js3、生成的文件结构如下,重要的就是以下两个文件4、代码5、打包使用6、发布官网地址7、publisher ID undefined provided in the extension manif…...
C# string和其他引用类型的区别
在C#中,字符串(String)和其他引用类型(Reference Types)之间有几个关键的区别,这些区别主要体现在它们的内存管理、赋值行为以及使用方式上。 1. 内存管理 字符串(String)࿱…...
RTT添加一个RTC时钟驱动,以DS1307为例
添加一个外部时钟芯片 这里多了一个选项 复制drv_rtc.c,重命名为drv_rtc_ds1307.c 添加到工程中 /*** @file drv_rtc_ds1307.c* @brief * @author jiache (wanghuan3037@fiberhome.com)* @version 1.0* @date 2025-01-08* * @copyright Copyright (c) 2025 58* */ #...
常见的低代码策略整理
低代码策略通过简化开发流程、降低技术门槛、提升效率,帮助用户快速构建灵活可靠的应用。这些策略的核心优势体现在以下方面: 快速交付与降本增效 减少编码需求:通过可视化配置(如变量替换、表达式函数)替代传统编码…...
从彩色打印单行标准九九表学习〖代码情书〗的书写范式(Python/DeepSeek)
写给python终端的情书,学习代码设计/书写秘笈。 笔记模板由python脚本于2025-04-17 12:49:08创建,本篇笔记适合有python编程基础的coder翻阅。 【学习的细节是欢悦的历程】 博客的核心价值:在于输出思考与经验,而不仅仅是知识的简…...
QML与C++:基于ListView调用外部模型进行增删改查(附自定义组件)
目录 引言相关阅读项目结构文件组织 核心技术实现1. 数据模型设计联系人项目类 (datamodel.h)数据模型类 (datamodel.h)数据模型实现 (datamodel.cpp) 2. 主程序入口点 (main.cpp)3. 主界面设计 (Main.qml)4. 联系人对话框 (ContactDialog.qml)5. 自定义组件CustomTextField.qm…...
postman莫名奇妙报错,可能是注释引起的。postman 过滤请求体中的注释。
postman莫名奇妙报错,可能是注释引起的。postman 过滤请求体中的注释。 1、问题描述2、问题分析3、解决方法 1、问题描述 postman http请求测试时,如果在请求体中添加了注释,那么这个注释会被带到服务端执行,导致服务端接口返回报…...
扩增子分析|基于R语言microeco包进行微生物群落网络分析(network网络、Zi-Pi关键物种和subnet子网络图)
一、引言 microeco包是福建农林大学姚敏杰教授团队开发的扩增子测序集成分析。该包综合了扩增子测序下游分析的多种功能包括群落组成、多样性、网络分析、零模型等等。通过简单的几行代码可实现复杂的分析。因此,microeco包发表以来被学界广泛关注,截止2…...
中间件--ClickHouse-4--向量化执行(什么是向量?为什么向量化执行的更快?)
1、向量(Vector)的概念 (1)、向量的定义 向量:在计算机科学中,向量是一组同类型数据的有序集合,例如一个包含多个数值的数组。在数据库中,向量通常指批量数据(如一列数…...
TDengine 存储引擎剖析:数据文件与索引设计(一)
TDengine 存储引擎简介 在物联网、工业互联网等快速发展的今天,时间序列数据呈爆发式增长。这些数据具有产生频率高、依赖采集时间、测点多信息量大等特点,对数据存储和处理提出了极高要求。TDengine 作为一款高性能、分布式、支持 SQL 的时序数据库&am…...
【kubernetes】pod.spec.containers.ports的介绍
目录 1. 说明2. 基本结构3. 字段说明4. 使用场景5. 示例6. 注意事项 1. 说明 1.在 Kubernetes 中,pod.spec.containers.ports 是 Pod 定义中用于配置容器端口映射的字段,其作用是声明容器需要监听的端口以及如何将这些端口暴露给 Pod 的外部访问。 2. …...
【SpringBoot+Vue自学笔记】001
跟着这位老师学习的:https://www.bilibili.com/video/BV1nV4y1s7ZN?vd_sourceaf46ae3e8740f44ad87ced5536fc1a45 前后端开发技术的全栈课程: Java EE企业级框架:SpringBootMyBatisPlus Web前端核心框架:VueElement UI 公共云…...
第十节:性能优化-如何排查组件不必要的重复渲染?
工具:React DevTools Profiler 方法:memo、shouldComponentUpdate深度对比 React 组件性能优化:排查与解决重复渲染问题指南 一、定位性能问题:React DevTools 高级用法 使用 React Developer Tools Profiler 精准定位问题组件&…...
MATLAB项目实战(一)
题目: 某公司有6个建筑工地要开工,每个工地的位置(用平面坐标系a,b表示,距离单位:km)及水泥日用量d(t)由下表给出.目前有两个临时料场位于A(5,1),B(2,7),日储…...
spring boot 文件下载
1.添加文件下载工具依赖 Commons IO is a library of utilities to assist with developing IO functionality. <dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version> </depe…...
HTTP 2.0 协议特性详解
1. 使用二进制协议,简化传输的复杂性,提高了效率 2. 支持一个 TCP 链接发起多请求,移除 pipeline HTTP/2 移除了 HTTP/1.1中的管道化(pipeline)机制,转而采用多路复用(Multiplexing࿰…...
微服务链路追踪:SleuthZipkin
文章目录 Sleuth & Zipkin一、Sleuth\&Zipkin介绍二、搭建环境三、Sleuth入门操作四、Zipkin搭建及操作五、RabbitMQ方式发送信息六、Elasticsearch持久化 SpringBootAdmin一、Actuator介绍二、Actuator快速入门三、SpringBootAdmin介绍四、SpringBootAdmin快速入门4.1…...
HTML语义化与无障碍设计
HTML 语义化与无障碍设计:构建包容且高效的网页体验 引言 在我的前端开发学习旅程中,起初将 HTML 仅视为页面布局的工具,大量使用无语义的 <div> 和 <span>。直到在一篇技术博客当中了解到,作者在一次团队项目中&am…...
java面试篇 4.9(mybatis+微服务+线程安全+线程池)
目录 mybatis: 1、mybatis的执行流程 2、mybatis是否支持延迟加载? 当我们需要去开启全局的懒加载时: 3、mybatis的一级和二级缓存 微服务 1、springcloud五大组件有哪些 2、服务注册和发现是什么意思?springcloud如何实现…...
基于电子等排体的3D分子生成模型 ShEPhERD - 评测
一、背景介绍 ShEPhERD 是一个由 MIT 开发的一个 3D 相互作用感知的 ligand-based的分子生成模型,以 arXiv 预印本的形式发表于 2024 年,被ICLR2025 会议接收。文章链接:https://openreview.net/pdf?idKSLkFYHlYg ShEPhERD 是一种基于去噪扩…...
极狐GitLab 功能标志详解
极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有: 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 功能标志 (BASIC ALL) 使用功能标志,您可以将应用程序的新功能小批量部署到生产环境中。您可以为部分用户打开和…...
GR00T N1:面向通用类人机器人的开放基础模型
摘要 通用型机器人需要具备多功能的身体和智能的大脑。近年来,类人机器人的发展在构建人类世界中的通用自主性硬件平台方面展现出巨大潜力。一个经过大量多样化数据源训练的机器人基础模型,对于使机器人能够推理新情况、稳健处理现实世界的多变性以及快…...
QT简单实例
QT简单实例 QT简单实例一:通过拖动创建1.创建工程2.拖动控件实现响应3.文件目录3.1 TestQDialog.pro3.2 main.cpp3.3 dialog.h3.4 dialog.cpp 二:通过动态创建1.创建工程2.文件目录2.1 TestQDialogSelf.pro2.2 main.cpp2.3 dialog.h2.4 dialog.cpp QT简单…...
Linux:初学者的简单指令
文章目录 pwd(Print working directory)whoamilsmkdir ~~cd ~~touch ~~rm ~~ 充当后端服务,我们用xshell工具来进行操作 其中Linux文件是/目录/目录/目录或文件/来表示的(其中目录可以看作是windows操作系统的文件夹,只是Linux中…...
zynq7020 ubuntu_base 跟文件系统
整体流程 制作 ubuntu_base 镜像运行 petalinux 构建的 ramdisk 系统用 ramdisk 系统把 ubuntu_base 镜像烧录到 emmc从 emmc 跟文件系统 启动内核 制作 ubuntu_base 镜像 制作 ubuntu_base 镜像 sudo apt-get install qemu-user-static # 安装 q…...
