Welcome to kimi's blog

前端之BOM、DOM操作

BOM操作

JavaScript分为 ECMAScript,DOM,BOM。

BOM(Browser Object Model)是指浏览器对象模型,它使 JavaScript 有能力与浏览器进行“对话”。

DOM (Document Object Model)是指文档对象模型,通过它,可以访问HTML文档的所有元素。
image

window对象

window.innerHeight - 浏览器窗口的内部高度
window.innerWidth - 浏览器窗口的内部宽度
window.open() - 打开新窗口
window.close() - 关闭当前窗口
eg:
window.innerHeight
153
window.innerWidth
982
打开新的网址窗口
window.open('https://www.baidu.com/','','height=400px,width=400px,top=400px,left=400px') 
解析内容:新建窗口打开页面 第二个参数写空即可 第三个参数写新建的窗口的大小和位置

浏览器对象,通过这个对象可以判定用户所使用的浏览器,包含了浏览器相关信息。

navigator.appName  // Web浏览器全称
navigator.appVersion  // Web浏览器厂商和版本的详细字符串
navigator.userAgent  // 客户端绝大部分信息
navigator.platform   // 浏览器运行所在的操作系统

网址防爬:
1.最简单最常用的一个就是校验当前请求的发起者是否是一个浏览器 userAgent
    user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36

如何破解该措施?
        在你的代码中加上上面的user-agent配置即可

screen对象(了解即可)

屏幕对象,不常用。

一些属性:

- screen.availWidth - 可用的屏幕宽度
- screen.availHeight - 可用的屏幕高度

history对象(了解即可)

window.history 对象包含浏览器的历史。

浏览历史对象,包含了用户对当前页面的浏览历史,但我们无法查看具体的地址,可以简单的用来前进或后退一个页面。

history.forward()  // 前进一页
history.back()  // 后退一页

image

location对象

window.location 对象用于获得当前页面的地址 (URL),并把浏览器重定向到新的页面。

常用属性和方法:

location.href  获取URL网址
location.href="URL" // 跳转到指定页面
location.reload() 重新加载页面

弹出框

可以在 JavaScript 中创建三种消息框:警告框、确认框、提示框。

警告框

警告框经常用于确保用户可以得到某些信息。当警告框出现后,用户需要点击确定按钮才能继续进行操作。

语法:

alert()
alert('你还看')

确认框(了解即可)

确认框用于使用户可以验证或者接受某些信息。当确认框出现后,用户需要点击确定或者取消按钮才能继续进行操作。如果用户点击确认,那么返回值为 true。如果用户点击取消,那么返回值为 false。

语法:

confirm()
confirm("你确定吗?")

提示框(了解即可)

提示框经常用于提示用户在进入页面前输入某个值。当提示框出现后,用户需要输入某个值,然后点击确认或取消按钮才能继续操纵。如果用户点击确认,那么返回值为输入的值。如果用户点击取消,那么返回值为 null。

语法:

prompt("请在下方输入","你的答案")

警示框、确认框和提示框演示

计时相关(重要)

通过使用 JavaScript,我们可以在一定时间间隔之后来执行代码,而不是在函数被调用后立即执行。我们称之为计时事件

1.过一段时间之后触发(一次)

setTimeout()

setTimeout() 方法会返回某个值。在上面的语句中,值被储存在名为 t 的变量中。假如你希望取消这个 setTimeout(),你可以使用这个变量名来指定它。setTimeout() 的第一个参数是含有 JavaScript 语句的字符串。这个语句可能诸如 "alert('5 seconds!')",或者对函数的调用,诸如 alertMsg()"。第二个参数指示从当前起多少毫秒后执行第一个参数(1000 毫秒等于一秒)。

计时关键字
setTimeout()
var t = setTimeout("JS语句",毫秒)
取消计时事件
clearTimeout()
eg:
<script>
    // 在指定时间之后执行一次相应函数
    var timer = setTimeout(function(){alert(123);}, 3000)  // 毫秒为单位 3秒之后自动执行func1函数
    // 取消定时任务  如果你想要清除定时任务 需要提前用变量指代定时任务
    clearTimeout(timer);
</script>

2..每隔三秒时间触发一次(循环)

setInterval()

setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式。setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭。由 setInterval() 返回的 ID 值可用作 clearInterval() 方法的参数。

 s = setInterval(func, 3000)		// 每隔3000毫秒执行一次
 clearInterval(s)  // 取消任务
 eg:
 <script>	
	function func2() {
        alert(123)
    }
    function show(){
        let t = setInterval(func2,3000);  // 每隔3秒执行一次
        function inner(){
            clearInterval(t)  // 清除定时器
        }
        setTimeout(inner,9000)  // 9秒中之后触发/执行
    }
    show()
