js BOM对象 DOM对象

本文详细介绍了浏览器对象模型(BOM)中的window对象及其方法,包括弹窗、定时器等功能,并深入探讨了HTML文档对象模型(DOM)的概念、节点类型及操作方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

BOM对象

window对象

所有浏览器都支持 window 对象。
概念上讲.一个html文档对应一个window对象.
功能上讲: 控制浏览器窗口的.
使用上讲: window对象不需要创建对象,直接使用即可.

Window 对象方法(全局变量)

alert()            显示带有一段消息和一个确认按钮的警告框。
confirm()          显示带有一段消息以及确认按钮和取消按钮的对话框(确定为true、取消为flase)。
prompt()           显示可提示用户输入的对话框。

open()             打开一个新的浏览器窗口或查找一个已命名的窗口。
close()            关闭浏览器窗口。

setInterval()      按照指定的周期(以毫秒计)来调用函数或计算表达式。
clearInterval()    取消由 setInterval() 设置的 timeout。
setTimeout()       在指定的毫秒数后调用函数或计算表达式。
clearTimeout()     取消由 setTimeout() 方法设置的 timeout。
scrollTo()         把内容滚动到指定的坐标。

方法使用

1、alert confirm prompt以及open函数

//----------alert confirm prompt----------------------------
    //alert('aaa');
    
    
    /* var result = confirm("您确定要删除吗?");
    alert(result); */

    //prompt 参数1 : 提示信息.   参数2:输入框的默认值. 返回值是用户输入的内容.

    // var result = prompt("请输入一个数字!","haha");
    // alert(result);


    方法讲解:    
        //open方法 打开和一个新的窗口 并 进入指定网址.参数1 : 网址.
        //调用方式1
            //open("http://www.baidu.com");
        //参数1 打开新窗口的网址(可不填).  参数2.填入新窗口的名字(一般可以不填). 参数3: 新打开窗口的参数.
            open('','','width=200,resizable=no,height=100'); // 新打开一个宽为200 高为100的窗口
       resizable 窗口是否可调节 
//close方法 将当前文档窗口关闭. //close();

示例:

var num = Math.round(Math.random()*100);
    function acceptInput(){
    //2.让用户输入(prompt)    并接受 用户输入结果
    var userNum = prompt("请输入一个0~100之间的数字!","0");
    //3.将用户输入的值与 随机数进行比较
            if(isNaN(+userNum)){
                //用户输入的无效(重复2,3步骤)
                alert("请输入有效数字!");
                acceptInput();
            }
            else if(userNum > num){
            //大了==> 提示用户大了,让用户重新输入(重复2,3步骤)
                alert("您输入的大了!");
                acceptInput();
            }else if(userNum < num){
            //小了==> 提示用户小了,让用户重新输入(重复2,3步骤)
                alert("您输入的小了!");
                acceptInput();
            }else{
            //答对了==>提示用户答对了 , 询问用户是否继续游戏(confirm).
                var result = confirm("恭喜您!答对了,是否继续游戏?");
                if(result){
                    //是 ==> 重复123步骤.
                    num = Math.round(Math.random()*100);
                    acceptInput();
                }else{
                    //否==> 关闭窗口(close方法).
                    close();
                }
            }
    }

2、setInterval(定时器),clearInterval(清除定时器)

setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭。由 setInterval() 返回的 ID 值可用作 clearInterval() 方法的参数。

语法:setInterval(code,millisec)
其中,code为要调用的函数或要执行的代码串。millisec周期性执行或调用 code 之间的时间间隔,以毫秒计。


3、input,button

