加载,三大家族,延时器,递归location对象navigator对象history对象

加载事件

有很多业务和功能 都需要使用到外部资源(外部css js 图片 视频)
      我们希望等待资源都加载回来,才去做其他事情
      写代码的时候,我们会把所有的代码 都写在  window load事件中来确保 资源全部都可以使用 
复制代码

  <script>
      window.addEventListener('load', function () {
        console.log('load 标签加载完毕-标签对应外部资源加载完毕');
      });
      // DOMContentLoaded 
      // 页面的标签 都加载完毕就触发了,不需要等待标签的内容回来
      // video标签一生成, 事件就触发 
      // load事件等待 vide标签生成了,同时 video标签内的视频也加载回来 才触发 

      // video加载 分两部
      // 只是加载标签而已 很快 DOMContentLoaded    快
      // 会去加载 标签对应的视频 比较慢  load 慢
      document.addEventListener("DOMContentLoaded",function () {
        console.log("DOMContentLoaded 标签加载完毕就触发了");
      })
    </script>
复制代码

案例对比两者直接的差别

  </style>
    <!-- 以前写js 习惯写在head标签中 -->
    <!-- <script>
      // 等待标签加载完毕了,才去获取dom元素
      document.addEventListener('DOMContentLoaded', function () {
        const h1 = document.querySelector('h1');
        console.log(h1);
        h1.innerText = '我们自己修改的';
      });
      // js先执行,但是 dom元素还没有开始加载
    </script> -->
  </head>
  <body>
    <h1>大标题</h1>
     <img
      src="https://dss0.bdstatic.com/-0U0bnSm1A5BphGlnYG/tam-ogel/33867296_1452769018_259_194.jpg"
      alt=""
    /> 
    <!-- 
      load 作用 
      我希望  在h1标签上输出一张图片的高度
     -->
    <script>
      window.addEventListener('load', function () {
      // 等待图片完全加载了 内容也回来, 才触发,在上面这行代码里面可以获取到高度
       const img = document.querySelector('img');
      // 获取图片标签的宽度
       console.dir(img.height); 
          // 0 单独把获取高度的这两行代码放在外面高度为0 因为 代码执行到这里的时候 图片的内容还没有回来

      // document.querySelector("h1").innerHTML=img.height;
       });

      // 现在建议把代码 写在 </body> 上面 , 先等待dom标签加载,然后才去获取dom元素
    </script>
  </body>
复制代码

三大家族scroll ,offset,client

scroll家族

 <script>
      /* 
      scrollWidth  不包含 滚动条 大小 
      scrollWidth  等于容器可以滚动的大小 
       */
      const scrollDom = document.querySelector('.scroll-dom');
      // 输出它宽度高度
      console.log(scrollDom.scrollWidth);
      // console.log(scrollDom.scrollHeight);
      // 获取当前容器滚动了的距离
      scrollDom.addEventListener('scroll', function () {
        // console.log(this.scrollTop);// 获取当前容器的滚动距离
        console.log(this.scrollLeft); // 获取当前容器的滚动距离
      });
      /* 
      1 页面滚动 使用  window.addEventListener("scroll") 事件
      2 页面的滚动距离 document.documentElement.scrollTop

      1 元素滚动 dom.addEventListener("scroll")
      2 获取元素滚动的距离
        dom.scrollTop
        dom.scrollLeft

      3 scrollWidth 整个可以滚动的区间的宽度
      4 scrollHeight 整个可以滚动的区域的高度 

      小细节  PC端的滚动条大小 17px
      小细节 移动端的滚动条 不占大小 
       */
    </script>
复制代码

offset家族

 <script>
      const offsetDom = document.querySelector('.offset');

      // 获取宽度和高度 包含这滚动条的大小 
      console.log(offsetDom.offsetWidth);// 300 
      console.log(offsetDom.offsetHeight);// 300
      // console.log(offsetDom.scrollWidth); // 283
      // console.log(offsetDom.scrollHeight);// 283 

      // 获取当前元素距离 定位了的父元素的大小(找不到定位了的父元素,相对于页面来计算)
      console.log(offsetDom.offsetLeft);
      console.log(offsetDom.offsetTop);
      /* 
      总结 offset家族
      1 offsetWidth  获取元素的宽度 包含这滚动条
      2 offsetHeight 获取元素的高度 包含这滚动条
      3 offsetLeft 获取定位了的父元素的 水平距离 左 
      4 offsetTop 获取定位了的父元素的 垂直距离 上
       */
    </script>
