JS - BOM(浏览器对象模型)

news2024/11/25 16:54:10

BOM

浏览器对象模型

BOM可以使我们通过JS来操作浏览器
在BOM中为我们提供了一组对象,用来完成对浏览器的操作

BOM对象

BOM(Browser Object Model)是指浏览器对象模型,它提供了与浏览器窗口进行交互的对象和方法。BOM包括一些核心对象,比如window、document、navigator等,用于访问浏览器窗口的各种属性和方法,以及操作浏览器的行为。通过BOM,我们可以控制浏览器的前进后退、打开新窗口、获取浏览器窗口大小等功能。需要注意的是,BOM并非W3C标准的一部分,不同浏览器对BOM的实现可能有所不同。

window Navigator Location History Screen

  • window对象 代表的是整个浏览器的窗口,同时window也是网页中的全局对象
  • Navigator 代表的当前浏览器的信息,通过该对象可以识别不同的浏览器
  • Location 代表的当前浏览器的地址栏信息,通过Location可以获取地址栏信息,或者操作浏览器跳转页面
  • History 代表浏览器的历史记录,可以通过该对象来操作浏览器的历史记录。由于隐私的问题,该对象不能获取到具体的历史记录,只能操作浏览器向前或者向后翻页
    而且该操作旨当次访问时有效
  • Screen 代表用户的屏幕信息,通过该对象可以获取到用户的显示器的相关信息

这些BOM对象在浏览器中都是作为window对象的属性保存的可以通过window对象来使用,也可以直接使用

  console.log(navigator);
  console.log(location);
  console.log(history);

Navigator 代表的当前浏览器的信息,通过该对象可以识别不同的浏览器,由于历史原因,Navigator对象中大部分属性都已经不能帮助我们识别浏览器了,一般我们只会userAgent来判断浏览器的信息(userAgent等价于浏览器),他是一个字符串,这个字符串中包含有用来描述浏览器信息的内容不同的刘篮球会有不同的userAgent

   console.log(navigator.appCodeName);//显示Mozilla
   console.log(navigator.appName);//显示Netscape(谷歌浏览器,火狐浏览器等)
   var nu=(navigator.userAgent);

BOM示例

<!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">
    <title>Document</title>
    <script type="text/javascript">
    //用正则表达式来判断是谷歌还是火狐浏览器
    if(/firefox/i.test(nu)){
        console.log("火狐浏览器");
    }
    if(/chrome/i.test(nu)){
        console.log("谷歌浏览器");
    }

    //IE11把自己的标识信息进行了伪装,userAgent不好判断,所以需要用别的办法
    //通过IE特有的对象来判断浏览器信息
    //比如 ActiveXobject
    /*
    if(window.ActiveXobject)
    {
        console.log("你是IE,我已经抓到你了");
    }else{
        console.log("你不是IE");
    }
    */
    //但是上面办法抓不到IE11,,因为IE11在布尔值上转成了fals
    //可以检查是否存在某对象来判断
    if("ActiveXObject" in window)
    {
        console.log("你是IE");
    }else{
        console.log("你不是IE");
    }
    </script>
</head>
<body>
    
</body>
</html>

返回上一个网页,相当于浏览器回退功能一样

History对象表示浏览器窗口的浏览历史记录。通过History对象,我们可以访问浏览器窗口的历史记录,比如前进、后退、跳转到指定页面等操作。

History对象提供了一些方法,比如back()、forward()、go(),分别用于在历史记录中向后导航、向前导航、跳转到指定页面。

通过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">
    <title>Document</title>
</head>
<body>
    <h1>回退测试主页面</h1>
    <a href="toNext.html">toNext</test2></a>
</body>
</html>

toNext.html

<!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">
    <title>Document</title>
    <script type="text/javascript">
    //History
    //可以用来操作浏览器向前或向后翻页
    //console.log(history);

    //length属性表示访问的url数量

    window.onload=function()
    {
        var btn=document.getElementById("btn");
        btn.onclick=function()
        {
            history.back() //跳转到上一个页面
            //效果跟浏览器回退功能一样

            //history.forward();跳转到下一个页面
            //效果跟浏览器前进功能一样

            //go()跳转到指定页面
            //需要一个整数作为参数
            //正数表示向前跳转,负数表示向后跳转
            //数字大小表示跳转几页
        };
    };
    </script>
</head>
<body>
    <button id="btn">按钮一</button>
    <h1>History</h1>
</body>
</html>

Location

Location对象表示当前窗口的URL信息,包括URL的协议、主机名、端口号、路径、查询参数等。通过Location对象,我们可以获取当前窗口的URL信息,也可以修改当前窗口的URL,实现页面的重定向等操作。

Location对象提供了很多属性和方法,比如href、host、pathname、search等,用于获取和设置URL的不同部分。

我们可以通过Location对象来获取当前页面的URL信息,也可以通过修改Location对象的属性来实现页面的跳转和重定向。需要注意的是,修改Location对象的属性会导致页面的重新加载。
Location 对象的常用属性包括:

href:返回当前页面的URL。
host:返回当前页面的主机名和端口号。
hostname:返回当前页面的主机名。
pathname:返回当前页面的路径部分。
search:返回当前页面的查询部分。
hash:返回当前页面的锚部分。

Location 对象的常用方法包括:

assign():加载新的文档。
replace():用新的文档替换当前文档。
reload():重新加载当前文档。
<!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">
    <title>Document</title>
    <script type="text/javascript">
    //Location
    //该对象中封装了浏览器地址栏的信息
    window.onload=function()
    {
        var btn=document.getElementById("btn");
        btn.onclick=function()
        {
            //console.log(location);
            //如果直接将location属性修改为一个完整的路径,或者相对路径
            //则我们页面会自动跳转到列表路径,并且会生成相应的历史记录
            //location="http://www.baidu.com";

            //assign()跳转方法,跟上面的修改地址效果一样,看情况使用
            //location.assign("http://www.baidu.com");

            //reload()用于重新加载当前页面,作用和刷新一样
            //如果再括号中传递一个参数true,则会进行强制清空缓存的刷新页面

            //replace()用当前的文档替换当前的文档
            //括号里传递的新链接参数可替换当前页面,调用完毕后悔跳转页面,但是不能回退
            //也就是不会生成历史记录,不能使用回退按钮回退
        }
    };
    </script>
</head>
<body>
    <button id="btn">按钮一</button>
    <h1>Location</h1>
</body>
</html>

定时调度

JavaScript提供了定时调度功能,可以通过setTimeout()和setInterval()这两个函数来实现。这两个函数可以让我们在指定的时间间隔后执行特定的代码,实现定时任务的功能。

setTimeout()函数:

  • setTimeout()函数用于在指定的毫秒数后执行一次指定的函数或代码。
  • 语法:setTimeout(function, milliseconds, arg1, arg2, …)
  • 第一个参数是要执行的函数或代码,第二个参数是延迟的毫秒数。
  • 可选的第三个参数及以后的参数是传递给函数的参数。
  • setTimeout()函数会返回一个唯一的标识符,可以用于取消定时任务。

setInterval()函数:

  • setInterval()函数用于每隔指定的毫秒数重复执行指定的函数或代码。
  • 语法:setInterval(function, milliseconds, arg1, arg2, …)
  • 参数和返回值与setTimeout()函数类似,不同之处在于setInterval()会每隔指定的时间重复执行指定的函数。
  • 如果需要停止定时任务,可以使用clearInterval()函数并传入setInterval()返回的标识符。
<!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">
    <title>Document</title>
    <script type="text/javascript">
    window.onload=function()
    {
        //获取count
        var count=document.getElementById("count");
        //JS程序的执行速度非常快,所以循环结构无法肉眼看见变化速度
        //如果希望一段程序,可以每间隔一段时间执行一次,可以使用定时调用

        //setInterval()
        //定时调用
        //可以将一个函数,每隔一段时间执行一次
        //参数
        //1.回调函数,该函数会每隔一段时间被调用一次
        //2.每次调用间隔的时间,单位是毫秒
        //返回值 返回一个Number类型的数据
        //这个数字用来作为定制器的唯一标识
        var num=0;
        var timer=setInterval(function()
        {
            count.innerHTML=num++;
            //设置关闭条件
            if(num == 21)
            {
                clearInterval(timer);
            }
        },100);

        //clearInterval()可以用来关闭一个定时器
        //方法中需要一个定时器的标识来作为参数,这样将关不表示对应的定时器

    };
    </script>
</head>
<body>
    <h1 id="count">1</h1>
</body>
</html>

使用JS切换图片

<!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">
    <title>Document</title>
    <style type="text/css">
    #box1
    {
        text-align: center;
    }
    </style>

    <script type="text/javascript">
    window.onload=function()
    {
        //使得图片可以自动切换
        var img1=document.getElementById("img1");
        //获取需要切换的图片
        var imgArr=["https://cdn.jsdelivr.net/gh/luoxiaohei520/MyPics@img/img/202404021941672.png","https://cdn.jsdelivr.net/gh/luoxiaohei520/MyPics@img/img/202404021940641.jpg"];
        //创建一个变量用作图片数组的索引
        var index=0;
        
        //为btn01绑定一个单击响应函数
        var btn01=document.getElementById("btn01");
        var timer;
        //开启一个定时器,来自动切换图片
        btn01.onclick=function()
        {
            //点击多次开启,会导致切换图片的速度越来越快
            //并且只能关闭最后一次开启的定时器

            //在开启一个新的计时器之前,要把上一个开启的计时器关闭
            clearInterval(timer);
            timer=setInterval(function()
        {
            index++;
            /*
            if(index>=imgArr.length)
            {
                index=0;
            }
            */
            //也可以用另一种方法实现循环
            index=index%imgArr.length;
            img1.src=imgArr[index];
        },500);
        };

        //为btn02绑定一个单击响应函数
        var btn02=document.getElementById("btn02");
        btn02.onclick=function()
        {
            //点击按钮以后,停止图片的切换,也就是关闭定时器
            clearInterval(timer);
            //clearnterval()可以接收任意参数
            //如果参数不是一个有效的标识,则什么也不做
        };
    }
    </script>
</head>
<body>
    <div id="box1">
    <img src="https://cdn.jsdelivr.net/gh/luoxiaohei520/MyPics@img/img/202404021940641.jpg" id="img1" width="600px" height="600px">
    <br>
    <button id="btn01">开始</button>
    <button id="btn02">停止</button>
    </div>
</body>
</html>

延迟调用

延迟调用是指在一定的时间延迟后执行特定的函数或代码。可以通过setTimeout()函数来实现延迟调用。