<head>
<script> function bar(){ // 获取当前时间字符串 var curr_time=new Date(); var s_time=curr_time.toLocaleString(); // 找到标签,然后对其value赋值 var ele=document.getElementById("timer"); ele.value=s_time; } function stop(){ alert(123 ); }   </script> </head> <body> <!--onfocus 获取光标事件--> < type="text" id="timer" οnfοcus="start()"> <!--单击鼠标事件--> <button οnclick="stop()">end</button> </body>

定时器练习:

!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <script>

        var ID;
        function start(){
            if (ID==undefined){
                 bar();
                 ID=setInterval(bar,1000); // 123
                }
        }
        function bar(){

            // 获取当前时间字符串
            var curr_time=new Date();
            var s_time=curr_time.toLocaleString();

            // 找到标签,然后对其value赋值
            var ele=document.getElementById("timer");
            ele.value=s_time;

        }
        function stop(){
            clearInterval(ID);//清除最后一次定时器
            ID=undefined;
        }
    </script>
</head>
<body>


<!--onfocus  获取光标事件-->
<input type="text" id="timer" οnfοcus="start()">
<!--单击鼠标事件-->
<button οnclick="stop()">end</button>


</body>
</html>

 

DOM对象

什么是HTML  DOM

  •     HTML  Document Object Model(文档对象模型)
  •     HTML DOM 定义了访问和操作HTML文档的标准方法

    HTML DOM 把 HTML 文档呈现为带有元素、属性和文本的树结构(节点树)

DOM

 

画dom树是为了展示文档中各个对象之间的关系,用于对象的导航。

DOM节点

节点类型

HTML 文档中的每个成分都是一个节点。

DOM 是这样规定的:
    整个文档是一个文档节点 
    每个 HTML 标签是一个元素节点 
    包含在 HTML 元素中的文本是文本节点 
    每一个 HTML 属性是一个属性节点

其中,document与element节点是重点。attribute是属性节点。

节点关系

节点树中的节点彼此拥有层级关系。
父(parent),子(child)和同胞(sibling)等术语用于描述这些关系。父节点拥有子节点。同级的子节点被称为同胞(兄弟或姐妹)。

  •     在节点树中,顶端节点被称为根(root)
  •     每个节点都有父节点、除了根(它没有父节点)
  •     一个节点可拥有任意数量的子
  •     同胞是拥有相同父节点的节点

下面的图片展示了节点树的一部分,以及节点之间的关系:


访问 HTML 元素(节点),访问 HTML 元素等同于访问节点,我们能够以不同的方式来访问 HTML 元素。

节点查找

直接查找节点(全局查找,如果要找某个节点下的节点,先定位全局下的这个某个节点)

document.getElementById(“idname”)
document.getElementsByTagName(“tagname”)
document.getElementsByName(“name”)
document.getElementsByClassName(“name”) 
<body>

<p>hello P</p>
<div class="c1">
    <div class="c2">c22222</div>
    <p>c1----PPPP</p>
</div>
<a href="#" id="ID1"></a>

<script>
        var eles=document.getElementById("ID1");
        console.log(eles);
        eles=document.getElementsByTagName("p");
        console.log(eles[0]);

</script>
<body>
View Code

导航节点属性

注意,js中没有办法找到所有的兄弟标签!

'''

parentElement           // 父节点标签元素

children                // 所有子标签

firstElementChild       // 第一个子标签元素

lastElementChild        // 最后一个子标签元素

nextElementtSibling     // 下一个兄弟标签元素

previousElementSibling  // 上一个兄弟标签元素

'''
<head>
    <meta charset="UTF-8">
    <title></title>
    <style>
      .item  .c1{
            display: none;
        }
    </style>
</head>
<body>

<div>
    <div class="item">
        <p οnclick="foo(this)">菜单一</p>
        //this将<p>标签本身当做参数传入函数
        <div class="c1">111111</div>
    </div>
    <div class="item">
        <p οnclick="foo(this)">菜单二</p>
        <div class="c1">111111</div>
    </div>
    <div class="item">
        <p οnclick="foo(this)">菜单三</p>
        <div class="c1">11111111</div>
    </div>
</div>
<script>
    
        function foo(self){
            // alert(1234)
            // console.log(self)  //  指代的当前操作标签
//             console.log(self.nextElementSibling);
//            var ele=self.nextElementSibling;
//            ele.style.display="block";


// 思路1      查找上一级父类标签
//            console.log(self.parentElement);
//            var eles=document.getElementsByClassName("c1");
//            for (var i=0;i<eles.length;i++){
//                // console.log(eles[i])
//                eles[i].style.display="none";
//            }
//            self.nextElementSibling.style.display="block";
//思路二      查找父类标签的父类标签
//            var eles=self.parentElement.parentElement.children;
//            console.log(eles)
//思路三       查找父类标签的上下兄弟标签
             var eles=self.parentElement.previousElementSibling;
             console.log(eles)
        }



</script>
</body>
菜单查找标签

 

节点操作

创建节点:

1
createElement(标签名) :创建一个指定名称的元素。

例:var  tag=document.createElement(“input")
            tag.setAttribute('type','text');

添加节点:只能在父节点的子节点追加(somenode是父节点)

追加一个子节点(作为最后的子节点)

somenode.appendChild(newnode) 

把增加的节点放到某个节点的前边

somenode.insertBefore(newnode,某个节点);

删除节点:

removeChild():获得要删除的元素,通过父元素调用删除

替换节点:

somenode.replaceChild(newnode, 某个节点);通过父元素调用替换

节点属性操作:

1、获取和赋值文本节点的值:innerText(只拿最终的文本)    innerHTML(可以取包含文本的标签)

elementNode.innerText = ' '

2、attribute操作elementNode元素节点

     elementNode.setAttribute(name,value)    

     elementNode.getAttribute(属性名)        <-------------->elementNode.属性名(DHTML语法,取值设值)

     elementNode.removeAttribute(“属性名”);

3、value获取当前选中的value值
        1.input  
        2.select (selectedIndex)
        3.textarea 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<select name=" " id="select" οnchange="foo(this)">
    //内容改变,触发onchange
    <option value="111">河南省</option>
    <option value="222">陕西省</option>
    <option value="333">山东省</option>
</select>
<script>
    var ele=document.getElementById("select");
        console.log(ele);
    function foo(self) {
        console.log(self); //返回下拉框的标签
        console.log(self.selectedIndex);//返回下拉框选择项的索引值
    }
</script>
</body>
</html>
select value

4、innerHTML 给节点添加html代码:
该方法不是w3c的标准,但是主流浏览器支持
        tag.innerHTML = “<p>要显示内容</p>”;

5、关于class的操作:

elementNode.className
//返回字符串
elementNode.classList.add
elementNode.classList.add('btn','btn-info')
//返回数组 elementNode.classList.remove
//返回数组

 6、改变css样式:

<p id="p2">Hello world!</p>

document.getElementById("p2").style.color="blue";

                             .style.fontSize=48px//所有在css中-的方法,去掉-,把首字母的大写

DOM Event(事件)

事件类型

onclick        当用户点击某个对象时调用的事件句柄。
ondblclick     当用户双击某个对象时调用的事件句柄。

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

onkeydown      某个键盘按键被按下。          应用场景: 当用户在最后一个输入框按下回车按键时,表单提交.
onkeypress     某个键盘按键被按下并松开。
onkeyup        某个键盘按键被松开。

onload         一张页面或一幅图像完成加载。

onmousedown    鼠标按钮被按下。
onmousemove    鼠标被移动。
onmouseout     鼠标从某元素移开。
onmouseover    鼠标移到某元素之上。
onmouseleave   鼠标从元素离开

onselect       文本被选中。
onsubmit       确认按钮被点击。

 

绑定事件方式

方式1:

<div id="div" οnclick="foo(this)">点我呀</div>

<script>
    function foo(self){           // 形参不能是this;
        console.log("点你大爷!");
        console.log(self);   
    }
</script>

方式2:

<p id="abc">试一试!</p>

<script>

    var ele=document.getElementById("abc");

    ele.onclick=function(){
        console.log("ok");
        console.log(this);    // this直接用
    };

</script>

 绑定方法:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<div οnclick="alert(456)" style="color: red">DIV</div>
<div οnclick="foo(456)" style="color: red">DIV</div>

<p>PPP</p>
<p>PPP</p>
<p>PPP</p>

<button>click</button>
<script>
     // 绑定方式一
//     function foo(self){
//         console.log(self);
//     }

//绑定方式二 标签对象.事件=function(){};

//      var ele =document.getElementsByTagName("p")[0];
//      ele.οnclick=function(){
//          console.log(this);//this指自己标签本身
//          alert(this.innerText);
//          //alert(123);
//      };

// var eles =document.getElementsByTagName("p");
//    for (var i=0;i<eles.length;i++){
//        eles[i].οnclick=function(){
//            alert(789);
//        }
//    }

</script>

</body>
</html>
绑定方法

事件介绍:
1、onclick ondblclick

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<div οnclick="alert('单击事件')">单击事件</div>
<div οndblclick="alert('双击事件')">双击事件</div>
<input type="text" value="请输入姓名" οnfοcus="enter(this)" οnblur="exit(this)">
<script>
    function enter(self){
       self.value="";
    }
    function exit(self){
        if(self.value.trim()==""){
             self.value="请输入姓名";
        }
    }
</script>

</body>
</html>
View Code

2、onchange  onfocus

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>

<select name="" class="select_pro">
    <option value="1">河南省</option>
    <option value="2">湖南省</option>
    <option value="3">云南省</option>
</select>

<select name=""  class="select_city"></select>

<script>
    var info={"河南省":["郑州","洛阳","开封"],"湖南省":["湘潭","长沙","岳阳"],"云南省":["大理","昆明"]}

    var ele=document.getElementsByClassName("select_pro")[0];
    var ele_2=document.getElementsByClassName("select_city")[0];
    ele.οnchange=function(){
         var arrs=ele.children;
         // console.log(arrs);
        // console.log(this.selectedIndex);//返回选择的select的选项索引值
        var sindex=this.selectedIndex;//取到选项的索引值
        var province=arrs[sindex].innerText;//取到选项的文本
        var citys_arr=info[province];
        //console.log(citys_arr); // ["","",""]城市的数组

        var ele2_children=ele_2.children;//清空select的子元素
        for (var j=0;j<ele2_children.length;j++){//省份选择变换时,清空上一个选项创建的标签
            ele_2.removeChild(ele2_children[0])        }

        // -----    ele_2.options.length=0;  //  DHML清空select的子元素
        //        console.log(ele_2.options);

        for (var i=0;i<citys_arr.length;i++){
                var option=document.createElement("option");//创建标签
                option.innerText=citys_arr[i];//向标签内添加文本
                // console.log(option);
                ele_2.appendChild(option);//将标签添加进select标签内
        }
    }


</script>
</body>
</html>
onchange二级联动
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <script>

        var ID;
        function start() {
            if (ID == undefined) {
                bar();
                ID = setInterval(bar, 1000); // 123
            }
        }
        function bar(){

            // 获取当前时间字符串
            var curr_time=new Date();
            var s_time=curr_time.toLocaleString();

            // 找到标签,然后对其value赋值
            var ele=document.getElementById("timer");
            ele.value=s_time;

        }
        function stop(){
            clearInterval(ID);
            ID=undefined;
        }

    </script>
</head>
<body>


<!--onfocus  获取光标事件-->
<input type="text" id="timer" οnfοcus="start()">
<!--单击鼠标事件-->
<button οnclick="stop()">end</button>


</body>
</html>
onfocus

3、onload:

onload 属性开发中只给body元素加,这个属性的触发标志着页面内容被加载完成。应用场景: 当有些事情我们希望页面加载完立刻执行,那么可以使用该事件属性。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>

    <script>
        //整个页面加载完再执行
        window.οnlοad=function(){
            var ele=document.getElementsByTagName("p")[0];
            ele.style.color="red";
        }
    </script>
</head>
<body>

<p>PPP</p>

</body>
</html>
View Code

4、onsubmit:

是当表单在提交时触发. 该属性也只能给form元素使用.应用场景: 在表单提交前验证用户输入是否正确.如果验证失败.在该方法中我们应该阻止表单的提交.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<form action="" method="post" id="form">
    用户名:<p><input type="text" name="user"></p>
    密码:<p><input type="password" name="pwd"></p>
    <p><input type="submit" value="submit"></p>
</form>

<script>
    var ele=document.getElementById("form");
    ele.onsubmit=function(e){//e即绑定event事件
        alert(123);
        // 阻止默认事件发生的方式一:
        // return false

        // 阻止默认事件发生的方式二:
        e.preventDefault()//event是一个封装了当前事件状态的对象
    }
</script>
</body>
</html>
View Code

5、onselect:

文本被选中时触发。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>

<input type="text" value="1230">

<script>
    var ele=document.getElementsByTagName("input")[0];
    ele.onselect=function(){
        alert(123)
    }
</script>
</body>
</html>
View Code

6、onkeydown      某个键盘按键被按下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>

<input type="text" id="d1">

<script>
    var ele=document.getElementById("d1");
    ele.onkeyup=function(e){
        var num=e.keyCode;//取出按下的键
        var alph=String.fromCharCode(num);//将按下的键对应的数值转化成字母
        alert(e.keyCode+"----"+alph);
    }

</script>
</body>
</html>
View Code

7、onmouseout鼠标从某元素移开  onmouseover鼠标移到某元素之上  onmouseleave鼠标从元素离开

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <style>
        .div1{
            width: 200px;
            height: 100px;
            background-color: darkgreen;
        }
    </style>
</head>
<body>

<div class="div1">
DIV
</div>


<script>
    var ele=document.getElementsByClassName("div1")[0];
    ele.onmouseover=function(){
        this.style.color="white";//鼠标移到某元素之上
        this.style.cursor="pointer";//鼠标指针变成小手
    };

     ele.onmouseleave=function(){
        this.style.color="black";//鼠标从元素离开
    };

    ele.onmousedown=function(){
        this.style.color="red";//鼠标按钮被按下
    }
</script>
</body>
</html>
View Code

8、onmouseout与onmouseleave事件的区别:
因为mouseout事件是会冒泡的,也就是onmouseout事件可能被同时绑定到了container的子元素title和list 上,所以鼠标移出每个子元素时也都会触发我们的list.style.display="none";
1.不论鼠标指针离开被选元素还是任何子元素,都会触发 mouseout 事件。

2.只有在鼠标指针离开被选元素时,才会触发 mouseleave 事件。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>

    <style>
        #container{
            width: 300px;
            background-color: purple;
            text-align: center;
        }
        #title{
            line-height: 50px;
        }

        #list{
            display: none;
        }
        #list div{
            line-height: 50px;
        }
        #list .item1{
            background-color: green;
        }

        #list .item2{
            background-color: yellow;
        }

        #list .item3{
            background-color: blue;
        }
    </style>