复制代码

client家族

 <script>
      const clientDom = document.querySelector('.client');
      // 宽度和高度
      console.log(clientDom.clientWidth); // 不包含 滚动条(类似 scrollWidth)
      console.log(clientDom.clientHeight); // 不包含 滚动条(类似 scrollHeight)

      // 获取边框的大小
      console.log(clientDom.clientLeft); // 左边框
      console.log(clientDom.clientRight); // 有没有?
      console.log(clientDom.clientTop); // 上边框  
    </script>
复制代码

总结

 scollWidth     获取容器的宽度(包含滚动的区域)  scrollHeight 获取容器的高度 (包含滚动的区域)
 offsetWidth    获取可视区域的宽度(包含滚动条)   offsetHeight 获取元素的高度 包含这滚动条
 clientWidth    获取可视区域的宽度(不包含滚动条) clientHeight    获取可视区域的高度(不包含滚动条)

  scrollLeft    获取左侧滚动的距离                scrollTop   获取顶部滚动的距离 
  offsetLeft    获取和已经定位了的父级元素的左距离  offsetTop  获取和已经定位了的父级元素的上面距离
  clientLeft    获取左边框的大小                  clientTop   获取上边框的大小 
复制代码

屏幕大小改变事件

页面大小发生变化了就会触发的事件 resize window来绑定


    <script>
      // 页面大小发生变化了就会触发的事件 resize window来绑定
      window.addEventListener('resize', function (event) {
        console.log('页面大小发生变化了');
      });
    </script>

复制代码

rem

 <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }
      div {
        width: 1rem;
        height: 1rem;
        background-color: aqua;
        font-size: 1rem;
      }
    </style>
  </head>
  <body>
    <div>div</div>
    
      // 页面大小发生变化了就会触发的事件 resize window来绑定
      window.addEventListener('resize', function (event) {
        // 移动端屏幕适配 rem   淘宝js库,flexible.js  作用  设置html的字体大小 为当前页面的宽度的十分之一
        // 设置页面html标签的字体大小为屏幕的十分之一
        document.documentElement.style.fontSize =
          document.body.offsetWidth / 10 + 'px';
      });
    </script>
  </body>
复制代码

响应式布局js文件

方便告诉我们屏幕的种类和宽度

<script>
const width = document.body.offsetWidth;

        if (width > 1200) {
          document.querySelector('title').innerText = `大屏幕 ${width}`;
        } else if (width > 992) {
          document.querySelector('title').innerText = `中等屏幕 ${width}`;
        } else if (width > 768) {
          document.querySelector('title').innerText = `小屏幕 ${width}`;
        } else {
          document.querySelector('title').innerText = `极小屏幕 ${width}`;
        }
      });
    </script>
复制代码

swiper使用

https://www.swiper.com.cn/usage/index.html
1 下载swiper对应的文件 - css + js 
  2 分布引入他们
  3 拷贝别人的固定结构
  4 拷贝写好的swiper 初始化js代码
复制代码

延时器

 <script>
      // 延时器 - 只会执行一次而已
      let timeid = setTimeout(function () {
        console.log('猜猜我是谁');
      }, 5000);
      timeid
      // 取消延时器
      //clearTimeout(timeid);

    </script>
复制代码

递归

一个函数调用自己

<body>
    <div>
      <p>
        <span
          ><a href=""> <button></button> </a
        ></span>
      </p>
    </div>
    <script>
      /* 
      递归
      1 一个函数调用自己  

      2 使用场景
        有一个函数,可以打印出 一个dom元素的所有祖先元素 
        不可能提前知道 这个a标签有多少个父元素 

        这个函数接收一个参数,= dom 
        如果这个dom元素有父元素,就继续调用自己函数
       */
      // let index = 0;
      // function func() {
      //   index++;
      //   console.log(index);
      //   func();
      // }

      // func();

      const button = document.querySelector('button');

      getParent(button);
      function getParent(dom) {
        console.log(dom);
        if (dom.parentNode) {
          // 如果有父元素
          getParent(dom.parentNode);
        } else {
          console.log('结束啦');
        }
      }
    </script>
  </body>
复制代码