setTimeout()函数接受两个参数:要执行的函数或代码块以及延迟的时间(以毫秒为单位)。当调用setTimeout()函数时,指定的函数或代码块将在指定的延迟时间之后执行。

setTimeout(function() {
    console.log('这段代码将在延迟后执行');
}, 2000); // 2000毫秒后执行
<!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">
    <title>Document</title>
    <style type="text/css">
    
    </style>

    <script type="text/javascript">
    var num=1;
    //开启一个定时器
    //这个是定时调用
    /*
    setInterval(function()
    {
        console.log(num++);
    },3000);
    */
    
    //延时调用
    //延时调用一个函数不马山执行,而是隔一段时间以后再执行,而且只会执行一次
    //延时调用和定是调用的区别,定是调用会执行多次,而延时调用只会执行一次
    //延时调用和定时调用是可以互相代替的,在开发中可以根据自己需要去选择用哪个
    var timer=setTimeout(function()
    {
        console.log(num++);
    },3000);
    //关闭指定的延时调用
    clearTimeout(timer);

    </script>
</head>
<body>
    
</body>
</html>
定时调用案例一(向右移动)
<!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">
    <title>Document</title>
    <style type="text/css">
    *
    {
        margin: 0;
        padding: 0;
    }
    #box1
    {
        width: 100px;
        height: 100px;
        background-color: red;
        position: absolute;
        left:0;
    }
    #box2
    {
        width: 1px;
        height: 1000px;
        border-left: 1px black solid;
        position: absolute;
        left:800px
    }
    </style>

    <script type="text/javascript">
    window.onload=function()
    {
        //获取box1
        var box1=document.getElementById("box1");
        //获取btn01
        var btn01=document.getElementById("btn01");
        //定义一个timer变量
        var timer;
        //点击按钮以后,使得box1向右移动,left值增大
        btn01.onclick=function()
        {
            //每点击一次,都会开启一个新的定时器,所以需要在开启新的定时器之前关闭上一个定时器
            //每次开启定时器之前,都把之前的定时器全部清理一遍
            clearInterval(timer);
            //要让他一直执行,而不是只执行一次,可以使用定时器
            //因为需要给定时器设置一个关闭选项,所以先提前设置好定时器变量
            timer=setInterval(function()
            {
                //获取box1的原来值,但是这种方法得到的值有px单位,所以需要parseInt()来获取其中的值
                var oldValue=parseInt(getComputedStyle(box1,null)["left"]);
                //console.log(oldvalue);
                
                //给被赋值的新长度定义一个新变量
                newValue=oldValue+1;
                
                //在赋值前,给值加一些约束
                if(newValue >800)
                {
                    newValue=800;
                }
                
                //把新变量赋值给left
                box1.style.left=newValue+"px";
                
                //当元素移动到800px时,停止运动
                if(newValue >= 800)
                {
                    clearInterval(timer);
                }
            },30);
        };
        //下面这个方法需要考虑是否兼容IE8,为了方便,我直接使用getComputedStyle(obj,null)[name]
        /*
        function getStyle(obj,name)
        {
            if(window.getComputedStyle)
            {
                return getComputedStyle(obj,null)[name];
            }
            else
            {
                return obj.currentStyle[name];
            }
        }
        */
    };
    </script>
</head>
<body>
    <button id="btn01">点击按钮,box1向右移动</button>
    <br><br>
    <div id="box1"></div>
    <div id="box2"></div>
</body>
</html>
定时器调用案例二(向左向右移动)
<!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">
    <title>Document</title>
    <style type="text/css">
    *
    {
        margin: 0;
        padding: 0;
    }
    #box1
    {
        width: 100px;
        height: 100px;
        background-color: red;
        position: absolute;
        left:0;
    }
    #box2
    {
        width: 1px;
        height: 1000px;
        border-left: 1px black solid;
        position: absolute;
        left:800px
    }
    </style>

    <script type="text/javascript">
    window.onload=function()
    {
        //获取box1
        var box1=document.getElementById("box1");
        //获取btn01
        var btn01=document.getElementById("btn01");
        //定义一个timer变量
        var timer;
        //获取btn02
        var btn02=document.getElementById("btn02");
        //点击按钮以后,使得box1向右移动,left值增大
        btn01.onclick=function()
        {
            //每点击一次,都会开启一个新的定时器,所以需要在开启新的定时器之前关闭上一个定时器
            //每次开启定时器之前,都把之前的定时器全部清理一遍
            clearInterval(timer);
            //要让他一直执行,而不是只执行一次,可以使用定时器
            //因为需要给定时器设置一个关闭选项,所以先提前设置好定时器变量
            timer=setInterval(function()
            {
                //获取box1的原来值,但是这种方法得到的值有px单位,所以需要parseInt()来获取其中的值
                var oldValue=parseInt(getComputedStyle(box1,null)["left"]);
                //console.log(oldvalue);
                
                //给被赋值的新长度定义一个新变量
                newValue=oldValue+10;
                
                //在赋值前,给值加一些约束
                if(newValue >800)
                {
                    newValue=800;
                }
                
                //把新变量赋值给left
                box1.style.left=newValue+"px";
                
                //当元素移动到800px时,停止运动
                if(newValue >= 800)
                {
                    clearInterval(timer);
                }
            },30);

            //点击按钮以后,使得box1向右移动,left值增大
            btn02.onclick=function()
            {
                //每点击一次,都会开启一个新的定时器,所以需要在开启新的定时器之前关闭上一个定时器
                //每次开启定时器之前,都把之前的定时器全部清理一遍
                clearInterval(timer);
                //要让他一直执行,而不是只执行一次,可以使用定时器
                //因为需要给定时器设置一个关闭选项,所以先提前设置好定时器变量
                timer=setInterval(function()
                {
                    //获取box1的原来值,但是这种方法得到的值有px单位,所以需要parseInt()来获取其中的值
                    var oldValue=parseInt(getComputedStyle(box1,null)["left"]);
                    //console.log(oldvalue);
                
                    //给被赋值的新长度定义一个新变量
                    newValue=oldValue-10;
                
                    //在赋值前,给值加一些约束
                    if(newValue < 0)
                    {
                        newValue=0;
                    }
                
                    //把新变量赋值给left
                    box1.style.left=newValue+"px";
                
                    //当元素移动到0px时,停止运动
                    if(newValue == 0)
                    {
                        clearInterval(timer);
                    }
                },30);
            };
        };
        //下面这个方法需要考虑是否兼容IE8,为了方便,我直接使用getComputedStyle(obj,null)[name]
        /*
        function getStyle(obj,name)
        {
            if(window.getComputedStyle)
            {
                return getComputedStyle(obj,null)[name];
            }
            else
            {
                return obj.currentStyle[name];
            }
        }
        */
    };
    </script>