</head>
<body>

<div id="container">
    <div id="title">mouseout演示</div>
    <div id="list">
        <div class="item1">111</div>
        <div class="item2">222</div>
        <div class="item3">333</div>
    </div>
</div>


<script>

    var container=document.getElementById("container");
    var list=document.getElementById("list");
    var title=document.getElementById("title");

    title.onmouseover=function(){
        list.style.display="block";//鼠标移到某元素之上
    };

    container.onmouseleave=function(){
        list.style.display="none";
    };

//    lcontainer.οnmοuseοut=function(){
//        list.style.display="none";//
//    }
//
//因为mouseout事件是会冒泡的,也就是onmouseout事件可能被同时绑定到了container的子元素title和list
//上,所以鼠标移出每个子元素时也都会触发我们的list.style.display="none";
//
// 1.不论鼠标指针离开被选元素还是任何子元素,都会触发 mouseout 事件。
// 2.只有在鼠标指针离开被选元素时,才会触发 mouseleave 事件。


</script>
</body>
</html>
View Code

9、事件传播

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>

    <style>
        .outer{
            width: 200px;
            height: 200px;
            background-color: red;

        }
         .inner{
            width: 100px;
            height: 100px;
            background-color: yellow;
        }
    </style>
</head>
<body>

<div class="outer">
    <div class="inner"></div>