使用延时器实现定时器(递归)

 <script>
      // 定时器 不主动清除,定时器永远执行下去
      // 延时器 只会执行一次
      // 延时器实现定时器的功能
      // 在延时器 又开启一个延时器,
      // 递归 自己调用自己  函数自己调用自己 
      let index=0;
      function func() {
        console.log(++index);
        setTimeout(func,1000);
      };
      func();
    </script>
复制代码

js执行机制

location对象

 <body>
    <button>跳转到百度</button>
    <script>
      // 1 使用a标签 href 属性 可以实现页面跳转
      // 2 在js中,也可以直接跳转  location.href 来跳转
      // 3 location.href 也可以实现刷新 location.href = location.href;
      // 4  location.reload(true);// true 强制刷新!
      // 5 search 后一个阶段就会用到它 了  获取 url上 ? 后面一串字符  /17-location.html?a=1&b=2
      // 6 hash 学习到了vue阶段就会用到了 获取 # 后面一串字符 /17-location.html#/index  #/index
      const button = document.querySelector('button');
      button.addEventListener('click', function () {
        // location.href="http://www.baidu.com";
        // console.log(location.href);// http://127.0.0.1:5500/17-location.html
        // 刷新功能
        // location.href = location.href; // 刷新功能
        // reload实现刷新
        // location.reload(true);// true 强制刷新! 
        console.log(location.hash);
      });
    </script>
  </body>
复制代码

navigator对象

作用 检测当前浏览器的版本和型号
       手机端来说,  安卓手机 可以直接下载apk 手机软件的 
                     ios 手机来说 不可以直接下载手机软件 必须要回到苹果的应用商店中来下载
       安卓手机来说 点击 下载软件 给它下载apk
       iphone手机来说 点击 下载软件 可能只需给苹果手机一个提示 


       可以识别出 当前的访问设备是 pc端还是移动端
       后台根据 当前用户的设备类型 来返回 对应的平台的页面
       pc端来访问我的页面 我给你显示pc端的页面
       移动端来访问我的页面 我给你显示移动端的页面 
       直接找别人写好的代码 检测即可,也可以自己花时间写

复制代码

history对象

 <body>
    <a href="http://www.baidu.com">百度</a>
    <button class="forward">前进</button>
    <button class="back">后退</button>
    <script>
      const forward = document.querySelector('.forward');
      forward.addEventListener('click', function () {
        // history.forward();
        history.go(1); // 前进一个记录
      });
      const back = document.querySelector('.back');
      back.addEventListener('click', function () {
        // history.back();
        history.go(-1); // 后退一个记录
      });
    </script>
  </body>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java递归遍历对象属性和子对象是指在一个对象递归地遍历所有属性,包括子对象中的属性。 首先,我们需要编写一个递归方法,该方法可以接收一个对象作为参数。在方法内部,我们首先通过反射获取当前对象的所有属性。然后,我们可以通过遍历这些属性,对于每个属性就行一些操作,比如输出属性名称和值。 如果属性是一个对象类型,我们可以对该属性也进行递归调用,以对子对象的属性进行遍历。 下面是一个简单的示例代码: ```java import java.lang.reflect.Field; public class ObjectTraversal { public static void traverseObject(Object obj) throws IllegalAccessException { Class<?> clazz = obj.getClass(); Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { field.setAccessible(true); System.out.println("属性名称:" + field.getName()); System.out.println("属性值:" + field.get(obj)); if (field.getType().isAssignableFrom(Object.class)) { traverseObject(field.get(obj)); // 递归遍历子对象 } } } public static void main(String[] args) throws IllegalAccessException { // 假设我们有一个Person对象 Person person = new Person("张", 20, new Address("北京", "朝阳区")); // 使用递归遍历对象属性和子对象属性 traverseObject(person); } } class Person { private String name; private int age; private Address address; // 省略构造方法和getter/setter方法 public Person(String name, int age, Address address) { this.name = name; this.age = age; this.address = address; } } class Address { private String city; private String district; // 省略构造方法和getter/setter方法 public Address(String city, String district) { this.city = city; this.district = district; } } ``` 以上代码中,我们定义了一个`traverseObject`方法来递归遍历对象属性和子对象属性。然后在main方法中创建了一个Person对象,并使用`traverseObject`方法对其进行遍历。输出结果如下: ``` 属性名称:name 属性值:张 属性名称:age 属性值:20 属性名称:address 属性值:Address@1b6d3586 属性名称:city 属性值:北京 属性名称:district 属性值:朝阳区 ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值