2018-08-28日前端面试题

点击查看源码

请描述下原生js的事件。(包括但不限于:事件的不同阶段,应用场景,事件代理,绑定和解绑,浏览器兼容等)

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
        <title>请描述下原生js的事件。(包括但不限于:事件的不同阶段,应用场景,事件代理,绑定和解绑,浏览器兼容等)</title>
    </head>

    <body>
        <p>请描述下原生js的事件。(包括但不限于:事件的不同阶段,应用场景,事件代理,绑定和解绑,浏览器兼容等)</p>
        <div>
            <h3>js里事件的三个阶段</h3>
            <p>捕获、目标阶段、冒泡阶段</p>
            <ul>
                <li>
                    <p>1.捕获:事件由页面元素接收,逐级向下,到具体的元素</p>
                </li>
                <li>
                    <p>2.目标:具体的元素本身</p>
                </li>
                <li>
                    <p>3.冒泡:跟捕获相反,具体元素本身,逐级向上,到页面元素(事件委托通过冒泡实现)</p>
                </li>
            </ul>
        </div>
        <div>
            <h3>事件冒泡和事件捕获的应用场景</h3>
            <p>事件代理/事件委托</p>
            <p style="font-size: 14px;color: red;">点击下面1、2控制台查看输出</p>
            <ul class="oul">
                <li>
                    <div>
                        <p> 1.当存在多个元素可以共用同一个监听器</p>
                    </div>
                </li>
                <li>
                    <div>
                        <p> 2.用事件委托实现动态监控(根据后台接口返回数据后,js动态插入到页面中的dom,如果不使用事件委托则不起作用)</p>
                    </div>
                </li>
            </ul>
            <div class="html-content">

            </div>
            <button class="test-btn">点击插入数据测试动态监控</button>
        </div>
        <div>
            <h3>事件绑定和解绑</h3>
            <p>事件类型没有on,false 表示在事件第三阶段(冒泡)触发,true表示在事件第一阶段(捕获)触发。 如果handle是同一个方法,只执行一次。
                <p>ele.addEventListener('click', function(){ }, false); </p>
                <p>解绑事件,参数和绑定一样</p>
                <p>ele.removeEventListener(event.type, handle, boolean);</p>
                <ul>
                    <li>
                        <p>绑定:addEventListener</p>
                    </li>
                    <li>
                        <p>解绑:removeEventListener</p>
                    </li>
                </ul>
        </div>
        <div>
            <h3>    事件绑定兼容问题(主要是兼容可爱的IE)参考:<a href="https://www.cnblogs.com/zhangmingze/p/4864367.html">https://www.cnblogs.com/zhangmingze/p/4864367.html</a></h3>
            <p>attachEvent(event.type, handle ); IE特有,兼容IE8及以下,可添加多个事件处理程序,只支持冒泡阶段</p>
            <p>addEventListener(event.type, handle, boolean); IE8及以下不支持,属于DOM2级的方法,可添加多个方法不被覆盖</p>
        </div>
        <div>
            <h3>阻止事件行为</h3>
            <ul>
                <li>
                    <p>return false; 阻止独享属性(通过on这种方式)绑定的事件的默认事件</p>
                </li>
                <li>
                    <p>event.preventDefault( ); 阻止通过 addEventListener( ) 添加的事件的默认事件</p>
                </li>
                <li>
                    <p>event.returnValue = false; 阻止通过 attachEvent( ) 添加的事件的默认事件</p>
                </li>
            </ul>
        </div>
    </body>
    <script type="text/javascript">
        window.onload = function() {
            /**
             * @date 2018-8-26 9:44
             * @author DIEW
             * 事件委托(事件代理) 通过事件冒泡实现
             * 当存在多个元素可以共用同一个监听器
             */
            var oul = document.querySelector(".oul");
            oul.addEventListener("click", function(e) {
                var el = e.target;
                console.log(el.tagName);
                //判断当前点击的元素是否为li,如果不是,执行以下的while循环
                while(el.tagName !== 'LI') {
                    console.log(el.parentNode);
                    console.log(el.tagName);
                    if(el === oul) {
                        el = null
                        break;
                    }
                    //否则,将当前元素父元素赋给el
                    el = el.parentNode;
                }
                //如果最后el不为null,则打出'ok'
                if(!!el) {
                    console.log('找到对应的li了')
                }
                //否则,打出'你点击的不是li'
                else {
                    console.log('你点击的不是li')
                }
            });

            /**
             * @date 2018-8-26 9:44
             * @author DIEW
             * 事件委托(事件代理) 通过事件冒泡实现
             * 用事件委托实现动态监控
             */
            var htmlContent = document.querySelector(".html-content");
            var testBtn = document.querySelector(".test-btn");
            var testevent2 = document.querySelector(".testevent2");

            testBtn.onclick = function() {
                htmlContent.innerHTML = '<p class="testevent1">点我测试常规绑定事件</p><p class="testevent2">点我测试事件委托</p>';
                //必须在创建完成后才可以绑定点击事件
                var testevent1 = document.querySelector(".testevent1");
                testevent1.onclick = function() {
                    alert("点我测试常规绑定事件");
                };
            };

            //通过给已存在的节点添加事件,达到监听未来的子节点的目的,不必考虑什么时候子节点插入
            htmlContent.onclick = function(e) {
                var el = e.target;
                alert(el.tagName);
                //如果子元素有多级,可以通过事件冒泡找到 TODO 
            };

            /**
             * @date 2018-8-26 9:44
             * https://www.cnblogs.com/zhangmingze/
             * 事件绑定及事件解绑封装成为一个函数,兼容浏览器,包括IE6及以上
             */
            // 事件绑定
            function addEvent(element, eType, handle, bol) {
                if(element.addEventListener) { //如果支持addEventListener
                    element.addEventListener(eType, handle, bol);
                } else if(element.attachEvent) { //如果支持attachEvent
                    element.attachEvent("on" + eType, handle);
                } else { //否则使用兼容的onclick绑定
                    element["on" + eType] = handle;
                }
            }
            // 事件解绑
            function removeEvent(element, eType, handle, bol) {
                if(element.addEventListener) {
                    element.removeEventListener(eType, handle, bol);
                } else if(element.attachEvent) {
                    element.detachEvent("on" + eType, handle);
                } else {
                    element["on" + eType] = null;
                }
            }
        };
    </script>