</div>

<script>
    var ele=document.getElementsByClassName("outer")[0];
    ele.onclick=function(){
        alert(123);
    };

     var ele2=document.getElementsByClassName("inner")[0];
     ele2.onclick=function(e){
        alert(456);
        // e.stopPropagation();//阻止123出现,不加的点子类标签,先出现456,再出现123
    }
</script>
</body>
</html>
事件传播

 

  

 

程序练习

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        *{
            margin: 0;
        }
        .back{
            height: 1200px;
            width: 100%;
            background-color:cornsilk;
        }
        .shade{
            position: fixed;
            top: 0;
            bottom: 0;
            left: 0;
            right: 0;
            background-color:white ;
            opacity:0.4 ;

        }
        .model{
            position: fixed;
            width: 400px;
            height: 400px;
            background-color: green;
            top: 50%;
            left: 50%;
            margin-left:-200px ;
            margin-top: -200px;
            text-align: center;

        }
        .con{
            margin-top:100px ;
        }
        .hide{
            display: none;
        }
    </style>
</head>
<body>
<div class="back">
    <button οnclick="start()">start</button>
</div>
<div class="shade hide"></div>//遮罩层
<div class="model hide">
    <div class="con">
        用户名:<input type="text">
        <button οnclick="stop">取消</button>
    </div>