</script>

DOM操作

DOM(Document Object Model)是一套对文档的内容进行抽象和概念化的方法。 当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model)。HTML DOM 模型被构造为对象的树。

HTML DOM树

image

DOM标准规定HTML文档中的每个成分都是一个节点(node):
    文档节点(document对象):代表整个文档
    元素节点(element 对象):代表一个元素(标签)
    文本节点(text对象):代表元素(标签)中的文本
    属性节点(attribute对象):代表一个属性,元素(标签)才有属性
    注释是注释节点(comment对象) 

JavaScript 可以通过DOM创建动态的 HTML:
    JavaScript 能够改变页面中的所有 HTML 元素
    JavaScript 能够改变页面中的所有 HTML 属性
    JavaScript 能够改变页面中的所有 CSS 样式
    JavaScript 能够对页面中的所有事件做出反应

查找标签

DOM (Document Object Model)是指文档对象模型,通过它可以访问HTML文档的所有元素,既然DOM操作是通过js代码来操作标签 所以我们需要先学习如何查找标签之后才能给标签绑定一些JS代码(DOM操作)

image

"""
1.js中变量名的命名风格推荐是驼峰体
2.js代码查找到的标签如果需要反复使用可以用变量接收 规律 xxxEle
"""
1.直接查找
document.getElementById('d1')  //根据ID获取一个标签
document.getElementsByClassName('c1') //根据class属性获取,结果是数组里面含有多个标签对象
document.getElementsByTagName('span')  //根据标签名获取标签合集,结果是数组里面含有多个标签对象
document.getElementsByTagName('span')[索引值]  //索引取值
   
2.间接查找
parentElement             父节点标签元素
children                 所有子标签
firstElementChild        	第一个子标签元素
lastElementChild         	最后一个子标签元素
nextElementSibling       	下一个兄弟标签元素
previousElementSibling   	  上一个兄弟标签元素


js代码:
<div>div
  <div>div>div</div>
  <p>div>p
  <span>div>p>span</span>
  </p>
  <p id="d1">div>p</p>
  <div class="c2">div>div</div>
</div>

image

操作节点

1.js代码创建一个标签
	let somenode = document.createElement('a')
2.添加节点
    somenode.appendChild(newnode);//添加在后面的节点
    somenode.insertBefore(newnode,某个节点); // 添加在某个节点后面
3.删除节点
	somenode.removeChild(要删除的节点);
4.替换节点
	somenode.replaceChild(newnode, 某个节点);
5.属性节点
	//获取文本节点的值
    var divEle = document.getElementById("d1")
    divEle.innerText
    divEle.innerHTML
    //设置文本节点的值
    var divEle = document.getElementById("d1")
    divEle.innerText="1"
    divEle.innerHTML="<p>2</p>"
    //attribute操作
    var divEle = document.getElementById("d1");
    divEle.setAttribute("age","18") //兼容默认属性和自定义属性
    divEle.getAttribute("age")
    divEle.removeAttribute("age")
    // 自带的属性还可以直接.属性名来获取和设置
    imgEle.src
    imgEle.src="..."

js代码实操

需求1:

1.通过DOM操作动态的创建img标签
2.并且给标签加属性
3.最后将img标签追加到div标签尾部文本中
注意:错误的方式(自定义属性没办法点的方法设置

image

需求2:

1.创建a标签 设置属性 设置文本

2.添加到标签内部

3.指定将a标签塞在p标签上面

1.创建a标签
let aEle = document.createElement('a') 
2.设置标签默认属性
aEle.href = 'https:/ww.mzitu.com/'   只能添加默认的属性
3.给标签设置文本内容
// js代码操作标签文本
aEle.innerText = '这个很棒!'

4.// js代码查找div标签ID并将a追加到div内部
let divEle = document.getElementsByTagName('div')[0]  // 最好是id
divEle.appendChild(aEle)

innerText与innerHTML的区别

.innerText  		 获取标签内部所有的文本内容
.innerText = '文本'  替换/设置标签内部的文本(不识别标签语法)

.innerHTML			获取标签内部所有的标签包含文本
.innerHTML = '文本'  替换/设置标签内部的文本(识别标签语法)

获取值操作

1.针对用户输入的和用户选择的标签
	标签对象.value
2.针对用户上传的文件数据(需要索引取值)
	标签对象.files    	fileList  [文件对象、文件对象、文件对象]
	标签对象.files[0]	 文件对象 
    注意:点value无法获取到文件数据(错误取值),获取的是文件路径,要加上索引值
	eg:
	fileEle.value  
	'C:\\fakepath\\新建 DOC 文档.doc'
代码实操:
<form action="">
    <p>username:
        <input type="text" id="username">
    </p>
    <p>province:
        <select name="" id="pro">
            <option value="牛奶">111</option>
            <option value="果茶">222</option>
            <option value="学习">333</option>
        </select>
    <p>file:
    <input type="file" id="file">
    </p>
    </p>
</form>

class与css操作

1.js操作标签css样式
	标签对象.style.属性名(下划线没有 变成驼峰体)
	标签对象.style.color = 'red'  //字体颜色
	标签对象.style.fontSize = '28px'  //字体大小
	标签对象.style.backgroundColor = 'yellow'  //背景颜色
	标签对象.style.border = '3px solid red'  //边框
	标签对象.style.margin
	.....
2.js操作标签class属性
	标签对象.classList  // 获取标签所有的类属性
	标签对象.classList.add('bg_yellow')  //添加类
  	标签对象.classList.contains()  //验证是否包含某个类属性true/false
    标签对象.classList.remove()  //移除某个类属性
    标签对象.classList.toggle()  // 有则删除无则添加 有则返回true

代码实操:

<head>
    <meta charset="UTF-8">
    <title>Title</title>
  <style>
         div {
            height: 400px;
            width: 400px;
            border-radius: 50%;}
        .bg_red {
            background-color: red;}
        .bg_green {
            background-color: greenyellow;}
  </style>
</head>
<body>
<P id="d1">  今天内容挺多的</P>
<div id="d2" class="bg_red  bg_green"> </div>
</body>

浏览器终端操作

事件

​ HTML 4.0 的新特性之一是有能力使 HTML 事件触发浏览器中的动作(action),比如当用户点击某个 HTML 元素时启动一段 JavaScript。下面是一个属性列表,这些属性可插入 HTML 标签来定义事件动作。

简单理解就是通过js代码给html标签绑定一些自定义的功能

常见事件

onclick        当用户点击某个对象时调用的事件句柄
onfocus        元素获得焦点  // 练习:输入框        
onblur         元素失去焦点   //应用场景:用于表单验证,用户离开某个输入框时,代表已经输入完了,我们可以对它进行验证           
onchange       域的内容被改变   //应用场景:通常用于表单元素,当元素内容被改变时触发.(select联动)

......

补充知识:
ondblclick     当用户双击某个对象时调用的事件句柄。
onkeydown      某个键盘按键被按下。          应用场景: 当用户在最后一个输入框按下回车按键时,表单提交.
onkeypress     某个键盘按键被按下并松开。
onkeyup        某个键盘按键被松开。
onload         一张页面或一幅图像完成加载。
onmousedown    鼠标按钮被按下。
onmousemove    鼠标被移动。
onmouseout     鼠标从某元素移开。
onmouseover    鼠标移到某元素之上。
onselect      在文本框中的文本被选中时发生。
onsubmit      确认按钮被点击,使用的对象是form。

this是实参,表示触发事件的当前元素,函数定义过程中的ths为形参。

绑定事件的多种方式

	<!--绑定事件的方式1-->
    <button onclick="showMsg()">快按我</button>

    <!--绑定事件的方式2-->
    <input type="button" value="快快快" id="d1">

        <script>
            function showMsg() {
                let msg = prompt('你确定要这样吗?');
                console.log(msg)
            }
            let inputEle = document.getElementById('d1');
            inputEle.onclick = function () {
                alert('谁在那里点我!!!')
            }
        </script>

事件函数中的this关键字
	this指代的就是当前被操作的标签对象本身	
 	如果事件函数内有多层嵌套那么最好在一开始用变量存储一下防止后续变化

window.onload

当我们给页面上的元素绑定事件的时候,必须等到文档加载完毕。因为我们无法给一个不存在的元素绑定事件,window.onload事件在文件加载过程结束的时候触发。此时,文档中的所有对象都位于DOM中,并且所有图像,脚本,链接和子框架都已完成加载。

onload方法
	XXX.onload 等待XXX加载完毕之后再执行后面的代码

事件实战案例

eg1:
<input type="text" value="游戏机" id="d1">

<script>
        let inputEle = document.getElementById('d1')
        inputEle.onfocus = function () {
            this.value = ''
        }
        inputEle.onblur = function () {
            this.value = '下次再来哟!'
        }
</script>


  eg2:校验用户登录
	<p>username:
        <input type="text" id="d1">
        <span style="color: red"></span>
    </p>
    <p>password:
        <input type="text" id="d2">
        <span style="color: red"></span>
    </p>
    <button id="suBtn">提交</button>

    <script>
        // 1.查找提交按钮的标签
        subEle = document.getElementById('suBtn')
        // 2.给按钮标签绑定点击事件
        subEle.onclick = function (){
            // 3.查找获取用户输入的标签并获取数据
            let userNameEle = document.getElementById('d1')
            let passWordEle = document.getElementById('d2')
            if(userNameEle.value === 'jason'){
                userNameEle.nextElementSibling.innerText = '用户名不能是Jason'
            }
            if(passWordEle.value === '123'){
                passWordEle.nextElementSibling.innerText = '密码不能是123'
            }
        }
    </script>
    
    
eg: 省份选择
省:
<select name="" id="d1"></select>

市:
<select name="" id="d2"></select>

<script>
  let data={
      '浙江':['杭州市','温州市'],
      "河北": ["廊坊市", "邯郸市"],
      '云南':['打理','昆明'],
      '上海':['徐汇区','闵行区'],
      "山东": ["威海市", "烟台市"],
  }
 // 提前查找好省和市的select标签
     let proSeEle = document.getElementById('d1')
     let citySeEle = document.getElementById('d2')
  // 1.获取所有的省信息
  for (let pro in data){
      // 2.创建option标签
      let proOpEle = document.createElement('option')
      // 3.添加文本及属性
      proOpEle.innerText = pro;
      proOpEle.setAttribute('value',pro);
      // 4.将创建好的option标签添加到省下拉框中
      proSeEle.appendChild(proOpEle)

  }
  // 5.给省标签绑定文本域变化事件 onchange
  proSeEle.onchange=function (){
      citySeEle.innerHTML=''  // 每次操作市之前清空市数据
      // 6.获取用户选择的省信息 根据省获取市信息
      let targetProDate = this.value;
      let cityDataList = data[targetProDate];
        // 7.循环获取每一个市信息 创建option标签 添加到市下拉框中
      for(let i=0;i<cityDataList.length;i++){
          let cityOpEle=document.createElement('option');
          cityOpEle.innerText=cityDataList[i];
          cityOpEle.setAttribute('value',cityDataList[i]);
          citySeEle.appendChild(cityOpEle)
      }
  }


作业

需求:简易计时器

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<input type="text" id="inputTime">
<button id="startTime">开始</button>
<button id="endTime">结束</button>
<script>
  function showTime(){
    let inputEle = document.getElementById('inputTime')
    let nowTime = new Date()
    inputEle.value = nowTime.toLocaleString()
  }
  showTime()

  let butStEle = document.getElementById('startTime')
  let butEndEle = document.getElementById('endTime')
  let t
  butStEle.onclick=function (){
      if (!t){
          t = setInterval(showTime,1000)
      }

  }
  butEndEle.onclick = function (){
      clearInterval(t)
      t=undefined
  }
</script>

</body>
</html>
 
 修改版:
 1.校验用户数据
	 let usernameEle = document.getElementById('d1');
    let passwordEle = document.getElementById('d2');
    let subBtn = document.getElementById('d3');
    subBtn.onclick = function () {
        if (usernameEle.value === 'jason'){
            usernameEle.nextElementSibling.innerText = '用户名不能是jason'
        }
        if (passwordEle.value === '123'){
            passwordEle.nextElementSibling.innerText = '密码不能是123'
        }
    }
    usernameEle.onfocus = function () {
        this.nextElementSibling.innerText = ''
    }
    passwordEle.onfocus = function () {
        this.nextElementSibling.innerText = ''
    }
	
 2.页面计时器
// 先写最简单的起步>>>:点击开始按钮 将那一刻的时间展示到input框中即可
   // 想让展示时间的代码能够根据时间的变化反复的执行>>>:循环定时任务
   // 再创建结束按钮点击即终止循环定时任务的执行>>>:结束定时任务
        let startBtnEle = document.getElementById('startBtn');
        let inputEle = document.getElementById('d1');
        let stopBtnEle = document.getElementById('stopBtn');

        function showTime() {
            let currentTime = new Date();
            inputEle.value = currentTime.toLocaleString()
        }
        // 全局定义一个存储计时器的变量名
        let t;
        startBtnEle.onclick = function () {
            if(!t){
                t = setInterval(showTime, 1000)
            }
        }

        stopBtnEle.onclick = function () {
            clearInterval(t)
            t = null;
        }
posted @ 2022-12-06 21:56  魔女宅急便  阅读(55)  评论(0)    收藏  举报
Title