web前端 --- BOM编程、DOM编程

BOM编程(browser object model -- 浏览器对象模型)

BOM给JavaScript提供用来操作浏览器的若干的"方法"

操作

在 js 看来,一个完整的浏览器包含如下组件:

window窗口        // 整个浏览器的窗口

  • |-- history        //  浏览器的历史记录
  • |-- location        //  浏览器地址
  • |-- screen        //  屏幕分辨率
  • |-- navigator        //  浏览器内核信息
  • |-- document        //  文档对象(DOM)

(1)window窗口

windows代表的是浏览器本身,是浏览器代码化的一个实例对象,所以操作window对象相当于操作浏览器

window常见属性和方法:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script>
            function msg() {
                alert("3秒后出现");
            }
            // 定时器,表示多少时间后,执行函数
            // window.setTimeout(msg,3000);

            // 也可直接使用匿名函数
            setTimeout(function aa() {
                alert("5秒后出现");
            },5000)

            // 轮询器:每个多少秒,执行一次参数
            let timer = setInterval(function (){
                console.log("2s打印一次")
            },2000)

            setTimeout(()=> {
                // 清除轮询
                window.clearInterval(timer);
            },5000)

            // 清除轮询
            clearTimeout(numID);

            function moveBy(){
                window.moveBy(200,300);
            }

            function openNewWin(){
                window.open("http://www.baidu.com","_blank");
            }
    </script>
    <title>window对象</title>
</head>
<body>
    <button onclick="moveBy();">移动窗口</button>
    <button onclick="openNewWin();">打开窗口</button>
</body>
</html>

(2)history

history 对象是 window 对象的属性,它保存着用户上网的记录,这个记录的时间戳是从窗口被打开的那一刻算起。

PS:没有应用于history对象的公开标准,不过所有浏览器都支持该对象

history常见的属性和方法:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script>
        console.log(window.history)

        function goBack(){
            window.history.back();
        }
        function goForward(){
            window.history.forward();
        }
        function goTo(){
            window.history.go(2);
        }
    </script>
    <title>history</title>
</head>
<body>
    <a href="fs.html">03</a>
    <button onclick="goBack();">后退</button>
    <button onclick="goForward();">前进</button>
    <button onclick="goTo();">go</button>
</body>
</html>

(3)screen

screen对象包含有关客户端显示屏幕的信息。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script>
        // 操作系统的分辨率
        console.log(window.screen.height);
        console.log(window.screen.width);
        console.log(window.screen.availHeight);
        // 可达的height
        console.log(window.screen.availWidth);
        // 可达的width
    </script>
    <title>screen属性对象</title>
</head>
<body>
    
</body>
</html>

(4)navigator

navigator相关的一些常见属性:

(5)location

location对象有以下常见的属性和方法:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script>
        console.log(window.location.href)
        // 控制台显示本地地址
        console.log(window.location.port)
        // 控制台显示端口
        console.log(window.location.pathname)
        // 控制台显示域名
        console.log(window.location.hostname)
        // 控制台显示主机名称
        console.log(window.location.host)
        // 控制台显示主机名称:端口
        console.log(window.location.search)
        // 控制台显示表单数据(?后面的数据)
        console.log(window.location.protocol)
        // 控制台显示网络协议   

        function reflush(){
            // window.location.reload();
            // 刷新页面

            window.location.replace(`https://www.baidu.com`);
            // 重新定位,更换地址
        }
    </script>
    <title>location</title>
</head>
<body>
    <button onclick="reflush()">刷新</button>

</body>
</html>

DOM编程(DOM:文档对象模型)

document对象管理页面的可见部分

        在前端开发中会使用到很多元素,如< title>、< h1>等,而为了方便使用这些已经定义的元素,将这些元素作为结点排成树状后,通过遍历这棵树,就可以很方便的调用这些元素。而这颗树就称为DOM树

(1)获取DOM对象的几种方式

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script>
        window.onload = init;

        function init(){
            // 1、直接通过id获取,不推荐
            // console.log(box);

            // 2、通过api方式获取(依旧通过id获取)
            let box = document.getElementById("box");
            // 对象                         id
            // let box = document.querySelector("#box");  与api获取方式相同,不能用来获取类名称,类名称相同只能获取一个
            // querySelector,获取一个
            console.log(box);

            // 3、类名称获取,获取多个元素
            let msgs = document.getElementsByClassName("msg");
            // console.log(msgs);
            // 控制台显示3个元素,都是数组
            msgs[1].innerHTML = "qwert";
            // 通过下标方式访问

            // 4、通过标签名称获取
            const divs = document.getElementsByTagName("div");
            console.log(divs);
            // 常量

            // 5、通过name属性
            let username = document.getElementsByName("username");
            console.log(username[0]);

            username[0].value = "zhangsan";

            let msg = document.querySelectorAll(".msg");
            let div = document.querySelectorAll("div");
            // 直接获取多个,也可直接获取标签
        }
    </script>
    <title>获取DOM对象的方式</title>