</head>
<body>
    <button id="btn01">点击按钮,box1向右移动</button>
    <button id="btn02">点击按钮,box2向左移动</button>
    <br><br>
    <div id="box1"></div>
    <div id="box2"></div>
</body>
</html>
定时器的案例三(上下左右移动)
<!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">
    <title>Document</title>
    <style type="text/css">
    #btn
    {
        margin: 0 auto;
        text-align: center;
    }
    *
    {
        margin: 0;
        padding: 0;
    }
    #box1
    {
        width: 100px;
        height: 100px;
        background-color: red;
        position: absolute;
        left:200px;
    }
    #box2
    {
        width: 100px;
        height: 100px;
        background-color: yellow;
        position: absolute;
        left:0;
        top: 200px;
    }
    #box3
    {
        width: 1px;
        height: 1000px;
        border-left: 1px black solid;
        position: absolute;
        left:800px
    }
    </style>

    <script type="text/javascript" src="../js/元素方块的简单操作.js"></script>
    <script type="text/javascript">
    window.onload=function()
    {
        //获取box1
        var box1=document.getElementById("box1");
        //获取box2
        var box2=document.getElementById("box2");
        //获取box3
        var box3=document.getElementById("box3");

        //获取btn01
        var btn01=document.getElementById("btn01");
        //获取btn02
        var btn02=document.getElementById("btn02");
        //获取btn03
        var btn03=document.getElementById("btn03");
        //获取btn04
        var btn04=document.getElementById("btn04");
        //获取btn05
        var btn05=document.getElementById("btn05");
        //获取btn06
        var btn06=document.getElementById("btn06");
        //获取btn07
        var btn07=document.getElementById("btn07");
        //获取btn08
        var btn08=document.getElementById("btn08");

        //点击btn01后,红色向右移动
        btn01.onclick=function()
        {
            move(box1,"left",800,20,function()
            {
                //当然可以进行套娃函数
                move(box1,"left",400,20,function(){});
            });
        };

        //点击btn02后,红色向左移动
        btn02.onclick=function()
        {
            move(box1,"left",0,20);
        };

        //点击btn03后,黄色向右移动
        btn03.onclick=function()
        {
            move(box2,"left",800,20);
        };

        //点击btn04后,黄色向左移动
        btn04.onclick=function()
        {
            move(box2,"left",0,20);
        };

        //点击btn05后,黄色向下移动
        btn05.onclick=function()
        {
            move(box2,"top",800,20);
        };

        //点击btn06后,黄色向上移动
        btn06.onclick=function()
        {
            move(box2,"top",0,20);
        };

        //点击btn07后,红色向下移动
        btn07.onclick=function()
        {
            move(box1,"top",800,20);
        };

        //点击btn08后,红色向上移动
        btn08.onclick=function()
        {
            move(box1,"top",0,20);
        };
        //点击测试按钮,
        //但因为调用了提前清定时器,所以在开启下一个定时器的时候,上一个定时器也会直接清除
        //需要对timer变量的调用进行一些修改
    };
        
        //下面这个方法需要考虑是否兼容IE8,为了方便,我直接使用getComputedStyle(obj,null)[name]
        /*
        function getStyle(obj,name)
        {
            if(window.getComputedStyle)
            {
                return getComputedStyle(obj,null)[name];
            }
            else
            {
                return obj.currentStyle[name];
            }
        }
        */
    </script>
</head>
<body>
    <div id="btn">
    <button id="btn01">红色右移</button>
    <button id="btn02">红色左移</button>
    <button id="btn07">红色下移</button>
    <button id="btn08">红色上移</button>
    <button id="btn03">黄色右移</button>
    <button id="btn04">黄色左移</button>
    <button id="btn05">黄色下移</button>
    <button id="btn06">黄色上移</button>
    </div>
    <br><br>
    <div id="box1"></div>
    <div id="box2"></div>
    <div id="box3"></div>
</body>
</html>

