zoukankan      html  css  js  c++  java
  • day55——JavaScript与浏览器进行交互,BOM/DOM

    今日内容

    1. BOM
    2. DOM
    3. 事件

    一、BOM

    BOM简介

    虽然我们已经学习了js的基本语法,但是我们还不能制作一些我们经常看到的网页的一些交互,我们需要继续学习BOM和DOM相关知识。

    BOM(Browser Object Model):浏览器对象模型 ,它能够让js操作浏览器,也就是跟浏览器进行交互

    BOM操作

    • window对象

      # window对象
      """window对象指的是浏览器窗口,Window对象是客户端JavaScript最高层对象之一。"""
      
      window.innerHeight  # 浏览器窗口的高度
      # 768
      window.innerWidth	# 浏览器窗口的宽度
      # 1366
      
      # 在当前窗口新建一个窗口打开页面,第一个参数写url,第二个参数直接为空即可,第三个参数写新建窗口的大小和位置
      window.open('https://www.baidu.com/','','height=400px,width=400px,ttop=400px,left=400px')
      
      # 关闭当前页面
      window.close()
      

      window子对象、

      # 1.检查浏览器
      window.navigator.appName
      # "Netscape"
      
      # 2.检测浏览器版本信息
      window.navigator.appVersion
      """
      "5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36""""
      
      # 3.用来表示当前是否是一个浏览器(反爬)
      window.navigator.userAgent
      """
      "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36""""
      
      """
      扩展:反爬措施
      		1.最简单最常用的一个就是用上面代码进行校验,看当前的请求的发起者是否是一个服务器
      	破解方法:
      		2.在代码中加上user-agent配置即可"""
      # 4.运行浏览器的操作系统
      window.navigator.platform
      # "Win32"
      
      # 如果是window的子对象那么window可以省略不写,写了看起来更明了。
      

      history对象

      控制页面前进后退,对应的就是浏览器左上方那两个向左、向右箭头。

      window.history.back()  # 回退到上一页
      
      window.history.forward()  # 前进到上一页
      

      location对象

      # 1.获取当前页面的url网址
      window.location.href
      
      # 2.跳转到指定的url('https://www.baidu.com/')
      window.location.href='https://www.baidu.com/'  # 跳转到百度首页
      
      # 3.刷新页面,相当于点击浏览器上方的小圆圈。
      window.location.reload()
      

      弹出框

      • 警告框alert

        alert('有内鬼,终止交易!!')
        
      • 确认框confirm

        confirm('带上这个金箍后,你再也不是个凡人,人世间的情欲不能再沾半点,如果你动心,这个金箍就会在你的头上越收越紧,苦不堪言!')
        # false  点击否
        # true	点击确认(难受)
        
      • 提示框prompt

        prompt('当时那把剑...这把的主人会爱上我,因为我决定说一个谎话。','曾经有一份真挚的爱...')  #第一个参数是提示的文本,第二参数是默认的值。
        

      计时器相关

      • 过一段事件之后触发(只触发一次)

        <body>
            <script>
                function func1 () {
                    alert('有内鬼')
                }
                t = setTimeout(func1,3000)// 毫秒为单位 3秒之后自动执行func1函
                clearTimeout(t)// 取消定时任务  如果你想要清除定时任务 需要提前用变量指代定时任务
            </script>
        </body>
        
      • 每隔一段时间后触发一次(循环)

        <body>
            <script>
                function func2 () {
                    alert('休息一下保护视力')
                }
                function show() {
                    let t2 = setInterval(func2, 3000)  // 每隔3秒执行一次
                    function inner() {
                        clearInterval(t2)  // 清除定时器
                    }
                    setTimeout(inner,9000)  // 9秒中之后触发,重复提示三层后清除计时器,不再提示。
                }
                show()
            </script>
        </body>
        

    二、DOM

    DOM简介

    DOM (Document Object Model)是指文档对象模型,通过它,可以访问HTML文档的所有元素,实现js操作标签的效果。

    DOM操作

    HTML DOM 模型被构造为对象的树。

    DOM操作能达到的效果

    • 能够改变页面中所有的HTML元素
    • 能够改变页面中HTML的属性
    • 能够改变页面中所有的CSS样式
    • 能够对页面中的所有事件做出反应

    DOM的操作步骤

    1. 先查找标签
    2. DOM操作标签

    DOM的操作需要用document打头。

    查找标签

    • 直接查找

      # 1.id查找
      """
      通过页面唯一的id进行查找,结果为一个单独的对象"""
      document.getElementById('d1')
      # <div id=​"d1">​…​</div>​
       
      # 2.类查找
      """通过属性查找,结果为数组,因为可能有多个标签具有该属性,需用索引取对象"""
      document.getElementsByClassName('c1')
      # HTMLCollection [p.c1]0: p.c1length: 1__proto__: HTMLCollection
            
      document.getElementsByTagName('div')
      # HTMLCollection(3) [div#d1, div, div, d1: div#d1]
                         
      # 3.标签查找
      """结果也为数组,用索引取对象,因为可能有多个该名称的标签"""
      let divEle = document.getElementsByTagName('div')[1]
      divEle
      <div>​div>div​</div>​
      
      """
      当你用变量名指代标签对象的时候 一般情况下都推荐你书写成以下格式,见名知意。
      xxxEle
      	divEle
      	aEle
      	pEle
      """
      
    • 间接查找

       # 先查找一个标签,找到后相对与该标签做间接查找
       let pEle = document.getElementsByClassName('c1')[0]  # 类查找,结果为数组,需用索引取值
      
      # 拿父节点
      pEle.parentElement
      """
      <div id=​"d1">​"div
          "<div>​div>div​</div>​<p class=​"c1">​…​</p>​<p>​div>p​</p>​</div>​"""
      
      pEle.parentElement.parentElement
      """<body>​…​</body>​"""
      
      pEle.parentElement.parentElement.parentElement
      """<html lang=​"en">​<head>​…​</head>​<body>​…​</body>​</html>​"""
      
      pEle.parentElement.parentElement.parentElement.parentElement
      """null"""
      
      
      
      let divEle = document.getElementById('d1')
      # 获取子标签
      
      # 获取所有子标签
      divEle.children
      
      # 通过索引获取对应的子标签
      divEle.children[1]
      
      # 获取第一个子标签(长子)
      divEle.firstElementChild
      
      # 获取最后一个子标签(幼子)
      divEle.lastElementChild
      
      
      
      # 获取同级别标签
      
      # 获取同级别下面第一个
      divEle.nextElementSibling
      
      # 同级别上面第一个
      divEle.previousElementSibling
      

    节点操作

    1)通过DOM操作动态的创建img标签,并且为标签加属性,最后添加到文本中

    let imgEle = document.createElement('img')  # 创建img标签
    
    imgEle.src = '111.png'  # 给标签设置默认的属性
     # "111.png"
    
    imgEle.username = 'jason'  # 自定义的属性没办法点的方式直接设置
    # "jason"
    imgEle
    # <img src=​"111.png">​
    
    
    imgEle.setAttribute('username','jason')   # 既可以设置自定义的属性也可以设置默认的书写
    imgEle
    # <img src=​"111.png" username=​"jason">​
    
    imgEle.setAttribute('title','一张图片')
    imgEle
    #<img src=​"111.png" username=​"jason" title=​"一张图片">​
    
    let divEle = document.getElementById('d1')
    divEle.appendChild(imgEle)  # 标签内部添加元素(尾部追加)
    # <img src=​"111.png" username=​"jason" title=​"一张图片">​
    

    2)

    """
    创建a标签
    设置属性
    设置文本
    添加到标签内部
    	添加到指定的标签的上面
    """
    
    let aEle = document.createElement('a')  # 创建a标签
    
    aEle
    # <a>​</a>​
    aEle.href = 'https://www.zhihu.com/'
    # "https://www.zhihu.com/"
    aEle
    #<a href=​"https:​/​/​www.zhihu.com/​">​</a>​
    
    aEle.innerText = '点我获取知识'  # 给标签设置文本内容
    "点我获取知识"
    aEle
    #<a href=​"https:​/​/​www.zhihu.com/​">​点我获取知识​</a>​
    
    let divEle = document.getElementById('d1') 
    let pEle = document.getElementById('d2')
    
    divEle.insertBefore(aEle,pEle)  # 添加标签内容指定位置添加
    <a href=​"https:​/​/​www.zhihu.com/​">​点我获取知识​</a>​
    
    

    3)补充

    """
    子标签:
        appendChild()      追加子标签
        removeChild()      删除子标签
        replaceChild()     替换子标签
    标签属性:
    	setAttribute()     设置属性
    	getAttribute()     获取属性
    	removeAttribute()  移除属性
     
    """
    

    innerText与innerHTML的区别

    divEle.innerText  # 获取标签内部所有的文本
    """ "div 点我有你好看!
    div>p
    div>span" """
    
    divEle.innerHTML  # 内部文本和标签都拿到
    """ "div
            <a href="https://www.zhihu.com/">点我有你好看!</a><p id="d2">div&gt;p</p>
            <span>div&gt;span</span>
        " """
        
    divEle.innerText = 'heiheihei'
    # "heiheihei"
    
    divEle.innerHTML = 'hahahaha'
    # "hahahaha"
    
    divEle.innerText = '<h1>heiheihei</h1>'  # 不识别html标签
    # "<h1>heiheihei</h1>"
    
    divEle.innerHTML = '<h1>hahahaha</h1>'  # 识别html标签
    # "<h1>hahahaha</h1>"
    

    获取值操作

    let seEle = document.getElementById('d2');
    # 获取标签内部的数据
    seEle.value
    # "111"
    
    let inputEle = document.getElementById('d1')
    inputEle.value #没有name属性无法获取值
    
    # 如果获取用户上传的文件数据
    let fileEle = document.getElementById('d3');
    
    # 只能获取文件的路径
    fileEle.value;
    "C:fakepath5.18.jpg"
    
    # 获取文件数据的数组
    fileEle.files
    """FileList {0: File, length: 1}
    0: File
    lastModified: 1589761933183
    lastModifiedDate: Mon May 18 2020 08:32:13 GMT+0800 (中国标准时间) {}
    name: "5.18.jpg"
    size: 81617
    type: "image/jpeg"
    webkitRelativePath: ""
    __proto__: File
    length: 1
    __proto__: FileList"""
    
    # 通过索引获取数组中的文件数据
    fileEle.files[0]
    """File {name: "5.18.jpg", lastModified: 1589761933183, lastModifiedDate: Mon May 18 2020 08:32:13 GMT+0800 (中国标准时间), webkitRelativePath: "", size: 81617, …}"""
    

    class、css操作

    let divEle = document.getElementById('d1')
    
    divEle.classList  # 获取标签所有的类属性
    """DOMTokenList(3) ["c1", "bg_red", "bg_green", value: "c1 bg_red bg_green"]"""
    
    
    divEle.classList.remove('bg_red')  # 移除某个类属性
    
    divEle.classList.add('bg_red')  # 添加类属性
    
    # 验证是否包含某个类属性
    divEle.classList.contains('c1')
    # true
    divEle.classList.contains('c2')
    # false
    
    # toggle
    
    
    divEle.classList.toggle('bg_red')  # 有则删除无则添加
    # false
    divEle.classList.toggle('bg_red')
    # true
    divEle.classList.toggle('bg_red')
    # false
    
    
    # DOM操作操作标签样式,统一先用标签.style起手
    let pEle = document.getElementsByTagName('p')[0]
    
    pEle.style.color = 'red'
    # "red"
    
    pEle.style.fontSize = '28px'
    # "28px"
    
    pEle.style.backgroundColor = 'yellow'
    # "yellow"
    
    pEle.style.border = '3px solid red'
    #"3px solid red"
    

    事件

    """
    达到某个事先设定的条件 自动触发的动作
    """
    # 绑定事件的两种方式
    <button onclick="func1()">点我</button>
    <button id="d1">点我</button>
    
    <script>
        // 第一种绑定事件的方式
        function func1() {
            alert(111)
        }
        // 第二种
        let btnEle = document.getElementById('d1');
        btnEle.onclick = function () {
            alert(222)
        }
    </script>
    
    
    """
    script标签既可以放在head内 也可以放在body内
    但是通常情况下都是放在body内的最底部
    
    
    # 等待浏览器窗口加载完毕之后再执行代码
    window.onload = function () {
                // 第一种绑定事件的方式
                function func1() {
                    alert(111)
                }
                // 第二种
                let btnEle = document.getElementById('d1');
                btnEle.onclick = function () {
                    alert(222)
                }
            }
    """
    
  • 相关阅读:
    浅谈.NET和JAVA的跨平台
    ADO.NET获取TIPTOP存储过程的返回值
    Hide DataGrid Columns via HeaderText
    笑话一则:开车的最高境界
    [推薦]面试时最常问的15问题
    美国小学生守则 VS 中国小学生守则
    Embedded UserControls: Revisited
    SOA认识存误区 详解SOA企业部署的六大关键要素
    Java、.NET,为什么不合二为一?
    [轉]informix语句祥解
  • 原文地址:https://www.cnblogs.com/zhangtieshan/p/12913079.html
Copyright © 2011-2022 走看看