</html>

通过css实现左侧2个块宽度固定,高度各50%,右侧宽度自适应

image.png
<!DOCTYPE html>
<html>
     <head>
           <meta charset="UTF-8">
           <title></title>
           <style>
          *{margin:0;padding:0;border:0;}
           html,body{width: 100%;height:100%;}
           .left{
                background:red;
                width:200px;
                height:50%;
                float:left;
           }
           .left1{
                background:green;
                width:200px;
                height:50%;
                position:absolute;
                top:50%;
                left:0;
           }
           .right{
                background:yellow;
                height:100%;
                overflow: hidden;
           }
           </style>
     </head>
     <body>
           <div class="left" ></div>
           <div class="left1"></div>
           <div class="right">
                sadlfjaflasdjf wdlfjlsad jfl jlwajf lajlasd asdf asdf df as
                sadlfjaflasdjf wdlfjlsad jfl jlwajf lajlasd asdf asdf df as
                sadlfjaflasdjf wdlfjlsad jfl jlwajf lajlasd asdf asdf df as
                sadlfjaflasdjf wdlfjlsad jfl jlwajf lajlasd asdf asdf df as
                sadlfjaflasdjf wdlfjlsad jfl jlwajf lajlasd asdf asdf df as
                sadlfjaflasdjf wdlfjlsad jfl jlwajf lajlasd asdf asdf df as
           </div>
     </body>
</html>

this指向问题,输出num,obj,num

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8">
        <title>this指向问题,输出num,obj,num</title>
    </head>

    <body>

    </body>
    <script type="text/javascript">
        var num = 1;
        var obj = {
            num: 2,
            fn: (function() {
                console.log(this)
                this.num += 10;
                console.log(this.num);
                num = num + 10;
                console.log(num);
                var num = 3;
                console.log(num);
                return function() {
                    console.log(this)
                    this.num += 10;
                    console.log(this.num);
                    console.log(num);
                    num++;
                    console.log(num);
                }
            })()
        };
        //下面代码未执行前,obj.fn下的自执行函数已经运行, //num =11;obj.num = 2;

        var fn = obj.fn; //将obj.fn 的引用地址指向fn
        fn(); //num =21;obj.num = 2; 由window来调用obj.fn中的方法
        obj.fn(); //num = 21 this.num = 12 obj调用obj.fn 中的方法
        console.log(num);
        console.log(obj.num);
    </script>
</html>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容

  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,472评论 1 45
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,060评论 25 707
  • 1.人际沟通--今天一个老同事跟我语重心长的聊了一会,劝我不要再坚持下去了,可能基于历史记录还有他对于我的了解(当...
    kidII阅读 183评论 0 1
  • 总觉得圈子是一个贬义词,小圈子、混圈子,似乎都不是什么好的意思。 有事找度娘,一查,居然有本书叫《圈子》,说圈子指...
    劉清阅读 476评论 0 0
  • 一直对现有的工作不满意。工作内容单一,人际关系复杂,工作量大,压力也不小。 想换一份工作,丰富一下工作经历。但面试...
    爱存心间阅读 1,022评论 0 0