使用js完成一个轮播图

<!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">
    <title>Document</title>
    <style type="text/css">
    *
    {
        margin: 0;
        padding: 0;
    }
    /*设置outer 的样式*/
    #outer
    {
        /*设置宽和高*/
        width:520px;
        height: 333px;
        /*居中*/
        margin: 50px auto;
        background-color: yellow;
        padding: 10px 0;
        position: relative;
        /*裁剪溢出的内容*/
        overflow: hidden;
    }
    /*设置imglist的样式*/
    #imglist
    {
        /*去除项目符号*/
        list-style: none;
        /*设置ul的宽度*/
        width: 2600px;
        position: absolute;
        /*设置偏移量*/
        left: 0px;/*初始偏移量50px,后续一张图的偏移量是520px*/
    }
    /*设置图片中的li*/
    #imglist li
    {
        /*把li进行横向序列*/
        float: left;
        /*设置左右外边距*/
        margin: 0 10px;
    }
    /*设置图片规格*/
    #imgstyle
    {
        width: 500px;
        height: 333px;
    }
    /*设置导航按钮*/
    #navDiv
    {
        /*开启绝对定位*/
        position: absolute;
        /*设置位置*/
        bottom: 15px;
        /*设置left值,outer宽度520,navDiv宽度25*5=125px*/
        left:197px

    }
    #navDiv a
    {
        /*设置超链接浮动*/
        float: left;
        /*设置超链接的宽和高*/
        display: block;
        width: 15px;
        height: 15px;
        /*设置背景颜色*/
        background-color: red;
        /*设置左右外边距*/
        margin: 0 5px;
        /*设置透明*/
        opacity: 0.5;
    }
    /*设置鼠标移入的效果*/
    #navDiv a:hover
    {
        background-color: black;
    }
    </style>

    <script type="text/javascript" src="../js/元素方块的简单操作.js"></script>
    <script type="text/javascript">
    window.onload=function()
    {
        //设置imglist的宽度
        //获取imglist的宽度
        var imglist=document.getElementById("imglist");

        //获取页面中所有的img标签
        var imgArr=document.getElementsByTagName("img");

        //设置imglist的宽度
        imglist.style.width=520*imgArr.length+"px";

        //设置导航按钮居中
        //获取navDiv
        var navDiv=document.getElementById("navDiv");
        //获取outer
        var outer=document.getElementById("outer");
        //设置navDiv的left值
        navDiv.style.left=(outer.offsetWidth - navDiv.offsetWidth)/2 +"px";

        //,默认显示图片的索引
        var index=0;
        //获取所有的a
        var allA=document.getElementsByTagName("a");
        //设置默认选中的效果
        allA[index].style.backgroundColor="black";

        //以上是准备工作,下面开始设置功能
        //点击超链接就能切换到指定的图片
        //点击第一个超链接,显示第一个,以此类推
        //为所有的超链接都绑定单击响应函数
        for(let i=0;i<allA.length;i++)
        {
            allA[i].onclick=function()
            {
                //在点击的同时,关闭自动切换的定时器
                clearInterval(timer);

                //如果为每一个超链接都添加一个num属性
                //allA[i].num=i;如果定义了这个变量,那么就可以使用var来进行遍历
                //获取点击的超链接的索引
                console.log(i);
                index=i;
                //切换图片
                //第一张 0 0
                //第二张1 -520
                //第三章2 -1040
                //imglist.style.left=index*(-520)+"px";引入外部JS,也就是之前写过的move方法
                //修改被选中的超链接a
                //allA[index].style.backgroundColor="black";
                //此方法有BUG,点了之后变黑,但是不会自动变回去
                setA();

                //使用move函数
                move(imglist,"left",-520*index,20,function()
                {
                    //动画执行完毕,开启自动切换
                    autoChange();
                });
            };
        }

        //开启自动切换
        autoChange();

        //写一个变红变黑的方法,因为此方法仅在内部使用,所以卸载onload里面
        function setA()
        {
            //判断当前索引是否是最后一张图片
            if(index >= imgArr.length-1)
            {
                //则index设置为0
                index=0;

                //此时现实的最后一张图片,而最后一张图片和第一张图片是一模一样的
                //通过css将最后一张切换成第一章
                imglist.style.left=0;
            }
            //遍历所有a,并将它们的背景颜色设置为红色
            for(var i=0;i<allA.length;i++)
            {
                allA[i].style.backgroundColor="";//把内联样式设置为空串,然后div的样式成为默认
            }

            //将选中的a设置为黑色
            allA[index].style.backgroundColor="black";
        }

        //设置一个定时器变量
        var timer;
        //创建一个函数,用来开启自动切换图片
        function autoChange()
        {
            //开启一个定时器,用来定时去切换图片
            timer=setInterval(function()
            {
                //使索引进行自增
                index++;
                //判断index的值
                index=index % imgArr.length;
                //执行动画,切换图片
                //这样存在一个体验问题,div移动的时间也算在定时器时间里面了
                //切换到最后一张图后,会进行向右平移到第一张,这样会严重影响视觉效果
                //需要进行修改,来让切换到最后一张图后,继续向左平移但是图片是从第一张展示
                move(imglist,"left",-520*index,20,function()
                {
                    //修改导航按钮
                    setA();
                });
            },3000);
        }
    };
    </script>