</div>//对话框

<script>
    function stop() {
        var ele=document.getElementsByClassName("shade")[0];
        var ele2=document.getElementsByClassName("models")[0];
        ele.classList.add("hide");
        ele2.classList.add("hide");

    }
    function start() {
        var ele=document.getElementsByClassName("shade")[0];
        var ele2=document.getElementsByClassName("models")[0];
        if(act=="show"){
              ele.classList.remove("hide");
              ele2.classList.remove("hide");
        }else {
              ele.classList.add("hide");
              ele2.classList.add("hide");
        }
    }
</script>
</body>
</html>
模态对话框
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>

<select name="" class="select_pro">
    <option value="1">河南省</option>
    <option value="2">湖南省</option>
    <option value="3">云南省</option>
</select>

<select name=""  class="select_city"></select>

<script>
    var info={"河南省":["郑州","洛阳","开封"],"湖南省":["湘潭","长沙","岳阳"],"云南省":["大理","昆明"]}

    var ele=document.getElementsByClassName("select_pro")[0];
    var ele_2=document.getElementsByClassName("select_city")[0];
    ele.οnchange=function(){
         var arrs=ele.children;
         // console.log(arrs);
        // console.log(this.selectedIndex);//返回选择的select的选项索引值
        var sindex=this.selectedIndex;//取到选项的索引值
        var province=arrs[sindex].innerText;//取到选项的文本
        var citys_arr=info[province];
        //console.log(citys_arr); // ["","",""]城市的数组

        var ele2_children=ele_2.children;//清空select的子元素
        for (var j=0;j<ele2_children.length;j++){//省份选择变换时,清空上一个选项创建的标签
            ele_2.removeChild(ele2_children[0])        }

        // -----    ele_2.options.length=0;  //  DHML清空select的子元素
        //        console.log(ele_2.options);

        for (var i=0;i<citys_arr.length;i++){
                var option=document.createElement("option");//创建标签
                option.innerText=citys_arr[i];//向标签内添加文本
                // console.log(option);
                ele_2.appendChild(option);//将标签添加进select标签内
        }
    }


