zoukankan      html  css  js  c++  java
  • JS DOM、BOM事件常见面试题分析

    从基础知识到JSWebAPI:

    DOM操作

    BOM操作

    事件绑定

    AJAX请求(包含http协议)

    存储

    DOM可以理解为:浏览器把拿到的html代码,结构化成一个浏览器能识别并且js可操作的一个模型

    DOM节点操作:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width,min-width=1.0,max-width=1.0,initial-scale=1.0,user-scalable=no">
        <title>demo</title>
        <script src="http://cdn.staticfile.org/jquery/1.12.4/jquery.js"></script>
    </head>
    <body>
        <div id="div1" class="div1">
            <p id="p1" data-name="p1-data-name">this is p1</p>
            <p id="p2">this is p2</p>
        </div>
        <div id="div2">
            <p id="p3">this is p3</p>
            <p id="p4">this is p4</p>
        </div>
    
        <script>
            //获取DOM节点
            var div1=document.getElementById('div1'); //单元素
            console.log(div1);//<div id="div1" class="div1">..</div>
    
            var divs=document.getElementsByTagName('div'); //集合
            console.log(divs);//HTMLCollection(2) [div#div1.div1, div#div2, div1: div#div1.div1, div2: div#div2]
            console.log(divs.length);//2
            console.log(divs[0]);//<div id="div1" class="div1">..</div>
    
            //property
            var ps=document.querySelectorAll('p'); //集合
            var p=ps[0];
            console.log(p.style.width);//获取样式
            p.style.width='300px';//设置样式
            console.log(p.style.width);//获取样式 300px
            console.log(p.className);
            p.className='p1';
            console.log(p.className);//p1
    
            //获取nodeName和nodeType
            console.log(p.nodeName);//P
            console.log(p.nodeType);//1
    
            //property
            var obj={x:10,y:20};
            console.log(obj.x);//10
    
            var p=document.getElementsByTagName('p')[0];
            console.log(p.tagName);//P
    
            //attribute
            console.log(p.getAttribute('data-name'));
            p.setAttribute('data-name','cyy');//p1-data-name
            console.log(p.getAttribute('style'));
            p.setAttribute('style','font-size:30px');// 300px;
    
        </script>
    </body>
    </html>

    DOM结构操作:

    新增节点

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width,min-width=1.0,max-width=1.0,initial-scale=1.0,user-scalable=no">
        <title>demo</title>
        <script src="http://cdn.staticfile.org/jquery/1.12.4/jquery.js"></script>
    </head>
    <body>
        <div id="div1">
            <p id="p1">this is p1</p>
            <p id="p2">this is p2</p>
        </div>
        <div id="div2">
            <p id="p3">this is p3</p>
            <p id="p4">this is p4</p>
        </div>
    
        <script>
            //新增节点
            var p=document.createElement('p');
            p.innerHTML='new p';
            var div1=document.getElementById('div1');
            div1.appendChild(p);
    
        </script>
    </body>
    </html>

    移动节点

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width,min-width=1.0,max-width=1.0,initial-scale=1.0,user-scalable=no">
        <title>demo</title>
        <script src="http://cdn.staticfile.org/jquery/1.12.4/jquery.js"></script>
    </head>
    <body>
        <div id="div1">
            <p id="p1">this is p1</p>
            <p id="p2">this is p2</p>
        </div>
        <div id="div2">
            <p id="p3">this is p3</p>
            <p id="p4">this is p4</p>
        </div>
    
        <script>
            //移动节点
            var p4=document.getElementById('p4');
            var div1=document.getElementById('div1');
            div1.appendChild(p4);
            console.log(p4.parentNode);//<div id="div1">..</div>
    
        </script>
    </body>
    </html>

    获取子元素节点、获取父元素节点、删除节点

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width,min-width=1.0,max-width=1.0,initial-scale=1.0,user-scalable=no">
        <title>demo</title>
        <script src="http://cdn.staticfile.org/jquery/1.12.4/jquery.js"></script>
    </head>
    <body>
        <div id="div1">
            <p id="p1">this is p1</p>
            <p id="p2">this is p2</p>
        </div>
        <div id="div2">
            <p id="p3">this is p3</p>
            <p id="p4">this is p4</p>
        </div>
    
        <script>
            //移动节点
            var p4=document.getElementById('p4');
            var div1=document.getElementById('div1');
            //获取父元素
            console.log(p4.parentNode);//<div id="div1">..</div>
            //获取子元素
            console.log(div1.childNodes);//NodeList(5) [text, p#p1, text, p#p2, text]
            console.log(div1.childNodes[0].nodeType);//text  3
            console.log(div1.childNodes[1].nodeType);//p  1
            console.log(div1.childNodes[0].nodeName);//#text
            console.log(div1.childNodes[1].nodeName);//P
            //获取非空白文本的子元素
            for(var i=0;i<div1.childNodes.length;i++){
                if(div1.childNodes[i].nodeType!==3){
                    console.log(div1.childNodes[i]);
                }
            }
    
            //删除节点
            var childNodes=div1.childNodes;
            div1.removeChild(childNodes[1]);
    
        </script>
    </body>
    </html>

    DOM是哪种基本的数据结构? 树

    DOM操作的常用API有哪些?

    获取DOM节点、以及节点的property和attribute

    获取父节点、获取子节点

    新增节点、删除节点

    DOM操作的property和attribute有哪些区别?

    property是js对象的属性的修改

    attribute是html标签的属性的修改

    BOM操作:

    如何检测浏览器的类型

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width,min-width=1.0,max-width=1.0,initial-scale=1.0,user-scalable=no">
        <title>demo</title>
        <script src="http://cdn.staticfile.org/jquery/1.12.4/jquery.js"></script>
    </head>
    <body>
    
        <script>
            var ua=navigator.userAgent;
            console.log(ua);//Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36
            var isChrome=ua.indexOf('Chrome');
            console.log(isChrome>0?'isChrome':'isNotChrome');
    
        </script>
    </body>
    </html>

    url拆解:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width,min-width=1.0,max-width=1.0,initial-scale=1.0,user-scalable=no">
        <title>demo</title>
        <script src="http://cdn.staticfile.org/jquery/1.12.4/jquery.js"></script>
    </head>
    <body>
    
        <script>
            console.log(location.protocol);//协议
            console.log(location.host);//
            console.log(location.pathname);//文件名
            console.log(location.search);//参数(?后面的)
            console.log(location.hash);//锚(#后面的)
            console.log(location.href);//完整的url
    
            //改变链接地址
            //location.href="http://www.baidu.com";
    
        </script>
    </body>
    </html>

    事件:

    封装一个通用的事件绑定函数

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width,min-width=1.0,max-width=1.0,initial-scale=1.0,user-scalable=no">
        <title>demo</title>
        <script src="http://cdn.staticfile.org/jquery/1.12.4/jquery.js"></script>
    </head>
    <body>
        <div id="div1">
            <a id="p1">激活</a>
            <a id="p2">取消</a>
        </div>
        <div id="div2">
            <a id="p3">取消</a>
            <a id="p4">取消</a>
        </div>
    
        <script>
            function bind(ele,type,fn){
                ele.addEventListener(type,fn);
            }
    
            var p3=document.getElementById('p3');
            bind(p3,'click',function(e){
                e.preventDefault();
                console.log(p3.innerHTML);
            })
    
        </script>
    </body>
    </html>

    事件冒泡:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width,min-width=1.0,max-width=1.0,initial-scale=1.0,user-scalable=no">
        <title>demo</title>
        <script src="http://cdn.staticfile.org/jquery/1.12.4/jquery.js"></script>
    </head>
    <body>
        <div id="div1">
            <a id="p1">激活</a>
            <a id="p2">取消</a>
        </div>
        <div id="div2">
            <a id="p3">取消</a>
            <a id="p4">取消</a>
        </div>
    
        <script>
            function bind(ele,type,fn){
                ele.addEventListener(type,fn);
            }
    
            var p1=document.getElementById('p1');
            var body=document.body;
            bind(p1,'click',function(e){
                e.stopPropagation();//阻止事件冒泡
                console.log('激活');
            });
            bind(body,'click',function(e){
                e.stopPropagation();
                console.log('取消');
            });
    
        </script>
    </body>
    </html>

    事件代理:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width,min-width=1.0,max-width=1.0,initial-scale=1.0,user-scalable=no">
        <title>demo</title>
        <script src="http://cdn.staticfile.org/jquery/1.12.4/jquery.js"></script>
    </head>
    <body>
        <div id="div1">
            <a href="#">链接</a>
            <a href="#">链接</a>
            <a href="#">链接</a>
            <a href="#">链接</a>
            <p id="p1">激活</p>
            <p id="p2">取消</p>
        </div>
        <div id="div2">
            <p id="p3">取消</p>
            <p id="p4">取消</p>
        </div>
    
        <script>
            function bind(ele,type,fn){
                ele.addEventListener(type,fn);
            }
    
            var div1=document.getElementById('div1');
            bind(div1,'click',function(e){
                e.preventDefault();
                console.log(e.target);
                if(e.target.nodeName==='A'){
                    console.log('clicked');
                }            
            });
    
        </script>
    </body>
    </html>

    完善通用的事件绑定函数:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width,min-width=1.0,max-width=1.0,initial-scale=1.0,user-scalable=no">
        <title>demo</title>
        <script src="http://cdn.staticfile.org/jquery/1.12.4/jquery.js"></script>
    </head>
    <body>
        <div id="div1">
            <a href="#">链接</a>
            <a href="#">链接</a>
            <a href="#">链接</a>
            <a href="#">链接</a>
            <p id="p1">激活</p>
            <p id="p2">取消</p>
        </div>
        <div id="div2">
            <p id="p3">取消</p>
            <p id="p4">取消</p>
        </div>
    
        <script>
            function bind(ele,type,selector,fn){
                if(fn==null){
                    fn=selector;
                    selector=null;
                }
                ele.addEventListener(type,function(e){
                    if(selector){
                        //代理
                        //如果元素被指定的选择器字符串选择,Element.matches() 方法返回true; 否则返回false。
                        if(e.target.matches(selector)){
                            fn.call(e.target,e);
                        }
                    }else{
                        fn(e);
                    }
                })
            }
    
            var div1=document.getElementById('div1');
            var p1=document.getElementById('p1');
            bind(div1,'click','a',function(e){
                console.log(this.innerHTML);        
            });
            bind(p1,'click',function(e){
                console.log(p1.innerHTML);        
            });
    
        </script>
    </body>
    </html>

    Ajax-XMLHttpRequst:

    手动编写一个ajax,不依赖第三方库

    跨域的几种实现方式:

    JSONP

    服务器端设置http header

    IE兼容性问题:不用深究,会简单处理即可

    readyState

     status

    Ajax-跨域和问题解答:

    什么是跨域?

    浏览器有同源策略,不允许ajax访问其他域的接口

    跨域条件:协议、域名、端口,有一个不同,就属于跨域

    可以跨域的三个标签:

    允许跨域加载资源(但如果对方做了防盗链处理就不行了)

    img 用于打点统计,统计网站可能是其他域

    link script 可以使用CDN,CDN也是其他域

    script 可以用于JSONP

    跨域的注意事项:

    所有的跨域请求都必须经过信息提供方允许

    JSONP实现原理:

    服务器端设置http header

    跨域的另一个解决方案

  • 相关阅读:
    HttpURLconnection的介绍
    HttpClient4.3教程 第三章 Http状态管理
    HttpClient4.3教程 第二章 连接管理
    HttpClient 4.3教程 第一章 基本概念
    HttpClient 4.3教程-前言
    数据结构
    数据结构
    HashMap底层源码剖析
    防止XSS 攻击集成springboot
    C——Network Saboteur (POJ2531)
  • 原文地址:https://www.cnblogs.com/chenyingying0/p/12741273.html
Copyright © 2011-2022 走看看