</head>
<body>
    <!--创建一个外部的div,来作为一个大的容器-->
    <div id="outer">
        <!--创建一个ul,用来放置图片-->
         <ul id="imglist">
            <li><img src="https://cdn.jsdelivr.net/gh/luoxiaohei520/MyPics@img/img/202404021941672.png" id="imgstyle"></li>
            <li><img src="https://cdn.jsdelivr.net/gh/luoxiaohei520/MyPics@img/img/202404021941672.png" id="imgstyle"></li>
            <li><img src="https://cdn.jsdelivr.net/gh/luoxiaohei520/MyPics@img/img/202404021941672.png" id="imgstyle"></li>
            <li><img src="https://cdn.jsdelivr.net/gh/luoxiaohei520/MyPics@img/img/202404021941672.png" id="imgstyle"></li>
            <li><img src="https://cdn.jsdelivr.net/gh/luoxiaohei520/MyPics@img/img/202404021941672.png" id="imgstyle"></li>
            <li><img src="https://cdn.jsdelivr.net/gh/luoxiaohei520/MyPics@img/img/202404021941672.png" id="imgstyle"></li>
        </ul>
        <!--创建导航按钮-->
        <div id="navDiv">
            <a href="javascript:;"></a>
            <a href="javascript:;"></a>
            <a href="javascript:;"></a>
            <a href="javascript:;"></a>
            <a href="javascript:;"></a>
        </div>
    </div>
</body>
</html>

JS对类的操作

<!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">
    <title>Document</title>
    <style type="text/css">
    .b1
    {
        width: 100px;
        height: 100px;
        background-color: red;
    }
    .b2
    {
        height: 200px;
        background-color: yellow;
    }
    </style>
    <script type="text/javascript">
    window.onload=function()
    {
        //获取btn01
        var btn01=document.getElementById("btn01");
        //获取box
        var box=document.getElementById("box");

        //为btn01绑定单击响应函数
        btn01.onclick=function()
        {
            //修改box的样式
            //这种方式的性能是比较差的,而且这种形式需要很多的代码,修改不方便
            //box.style.width=200+"px";
            //box.style.heigh=200+"px";
            //box.style.backgroundColor="yellow";

            //如果通过修改class对应的样式,那么就可以很快的修改
            //可以通过修改元素的class属性来间接的修改样式
            //这样只需要修改一次,就可以同时修改多个样式
            //浏览器只需要重新渲染页面一次,性能比较好,并且这种方式可以使表现和行为进一步的分离
            //假设只想修改高度,不想修改宽度,那么只需要用box.className +=" b2";这个语法即可
            //box.className="b2";
            //box.className +=" b2";
            //addClass(box,"b2");//但是这个方法不停地点击后,class的字符串会出现不停地叠加
            //alert(hasClass(box,"b2"));判定class里面是否有b2
            //removeClass(box,"b2");//移除class中指定的字符串b2
            toggleClass(box,"b2");
        };

        //定义一个函数,用来向一个元素中添加指定的class属性值
        //obj 指要添加的class属性的元素
        //cn 要添加的class值
        function addClass(obj,cn)
        {
            obj.className += " "+cn;
        }

        //判断一个元素中是否含有指定的class
        function hasClass(obj,cn)
        {
            //判断obj中有没有cn class
            //创建一个正则表达式来进行判断
            var reg=new RegExp("\\b"+cn+"\\b");
            //alert("\\b"+reg+"\\b");
            return reg.test(obj.className);
        }

        //删除一个元素中的指定的class
        function removeClass(obj,cn)
        {
            //创建一个正则表达式来进行判断
            var reg=new RegExp("\\b"+cn+"\\b");
            //删除class
            obj.className=obj.className.replace(reg,"");//用空串替换正则表达式中指定的字符
        }

        //切换一个类
        //如果元素中具有该类,则删除
        //如果元素中没有该类,则添加
        function toggleClass(obj,cn)
        {
            //判断obj中是否含有cn
            if(hasClass(obj,cn))
            {
                //如果有,则删除
                removeClass(obj,cn);
            }
            //如果没有,则添加
            else
            {
                addClass(obj,cn);
            }
        }
    };
    </script>
</head>
<body>
    <button id="btn01">点击按钮以后修改box的样式</button>
    <br><br>
    <div id="box" class="b1 b2"></div>
</body>
</html>

JSON

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它基于JavaScript的语法,但独立于编程语言。在JavaScript中,可以使用JSON来表示和传输结构化的数据。以下是关于JavaScript中JSON的一些操作:

JSON对象: 在JavaScript中,JSON是一个全局对象,用于处理JSON数据的解析和序列化。

JSON.stringify()方法: JSON.stringify()方法用于将JavaScript对象转换为JSON字符串。

const person = { name: 'Alice', age: 30 };
const jsonStr = JSON.stringify(person);
console.log(jsonStr); // 输出:{"name":"Alice","age":30}

JSON.parse()方法: JSON.parse()方法用于将JSON字符串解析为JavaScript对象。

const jsonStr = '{"name":"Alice","age":30}';
const person = JSON.parse(jsonStr);
console.log(person.name); // 输出:Alice
console.log(person.age); // 输出:30

JSON格式: JSON支持字符串、数字、对象、数组、布尔值、null等数据类型,并且具有类似于JavaScript对象和数组的结构。

const data = {
    name: 'Alice',
    age: 30,
    hobbies: ['reading', 'traveling'],
    isStudent: false,
    address: {
        city: 'New York',
        country: 'USA'
    },
    car: null
};