</script>
</body>
</html>
onchange二级联动
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>

<button class="all">全选</button>
<button class="reverse">反选</button>
<button class="cancel">取消</button>

<hr>
<table border="2px" class="server_tb">
    <tr>
        <td><input type="checkbox" class="item"></td>
        <td>1111</td>
        <td>1111</td>
        <td>1111</td>
    </tr>
    <tr>
        <td><input type="checkbox" class="item"></td>
        <td>1111</td>
        <td>1111</td>
        <td>1111</td>
    </tr>
    <tr>
       <td><input type="checkbox" class="item"></td>
        <td>1111</td>
        <td>1111</td>
        <td>1111</td>
    </tr>

    <tr>
       <td><input type="checkbox" class="item"></td>
        <td>1111</td>
        <td>1111</td>
        <td>1111</td>
    </tr>

<script>
var ele_all=document.getElementsByClassName("all")[0];
var ele_reverse=document.getElementsByClassName("reverse")[0];
var ele_cancel=document.getElementsByClassName("cancel")[0];
var input_arr=document.getElementsByClassName("item");

eles=document.getElementsByTagName("button");

for(var i=0;i<eles.length;i++){
    //console.log(eles[i]);
    eles[i].οnclick=function(){
        for (var j=0;j<input_arr.length;j++){
            console.log(this);
            if(this.innerText=="全选"){
                input_arr[j].checked=true;
            }
            else if(this.innerText=="取消"){
                input_arr[j].checked=false;
            }
            else{
                if(input_arr[j].checked){
                    input_arr[j].checked=false;
                }
                else{
                   input_arr[j].checked=true;
                }
            }
        }
    }
}


//    ele_all.οnclick=function(){
//          for(var i=0;i<input_arr.length;i++){
//              console.log(input_arr[i]);
//              var input=input_arr[i];
//              input.checked=true;
//          }
//    };
//
//     ele_cancel.οnclick=function(){
//          for(var i=0;i<input_arr.length;i++){
//              console.log(input_arr[i]);
//              var input=input_arr[i];
//              input.checked=false;
//          }
//    };
//
//    ele_reverse.οnclick=function(){
//          for(var i=0;i<input_arr.length;i++){
//              console.log(input_arr[i]);
//              var input=input_arr[i];
//              if(input.checked){
//                  input.checked=false;
//              }
//              else{
//                  input.checked=true;
//              }
//          }
//    }


</script>

</table>
</body>
</html>
表格案例
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        h1{
            background-color: darkgray;
            color: red;
            text-align: center;
            line-height: 50px;
        }
    </style>
</head>
<body>
    <h1 class="title">欢迎方绍伟</h1>
    <button οnclick="test()">click</button>
    <script>
        function test() {
            var ele=document.getElementsByClassName("title")[0];
            var content=ele.innerText;
            var first_char=content.charAt(0);
            var later_string=content.substring(1,content.length);
            var new_content=later_string+first_char;
            ele.innerText= new_content;
            setInterval(test,1000);
        }


    </script>
</body>
</html>
跑马灯

 左移右移         

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
<style>
    span{
        display: inline-block;
        width: 100px;
        height: 40px;
        background-color: palevioletred;
        text-align: center;
        line-height: 40px;
        vertical-align: top;
    }