</head>
<body>
    <div id="box">这是一个div标签</div>
    <div class="msg">div</div>
    <div class="msg">div</div>
    <div class="msg">div</div>
    <div class="msg">div</div>

    <input type="text" name="username" id="">
    <input type="text" name="password" id="">
</body>
</html>

(2)操作DOM对象的内容

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <style>
        .box{
            color: yellowgreen;
            font-size: 25px;
            font-family: 仿宋;
        }
    </style>
    <script>
        function run(){
            let box = document.querySelector("#box");
            
            // box.innerHTML = "<h1 style='font-size:30px'>sss</h1>"; // innerHTML容易引起XSS(Cross Site Scripting)攻击
            // textConnect【w3c标准】与innerText效果相同
            // box.innerText = "qwerty";
            box.textContent = "qwerty";

            // box.style.border = "1px solid red";
            // box.style.color = "blue";

            box.className = "box";
            box["title"] = "这是标题";
            // 鼠标移动到box中内容显示

            alert(box.getAttribute("aa"));

        }

        function run02(){
            let box  = document.querySelector("#box");
            box.setAttribute("title","这是一个新的标题")
        }
    </script>
    <title>操作DOM对象内容</title>
</head>
<body>
    <div id="box" aa = "123"></div>
    <button onclick="run()">点击填充数据</button>
    <button onclick="run02()">点击填充数据</button>
</body>
</html>

(3)基于DOM的XSS攻击(XSS:跨站脚本攻击)

<1> 原因:

当js脚本从url获得数据并将其传递到支持动态代码执行的接收器时,就会产生基于DOM的XSS漏洞。也就是说不规范的使用接收器时就会产生基于DOM的XSS漏洞。因此基于DOM的XSS漏洞一般产生于用户能够进行参数输入查询的地方。

<2> 常见接收器

document.write()
document.writeln()
document.domain()
someDOMElement.innerHTML()
someDOMElement.outerHTML()
someDOMElement.insertAdjacentHTML()
someDOMElement.onevent()

<3> 手工挖掘基于DOM的XSS漏洞

找找看网页使用了那些接收器,再输入任意参数,然后查看参数所在位置,最后尝试写入XSS脚本所在的上下文看脚本能否成功执行。需要注意的是,当接收器为js执行接收器时,我们输入的参数可能不会出现在DOM的任何位置,此时我们可以通过js调试器来追踪我们输入参数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/26547.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

练手必备,20个Python实战项目含源代码

“读”代码是不能给你带来任何收益的&#xff0c;正如“读书”一样&#xff0c;如果在读的时候你不琢磨&#xff0c;保管你读完仨月准忘了一大半。真正需要的是去“试”代码&#xff0c;动手去调调代码&#xff0c;改改这改改那&#xff0c;看看把A变成B这个代码的结果会有什么…

最新成果展示:AlInN/GaN DBR模型数据库的开发与应用

由于AlN和GaN之间存在较大的晶格失配和热膨胀失配&#xff0c;导致很难获得高质量的AlN/GaN布拉格反射镜&#xff08;Distributed Bragg Reflection&#xff0c;DBR&#xff09;结构。为解决该问题&#xff0c;天津赛米卡尔科技有限公司技术团队基于先进的TCAD仿真设计平台开发…

MySQL 的锁

目录 一、锁的分类 二、全局锁、表级锁、页级锁、行级锁 三、乐观锁和悲观锁 四、共享锁和排它锁 五、意向共享锁和意向排它锁 六、间隙锁、临键锁、记录锁 锁的分类和用途 一、锁的分类 1、MySQL锁可以按模式分类为&#xff1a; 乐观锁悲观锁。 2、按粒度分可以分为&a…

STM32H743烧录后无法识别Jlink的问题

利用Cubemx生成H743的代码&#xff0c;点击烧录后&#xff0c;无法再识别到Jlink了&#xff0c;只能烧录时按着复位再松开&#xff08;类似51单片机&#xff09;。 烧录后不运行&#xff0c;用keil进行debug&#xff0c;调试发下芯片进去内存管理错误中断。 经过不断调试发现&…

功能强大UI美观的视频答题猜歌闯关娱乐微信小程序源码

正文&#xff1a; 功能强大UI美观的视频答题猜歌闯关娱乐微信小程序源码下载 后台管理资源本地化带数据和视频教程&#xff0c;这是一款拥有后端的闯关娱乐小程序。支持个人小程序和企业小程序上线运营功能强大齐全,带数据本地化(数据在自己服务器自己管理无需担心第三方失效…

为什么电源纹波那么大?

某用户在用500MHz带宽的示波器对其开关电源输出5V信号的纹波进行测试时&#xff0c;发现纹波和噪声的峰峰值达到了900多mV&#xff08;如下图所示&#xff09;&#xff0c;而其开关电源标称的纹波的峰峰值<20mv。虽然用户电路板上后级还有LDO对开关电源的这个输出再进行稳压…

如何判断一个点是否在凸多边形内 - golang