示例
<!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">
    <title>Document</title>
    <script type="text/javascript">
    //JSON就是一个特殊格式的字符串,这个字符串可以被任意的语言所识别
    //并且可以转换为任意语言中的对象
    //JSON Javascript Object Notation JS对象表示法
    //JSON和JS对象的格式一样,只不过JSON字符串中的属性名必须加双引号
    //其他的和JS语法一样
    //JSON对象分类
    //1.对象{} 2.数组[]
    //JSON允许的值
    //1.字符串 2.数值 3.布尔值 4.空值(null) 5.数组 6.对象

    //JS中的对象只有JS自己认识,其他的语言都不认识
    //如何把这个JS对象传给他人
    //创建一个对
    /*
    var obj={"name":"孙悟空","age":18,"gender":"男"};//属性名name也可以不加引号,不影响运行
    console.log(obj);
    console.log(obj.name)
    */

    //创建一个JSON对象
    var obj='{"name":"孙悟空","age":18,"gender":"男"}';//把obj对象转换成字符串,这就是JSON
    console.log(obj);
    //创建一个JSON数组
    var arr='[1,2,3,4,5,6,7,8,9]';
    console.log(arr);
    //创建一个JSON对象,里面有一个数组
    var obj2='{"arr":[1,2,3,4]}';
    console.log(obj2);
    //创建一个数组,里面一个元素对应一个对象
    var arr2='[{"name":"孙悟空","age":18,"gender":"男"},{"name":"孙悟空","age":18,"gender":"男"}]'
    console.log(arr2);

    //将JSON字符串转换为JS中的对象
    //在JS中,为我们提供了一个工具类,就叫JSON
    //console.log(JSON);
    //首先创建一个JSON对象
    var json='{"name":"孙悟空","age":18,"gender":"男"}';
    //把JSON转换为JS
    //JSON.parse();
    //可以将JSON字符串转换为js对象
    //他需要一个JSON字符串作为参数,会将该字符串转换为JS对象
    var js=JSON.parse(json);
    //把JSON数组转换为JS数组
    var jsArr=JSON.parse(arr);
    console.log(json);
    console.log(js);
    console.log(js.name);
    console.log(jsArr);//控制台也正常输出arr数组
    //控制台会输出相关属性和对象,json已经被转换为js对象

    var obj3={name:"猪八戒",age:28,gender:"男"};
    //JS对象转换为JSON
    //JSON.stringify()
    //可以讲一个JS对象转换为JSON字符串
    //需要一个JS对象作为参数,会返回一个JSON字符串
    var jsonObj3=JSON.stringify(obj3);
    console.log(jsonObj3);//控制台显示obj3被成功转换为JSON字符串
    </script>
</head>
<body>
    
</body>
</html>

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++——StackQueue

目录 一Stack 1介绍 2接口 3模拟实现 4栈的oj题 二Queue 1介绍 2接口 3模拟实现 三容器适配器 1再谈栈和队列 四优先级队列 1接口 ​编辑 2仿函数 五dequeue的简单介绍 一Stack 1介绍 先来看看库中对栈的介绍&#xff1a; 1. stack是一种容器适配器&#x…

scaling laws for neural language models

关于scaling law 的正确认识 - 知乎最近scaling law 成了最大的热词。一般的理解就是&#xff0c;想干大模型&#xff0c;清洗干净数据&#xff0c;然后把数据tokens量堆上来&#xff0c;然后搭建一个海量H100的集群&#xff0c;干就完了。训练模型不需要啥技巧&#xff0c;模型…

解决 App 自动化测试的常见痛点!

App 自动化测试中有些常见痛点问题&#xff0c;如果框架不能很好的处理&#xff0c;就可能出现元素定位超时找不到的情况&#xff0c;自动化也就被打断终止了。很容易打消做自动化的热情&#xff0c;导致从入门到放弃。比如下面的两个问题&#xff1a; 一是 App 启动加载时间较…

Vue 移动端(H5)项目怎么实现页面缓存(即列表页面进入详情返回后列表页面缓存且还原页面滚动条位置)keep-alive缓存及清除keep-alive缓存

一、需求 产品要求&#xff1a;Vue移动端项目进入列表页&#xff0c;列表页需要刷新&#xff0c;而从详情页返回列表页&#xff0c;列表页则需要缓存并且还原页面滚动条位置 二、实现思路 1、使用Vue中的keep-alive组件&#xff0c;keep-alive提供了路由缓存功能 2、因为我项…

java快速构建飞书API消息推送、消息加急等功能

文章目录 飞书机器人自定义机器人自定义应用机器人 自定义应用发送消息普通文本 text富文本 post图片 image文件 file语音 audio视频 media消息卡片 interactive分享群名片 share_chat分享个人名片 share_user 批量发送消息消息加急发送应用内加急发送短信加急 发送电话加急spr…

Linux的网口名字的命名规则

在工作中&#xff0c;偶尔看到有些机器的网口名字是以ethX命令&#xff0c;有些则以enpXsX这种名字命名。网上的资料说的都不太明白,资料也无据可查&#xff0c;很难让人信服。于是决定自己查了下官方的资料和源码&#xff0c;把这些搞清楚。 官方文档&#xff1a;Predictable…

visual studio 2017开发QT框架程序