</style>
</head>
<body>
<select name="" id="left" multiple="3">
    <option value="">大上海</option>
    <option value="">狼图腾</option>
    <option value="">大主宰</option>
</select>
<span>
    <button id="move"> > </button>
    <button id="move_all"> >> </button>
</span>
<select name="" id="right" multiple="3">
    <option value="">西游记</option>
</select>

<script>
    var move=document.getElementById("move");
    var move_all=document.getElementById("move_all");
    var left=document.getElementById("left");
    var right=document.getElementById("right");
    var option_arr=left.options;//select的选项元素,获取全部选项
    console.log(option_arr);
    move.onclick=function () {
        for (var i=0;i<option_arr.length;i++){
            var option=option_arr[i];
            if (option.selected){
                //判断选中的选项
                right.appendChild(option);
                i--;
            }
        }
    }

</script>
</body>
</html>

 

 

 js扩展                                               

 js的作用域链与词法分析

变量的作用域是在声明时决定的而不是调用执行时决定;

当函数调用的前一瞬间,先形成一个激活对象,叫Avtive Object, AO并会分析以下3个方面的东西:

1:参数

2:局部变量声明

3:函数声明表达式

函数内部无论是使用参数,还是使用局部变量,都到AO上找.

function f(a,b){
        var a=12;
        console.log(a);

        console.log(b)
    }
    f(5);

/*
*
       js执行顺序 // 词法分析阶段
       激活AO(active object)        
       词法分析(预编译过程)
       AO.a=undefined  AO.b=undefined

      // 分析参数

        AO.a = 5
        AO.b = undefined

        // 分析变量声明
        AO.a = undefined 已存在,不做任何影响.

        // 函数声明表达式
        无 不影响分析

        // 函数执行阶段
        AO.a = 12

        console.log(AO.a) ==> 12
        console.log(AO.y) ==> undefined
*
* */

 1. 全局作用域(Global Scope)

在代码中任何地方都能访问到的对象拥有全局作用域,一般来说一下几种情形拥有全局作用域:

(1)最外层函数和在最外层函数外面定义的变量拥有全局作用域

var name="yuan";

    function foo(){
        var age=23;
        function inner(){
            console.log(age);
        }

        inner();
    }

    console.log(name);    // yuan
    //console.log(age);   // Uncaught ReferenceError: age is not defined
    foo();                // 23
    inner();              // Uncaught ReferenceError: inner is not defined

(2)所有末定义直接赋值的变量自动声明为拥有全局作用域,例如:

var name="yuan";

    function foo(){
        age=23;

        var sex="male"
    }
    foo();
    console.log(age);   //  23
    console.log(sex);   // sex is not defined

变量age拥有全局作用域,而sex在函数外部无法访问到。

(3)所有window对象的属性拥有全局作用域

一般情况下,window对象的内置属性都都拥有全局作用域,例如window.alert()、window.location、window.top等等。

2. 局部作用域(Local Scope)

和全局作用域相反,局部作用域一般只在固定的代码片段内可访问到,最常见的例如函数内部,所有在一些地方也会看到有人把这种作用域成为函数作用域.

如示例1中的age与inner都只有局部作用域。(js中if、for没有自己的作用域)

作用域链(Scope Chain)

在JavaScript中,函数也是对象,实际上,JavaScript里一切都是对象。函数对象和其它对象一样,拥有可以通过代码访问的属性和一系列仅供JavaScript引擎访问的内部属性。其中一个内部属性是[[Scope]],由ECMA-262标准第三版定义,该内部属性包含了函数被创建的作用域中对象的集合,这个集合被称为函数的作用域链,它决定了哪些数据能被函数访问。

示例演示

function bar(age) {

        console.log(age);
        var age = 99;
        var sex= 'male';
        console.log(age);
        function age() {
            alert(123)
        };
        console.log(age);
        return 100;
}

result=bar(5);

结果分析

我相信大家一定会有想不到的结果,接下来我们就以最复杂的例3来分析整个过程。

当一个函数创建后,它的作用域链会被创建此函数的作用域中可访问的数据对象填充。在函数bar创建时,它的作用域链中会填入一个全局对象,该全局对象包含了所有全局变量,如下图所示:

 解析到函数调用时,即bar(5),会生成一个active object的对象,该对象包含了函数的所有局部变量、命名参数、参数集合以及this,然后此对象会被推入作用域链的前端,当运行期上下文被销毁,活动对象也随之销毁。新的作用域链如下图所示:

 

 过程解析:

function bar(age) {

        console.log(age);
        var age = 99;
        var sex="male";
        console.log(age);
        function age(){
            alert(123);
        } ;
        console.log(age);
        return 100;
}

result=bar(5);

一 词法分析过程(涉及参数,局部变量声明,函数声明表达式):
    1-1 、分析参数,有一个参数,形成一个 AO.age=undefine;
    1-2 、接收参数 AO.age=5;
    1-3 、分析变量声明,有一个 var age, 发现 AO 上面有一个 AO.age ,则不做任何处理
    1-4 、分析变量声明,有一个 var sex,形成一个 AO.sex=undefine;
    1-5 、分析函数声明,有一个 function age(){} 声明, 则把原有的 age 覆盖成 AO.age=function(){};
二 执行过程:
    2-1 、执行第一个 console.log(age) 时,当前的 AO.age 是一个函数,所以输出的一个函数
    2-2 、这句 var age=99; 是对不 AO.age 的属性赋值, AO.age=99 ,所以在第二个输出的age是 99;
    2-3 、同理第三个输出的是 99, 因为中间没有改变 age 值的语句了。

          注意:执行阶段:
                        function age(){
                            alert(123)
                        } ;

            不进行任何操作,将执行语句复制给age这部操作是在词法分析时,即运行前完成的。

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/domestique/p/6906576.html

内容概要:本文深入探讨了Kotlin语言在函数式编程和跨平台开发方面的特性和优势,结合详细的代码案例,展示了Kotlin的核心技巧和应用场景。文章首先介绍了高阶函数和Lambda表达式的使用,解释了它们如何简化集合操作和回调函数处理。接着,详细讲解了Kotlin Multiplatform(KMP)的实现方式,包括共享模块的创建和平台特定模块的配置,展示了如何通过共享业务逻辑代码提高开发效率。最后,文章总结了Kotlin在Android开发、跨平台移动开发、后端开发和Web开发中的应用场景,并展望了其未来发展趋势,指出Kotlin将继续在函数式编程和跨平台开发领域不断完善和发展。; 适合人群:对函数式编程和跨平台开发感兴趣的开发者,尤其是有一定编程基础的Kotlin初学者和中级开发者。; 使用场景及目标:①理解Kotlin中高阶函数和Lambda表达式的使用方法及其在实际开发中的应用场景;②掌握Kotlin Multiplatform的实现方式,能够在多个平台上共享业务逻辑代码,提高开发效率;③了解Kotlin在不同开发领域的应用场景,为选择合适的技术栈提供参考。; 其他说明:本文不仅提供了理论知识,还结合了大量代码案例,帮助读者更好地理解和实践Kotlin的函数式编程特性和跨平台开发能力。建议读者在学习过程中动手实践代码案例,以加深理解和掌握。
内容概要:本文深入探讨了利用历史速度命令(HVC)增强仿射编队机动控制性能的方法。论文提出了HVC在仿射编队控制中的潜在价值,通过全面评估HVC对系统的影响,提出了易于测试的稳定性条件,并给出了延迟参数与跟踪误差关系的显式不等式。研究为两轮差动机器人(TWDRs)群提供了系统的协调编队机动控制方案,并通过9台TWDRs的仿真和实验验证了稳定性和综合性能改进。此外,文中还提供了详细的Python代码实现,涵盖仿射编队控制类、HVC增强、稳定性条件检查以及仿真实验。代码不仅实现了论文的核心思想,还扩展了邻居历史信息利用、动态拓扑优化和自适应控制等性能提升策略,更全面地反映了群体智能协作和性能优化思想。 适用人群:具备一定编程基础,对群体智能、机器人编队控制、时滞系统稳定性分析感兴趣的科研人员和工程师。 使用场景及目标:①理解HVC在仿射编队控制中的应用及其对系统性能的提升;②掌握仿射编队控制的具体实现方法,包括控制器设计、稳定性分析和仿真实验;③学习如何通过引入历史信息(如HVC)来优化群体智能系统的性能;④探索中性型时滞系统的稳定性条件及其在实际系统中的应用。 其他说明:此资源不仅提供了理论分析,还包括完整的Python代码实现,帮助读者从理论到实践全面掌握仿射编队控制技术。代码结构清晰,涵盖了从初始化配置、控制律设计到性能评估的各个环节,并提供了丰富的可视化工具,便于理解和分析系统性能。通过阅读和实践,读者可以深入了解HVC增强仿射编队控制的工作原理及其实际应用效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值