判断一个点是否在凸多边形内的方法很多&#xff0c;此处仅给出使用向量叉积法判断点是否在凸多边形内的方法。 以下图为例说明问题&#xff1a; 原理&#xff1a; 1. 将多边形的第 i 条边的第一个顶点指向点 P 得到向量 v1&#xff0c;然后将从第一个顶点指向第二个顶点得到向…

网络安全真的那么好吗?

当你开始在网上搜索关于网络安全的学习资料&#xff0c;常常会陷入自我怀疑&#xff1a;尝试自学后能使用工具进行简单的扫描和挖洞&#xff0c;但总感觉后期学习很难有突破&#xff0c;不知道是哪里出现问题…于是又不得不推倒重来。 了解网络安全&#xff0c;首先要搞清楚下…

ES6-ES13学习笔记(5.0)

ES2022的函数 //findLast findLastIndex() ES2022 发现在电脑自带的联想浏览器不支持此函数&#xff0c;还报错了 对于ECMA的支持还和浏览器有关以及浏览器版本有关&#xff0c;然后我使用Google浏览器就可以正常使用&#xff0c; 1.扩展运算符&#xff1a;三个点... ..…

Python安装

一、Windows安装 打开官网&#xff1a;https://www.python.org/getit/ 下载exe安装包&#xff0c;双击安装默认选择路径 2、验证安装成功 cmd: python 能看到版本 cmd&#xff1a;pip 测试包管理工具 cmd&#xff1a;python -m pip install --user --upgrade pip -i https:…

高考开始了,计算机专业未来还会火吗?

2023年高考&#xff0c;今天开始第一场考试。而走出考场&#xff0c;考生们也将面临选报专业的难题。高考人数逐年攀升&#xff0c;录取率却不断下降。 过去10年&#xff0c;计算机专业可谓红透半边天&#xff0c;早早进入这个行业的&#xff0c;基本都吃到了很高的红利。然而…

java多线程面试题

一、创建线程有哪几种方式? 创建线程有三种方式&#xff0c;分别是继承Thread类、实现Runnable接口、实现Callable接口。 Runnable接口与Callable接口的方式基本相同&#xff0c;只是Callable接口里定义的方法有返回值&#xff0c;可以声明抛出异常。 二、run()和start()有什…

006-从零搭建微服务-注册中心(二)

写在最前 如果这个项目让你有所收获&#xff0c;记得 Star 关注哦&#xff0c;这对我是非常不错的鼓励与支持。 源码地址&#xff1a;https://gitee.com/csps/mingyue 文档地址&#xff1a;https://gitee.com/csps/mingyue/wikis 核心依赖 需要注册配置中心的服务引入下面 …

vuex核心

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、什么是状态管理&#xff1f;二、复杂的状态管理1.随着代码越来越多&#xff0c;需要管理的状态越来越复杂&#xff0c;当多个组件共享状态时&#xff0c;单…

chatgpt赋能python:Python如何运行两次

Python如何运行两次 Python是一种高级编程语言&#xff0c;非常受欢迎&#xff0c;因为它易于学习&#xff0c;简单易用&#xff0c;开放性强&#xff0c;而且功能强大。Python常用于处理各种任务&#xff0c;包括数据分析、Web应用开发、人工智能、自动化测试等。此外&#x…

Linux ls -l输出文件信息详解

在linux中&#xff0c;我们知道一切皆为文件&#xff0c;经常我们会使用ls -l去查看文件的信息&#xff0c;今天会大家详细讲解一下ls -l输出的文件属性信息。 1.ls -l输出 命令&#xff1a; ls -l 通过ls -l命令输出&#xff0c;我们可以看到上图中的属性信息输出&#xff…

PMP证书含金量也太高了吧!在一线城市可享受多项福利~

近年来&#xff0c;企业与企业、城市与城市间的人才争夺变得更加激烈&#xff0c;各大城市为了泛集聚和培养重点领域紧缺专业人才均针对持有国际职业资格认证的人才出台了相关优惠政策&#xff0c;目前我了解到的已有以下5个城市针对PMP项目管理及相关行业和认证出台了鼓励政策…

项目管理系统的设计与实现(ASP.NET,SQL)

开发环境&#xff1a;Microsoft Visual Studio 数据库&#xff1a;Microsoft SQL Server 程序语言&#xff1a;asp.NET(C#)语言本系统的开发使各大公司所的项目管理更加方便快捷&#xff0c;同时也促使项目的管理变的更加系统化、有序化。系统界面较友好&#xff0c;易于操作。…

MySQL CAST 函数与 CONVERT 函数

文章目录 CAST 函数与 CONVERT 函数1. 数字和小数点组成的字符串转换为整型2. 非数值字符串转换为整型3. 把整型转换为二进制4. 数字和小数点组成的字符串转换为浮点型 CAST 函数与 CONVERT 函数 前面我们介绍的两个函数用于字符串和日期类型之间进行相互转换&#xff0c;有时我…

什么?要求设计一个循环队列?

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f354;&#x1f35f;&#x1f32f;C语言进阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f349;本篇简介:>:讲解用c…