1. 配置开发环境 首先创建项目 进入到项目后&#xff0c;右键点击项目点击属性&#xff0c;配置如下&#xff1a;

使用 create-vue 脚手架工具创建一个基于 Vite 的项目,并包含加入 Vue Router 等可选项

如果你打算启动一个新项目&#xff0c;你可能会发现使用 create-vue 这个脚手架工具更容易&#xff0c;它能创建一个基于 Vite 的项目&#xff0c;并包含加入 Vue Router 的选项&#xff0c;指令如下&#xff1a; // npm npm create vuelatest// yarn yarn create vue// pnpm …

C语言中抽象的编译和链接原理

今天04.12&#xff0c;身体小有不适&#xff0c;但是睡不着觉&#xff0c;秉着不能浪费时间的原则&#xff0c;现在就简单写一下有关我们C语言中编译和链接的大体过程吧&#xff0c;因为编译和链接是比较抽象的&#xff0c;而且内容是比较底层&#xff0c;我们这里就简单了解它…

Docker 镜像推送到docker hub

查看容器 #sudo docker ps -a commit容器为镜像 $ sudo docker commit d7b5e8d56a75 ubuntu_pytorch39_v4 #sha256: ********** 查看镜像信息 $ sudo docker images 登录 docker hub $ sudo docker login --username用户名 registry.cn-beijing.aliyuncs.com #密码 为…

【电控笔记6】电流回路+延迟效应

问题提出 数字控制系统的delay: 5.4节有介绍T0=0.5TS 低通滤波器的时间常数? 可用示例程序 m2 2 1b 如下图画出开环系统的伯德图进行比较,如图 2-2-4 所示,由于延迟组件会侵蚀系统的相位,因此从图可以看出,加入延迟效应后,q轴电流回路的相位裕度(Phase Margin) 从…

jsoncpp 编译和使用

原文链接&#xff1a; jsoncpp的编译和使用 jsoncpp 编译出库文件 1.从github仓库下载 2.下载 cmake 工具 3.生成VS项目 4.编译得到需要的库文件 jsoncpp 的使用 查看原文

WebGL 2.0相较于1.0有什么不同?

作者&#xff1a;STANCH 1.概述 WebGL 1.0自推出以来&#xff0c;已成为广泛支持的Web标准&#xff0c;既能跨平台&#xff0c;还免版税。它通过插件为Web浏览器带来高质量的3D图形&#xff0c;这是迄今为止市场上使用最广泛的Web图形&#xff0c;并得到Apple&#xff0c;Goog…

如何使用 ArcGIS Pro 制作热力图

热力图是一种用颜色表示数据密度的地图&#xff0c;通常用来显示空间分布数据的热度或密度&#xff0c;我们可以通过 ArcGIS Pro 来制作热力图&#xff0c;这里为大家介绍一下制作的方法&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的POI数…

安装ubuntu双系统步骤

1&#xff0c;给U盘分区做启动盘 先下载ubuntu20.04.4-desktop-amd64.iso的镜像&#xff0c;双击打开UltraISO工具&#xff0c;然后点打开 点击写入&#xff0c;选择是 等待制作镜像写入U盘完成 系统镜像做完后&#xff0c;把需要给ubuntu安装的软件也一起拷贝到U盘里面 2&am…

2024年认证杯数学建模挑战赛C题全网最全解析

2024年认证杯C题的已经完成啦&#xff0c;包括参考论文&#xff0c;模型代码&#xff0c;分享给大家&#xff5e; 问题分析 对于这些问题&#xff0c;我们首先需要确定影响日光辐射降低效应的关键参数&#xff0c;例如海盐气溶胶的浓度、粒子大小、分布以及喷洒高度和范围。同…

性能优化-01

当看到性能指标时&#xff0c;你会首先想到什么呢&#xff1f;我相信 “高并发” 和 “响应快” 一定是最先出现在你脑海里的两个词&#xff0c;而它们也正对应着性能优化的两个核心指标—— “吞吐” 和 “延时” 。这两个指标是从应用负载的视角来考察性能&#xff0c;直接影…

CentOS7里ifcfg-eth0文件不存在解决方案/Centos7修改网络IP解决方案

Centos7网络IP地址手动设置 1、centos7没有ifcfg-eth0&#xff0c;我的centos7也没有其他博客说的什么ifcfg-ens33、ifcfg-ens32&#xff0c;然后我打开了我这里的ifcfg-eno***&#xff0c;结果发现就是centos6里的ifcfg-eth0里的网络配置。2、vim ifcfg-eno***&#xff08;按t…

禁止Chrome浏览器自动更新

1.需求场景 Chrome浏览器安装后会默认自动更新升级&#xff0c;对正常用户来说&#xff0c;人性化且便捷&#xff1b;对Selenium自动化程序来说&#xff0c;不胜其扰&#xff0c;任务频繁报错&#xff1a;chromedriver版本不匹配。 2.解决步骤 1.停止Google更新服务 2.修改h…

FebHost:给你注册法国.FR域名的8大理由

如果您的企业与法国有联系&#xff0c;或者您的目标受众是法国人&#xff0c;那么拥有 .fr 域名可以成为您的战略资产。以下是您可以考虑选择 .fr 域名的几个原因&#xff1a; 地理定位&#xff1a; 如果您的企业面向法国受众&#xff0c;或以与法国或法国境内某一特定地区的联…