首页 > 设计 > WEB开发 > 正文

前端女神告诉你每日前端题

2019-11-02 18:26:56
字体:
来源:转载
供稿:网友


前端HR告诉你每日前端题(进Web前端交流群0007领取工具和资料)

1、使用原生JS写一个兼容主流浏览器的事件添加和删除封装函数

var eventUtil={

                           addEvent:function(ele,type,handler){

                                    if(ele.addEventListener){

                                              ele.addEventListener("on"+type,handler,false)

                                    }elseif(ele.attachEvent){

                                              ele.attachEvent(type,handler)

                                    }else{

                                              ele.["on"+type]=handler

                                    },

                           removeEvent:function(ele,type,handler){

                                    if(ele.removeEventListener){

                                              ele.removeEventListener(type,handler,false)

                                    }elseif(ele.detachEvent){

                                              ele.detachEvent("on"+type,handler)

                                    }else{

                                              ele["on"+type]=null

                                    }

                           }

                  }

2、冒泡排序

var arr = [15,2,6,8,10,9];

for (var i = 0; i < arr.length-1; i++) {

   for (var j = 0; j < arr.length-i-1; j++) {

       if(arr[j] < arr[j+1]){

           var temp = arr[j+1];

           arr[j+1] = arr[j];

           arr[j] = temp;

       }

   }

}

console.log(arr);

3、jQuery对象和DOM对象相互转换

// 1. DOM对象转成 jQuery对象

//对于已经是一个 DOM对象,只需要用 $()把DOM对象包装起来,就可以获得一个 jQuery对象了,$(DOM对象)注: var是定义变量

//如:

var v =document.getElementById("v"); //DOM对象

var $v = $(v); //jQuery对象

//转换后,就可以任意使用 jQuery的方法。

// 2. jQuery对象转成 DOM对象

//两种转换方式讲一个 jQuery对象转换成 DOM对象: [index]和 .get(index);

// (1) jQuery对象是一个数据对象,可以通过 [index]的方法,来得到相应的 DOM对象。

//如:

var $v = $("#v"); //jQuery对象

var v = $v[0]; //DOM对象

// alert(v.checked); //检测这个checkbox是否被选中

// (2) jQuery本身提供,通过.get(index)方法得到相应的 DOM对象

//如:

var $v = $("#v"); //jQuery对象

var v = $v.get(0); //DOM对象 ($v.get()[0]也可以 )

4、从用户输入一个网址到网页最终展现到用户面前,中间究竟发生了什么?

/*

大致流程总结如下:

1.输入地址

2.浏览器查找域名的 ip地址(这一步包括 DNS具体的查找过程,包括:浏览器缓存->系统缓存->路由器缓存...)

3.浏览器向 web服务器发送一个 HTTP请求

4.服务器的永久重定向响应(从http://example.com到 http://www.example.com)

5.浏览器跟踪重定向地址

6.服务器处理请求

7.服务器返回一个 HTTP响应

8.浏览器显示 HTML

9.浏览器发送请求获取嵌入在 HTML中的资源(如图片、音频、视频、CSS、JS等等)

10.浏览器发送异步请求

*/

5、关于跨域,以及跨域的几种方式?

首先我们来想一想

            为什么会有跨域这个名词的出现呢?

            跨域又是什么呢?为何要跨域?

            浏览器的同源策略又是什么?怎么解决?

             jsonp又是什么?

            跨域的原理又是什么呢?

名词解释:

跨域:

浏览器对于javascript的同源策略的限制,例如a.cn下面的js不能调用b.cn中的js,对象或数据(因为a.cn和b.cn是不同域),所以跨域就出现了.

上面提到的,同域的概念又是什么呢???简单的解释就是相同域名,端口相同,协议相同

 

同源策略:

请求的url地址,必须与浏览器上的url地址处于同域上,也就是域名,端口,协议相同.

比如:我在本地上的域名是study.cn,请求另外一个域名一段数据

 

这个时候在浏览器上会报错:

 

这个就是同源策略的保护,如果浏览器对Javascript没有同源策略的保护,那么一些重要的机密网站将会很危险~

study.cn/json/jsonp/jsonp.html

 请求地址        形式        结果

 http://study.cn/test/a.html  同一域名,不同文件夹   成功

 http://study.cn/json/jsonp/jsonp.html  同一域名,统一文件夹   成功

 http://a.study.cn/json/jsonp/jsonp.html       不同域名,文件路径相同        失败

 http://study.cn:8080/json/jsonp/jsonp.html 同一域名,不同端口       失败

 https://study.cn/json/jsonp/jsonp.html 同一域名,不同协议         失败

 

 

 

 

 

 

 

jsonp:

jsonp 全称是JSON with Padding,是为了解决跨域请求资源而产生的解决方案,是一种依靠开发人员创造出的一种非官方跨域数据交互协议。

一个是描述信息的格式,一个是信息传递双方约定的方法。

jsonp的产生:

1.Ajax直接请求普通文件存在跨域无权限访问的问题,不管是静态页面也好.

2.不过我们在调用js文件的时候又不受跨域影响,比如引入jquery框架的,或者是调用相片的时候

3.凡是拥有scr这个属性的标签都可以跨域例如<script><img><iframe>

4.如果想通过纯web端跨域访问数据只有一种可能,那就是把远程服务器上的数据装进js格式的文件里.

5.而json又是一个轻量级的数据格式,还被js原生支持

6.为了便于客户端使用数据,逐渐形成了一种非正式传输协议,人们把它称作JSONP,该协议的一个要点就是允许用户传递一个callback 参数给服务端,

demo1:基于script标签实现跨域

举个例子:我在http://study.cn/json/jsonp/jsonp_2.html下请求一个远程的js文件

 

 

 1<!DOCTYPE html>

 2<html>

 3<head>

 4<meta charset="UTF-8">

 5<title>Insert title here</title>

 6

 7<script type="text/javascript">

 8    var message = function(data) {

 9        alert(data[1].title);

10    };

11 </script>

12

13 <scripttype="text/javascript" src="http://web.cn/js/message.js"></script>

14 </head>

15 <body>

16 <div id='testdiv'></div>

17 </body>

18 </html>

 

 

 

 

远程的message.js文件是

 

 1message([

 2     {"id":"1", "title":"天津新闻联播,雷人搞笑的男主持人"},

 3     {"id":"2", "title":"楼市告别富得流油专家:房价下跌是大概率事件"},

 4     {"id":"3","title":"法国人关注时事八成年轻人每天阅读新闻"},

 5     {"id":"4", "title":"新闻中的历史,历史中的新闻"},

 6     {"id":"5", "title":"东阳新闻20140222"},

 7     {"id":"6", "title":"23个职能部门要增加新闻发布频次"},

 8     {"id":"7", "title":"《贵州新闻联播》中国美丽乡村"},

 9     {"id":"8", "title":"朝韩离散家属团聚首轮活动结束"},

10     {"id":"9", "title":"索契冬奥会一天曝出两例兴奋剂事件"},

11     {"id":"10", "title":"今天中国多地仍将出现中度霾"}

12 ]);

 

 

这个时候我们得到的相应头是:

 

这样就实现跨域成功了,因为服务端返回数据时会将这个callback参数(message)作为函数名来包裹住JSON数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了。

demo2: 基于script标签实现跨域

让远程js知道它应该调用的本地函数叫什么名字,只要服务端提供的js脚本是动态生成的就好了,这样前台只需要传一个callback参数过去告诉服务端,我需要XXX代码,于是服务端就会得到相应了.

例如在http://study.cn/json/jsonp/jsonp_3.html页面请求 http://192.168.31.137/train/test/jsonpthree

 

 1<!DOCTYPE html>

 2<html>

 3<head>

 4<meta charset="UTF-8">

 5<title>Insert title here</title>

 6

 7<script type="text/javascript">

 8    var messagetow = function(data){

 9        alert(data);

10    };

11    var url ="http://192.168.31.137/train/test/jsonpthree?callback=messagetow";

12    var script = document.createElement('script');

13    script.setAttribute('src', url);

14    document.getElementsByTagName('head')[0].appendChild(script);

15 </script>

16 </head>

17 <body>

18 </body>

19 </html>

 

 

得到的响应头是:

 

demo3:  基于jquery跨域

那么如何用jquery来实现我们的跨域呢???jquery已经把跨域封装到ajax上了,而且封装得非常的好,使用起来也特别方便

如果是一般的ajax请求:

 

 1    $.ajax({

 2        url:'http://192.168.31.137/train/test/testjsonp',

 3        type : 'get',

 4        dataType : 'text',

 5        success:function(data){

 6            alert(data);

 7        },

 8        error:function(data){

 9            alert(2);

10        }       

11    });

 

 

那么在浏览器中会报错:

 

 

jsonp形式的ajax请求:并且通过get请求的方式传入参数,注意:跨域请求是只能是get请求不能使用post请求

 

 1<!DOCTYPE html>

 2<html>

 3<head>

 4<meta charset="UTF-8">

 5<title>Insert title here</title>

 6<script type="text/javascript"src="./js/jquery.js"></script>

 7<script type="text/javascript">

 8$(document).ready(function(){

 9    var name = 'chenshishuo';

10    var sex = 'man';

11    var address = 'shenzhen';

12    var looks = 'handsome ';

13     $.ajax({

14         type : 'get',

15         url:'http://192.168.31.137/train/test/testjsonp',

16        data : {

17            name : name,

18            sex : sex,

19            address : address,

20            looks : looks,

21        },

22        cache :false,

23        jsonp: "callback",

24        jsonpCallback:"success",

25        dataType : 'jsonp',

26        success:function(data){

27            alert(data);

28        },

29        error:function(data){

30            alert('error');

31        }       

32    });

33 });

34 </script>

35 </head>

36 <body>

37 <input id='inputtest' value='546'name='inputtest'>

38 <div id='testdiv'></div>

39 </body>

40 </html>

 

 

jsonp传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(默认为:callback)

jsonpCallback自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名

看看请求头和相应头吧

请求头:jquery会自动带入callback参数,当服务端获取到这个参数后,返回回来.(响应头)

 

 

现在是不是明白了跨域的基本原理,和基本的使用方法呢??

上面我们说到img中的src可以自动调用远程图片的(这个比较简单我在这里就不说了)

还有ifram请求:

基于iframe实现的跨域要求两个域具有aa.xx.com,bb.xx.com这种特点,

也就是两个页面必须属于一个基础域(例如都是xxx.com),使用同一协议和同一端口,这样在两个页面中同时添加document.domain,就可以实现父页面调用子页面的函数

要点就是 :通过修改document.domain来跨子域

demo4: 通过iframe来跨子域

http://a.study.cn/a.html请求http://b.study.cn/b.html

在a.html:

 

 1<!DOCTYPE html>

 2<html>

 3<head>

 4<meta charset="UTF-8">

 5<title>Insert title here</title>

 6        <script type="text/javascript">

 7            document.domain = 'study.cn';

 8            function test() {

 9                alert(document.getElementById('a').contentWindow);

10            }

11        </script>

12 </head>

13 <body>

14    <iframe id='a' src='http://b.study.cn/b.html' onload='test()'>

15 </body>

16 </html>

 

 

 在b.html:

 

 1<!DOCTYPE html>

 2<html>

 3<head>

 4<meta charset="UTF-8">

 5<title>Insert title here</title>

 6

 7<script type="text/javascript">

 8document.domain = 'study.cn';

 9</script>

10 </head>

11 <body>

12    我是b.study.cn的body

13 </body>

14 </html>

 

 

 运行效果截图:

 

我们就可以通过js访问到iframe中的各种属性和对象了

如果你想在http://a.study.cn/a.html页面中通过ajax直接请求页面http://b.study.cn/b.html,即使你设置了相同的document.domain也还是不行的.

所以修改document.domain的方法只适用于不同子域的框架(父类与子类)间的交互。

如果想通过使用ajax的方法去与不同子域间的数据交互或者是js调用,只有两种方法,一种是使用jsonp的方法外,还有一种是使用iframe来做一个代理。

原理就是让这个 iframe载入一个与你想要通过ajax获取数据的目标页面处在相同的域的页面,所以这个iframe中的页面是可以正常使用ajax去获取你要的数据的,

然后就是通过我们刚刚讲得修改document.domain的方法,让我们能通过js完全控制这个iframe,这样我们就可以让iframe去发送ajax请求,然后收到的数据我们也可以获得了。

6、如何水平垂直居中?

<!DOCTYPE html>

<html lang="en">

<head>

        <metacharset="UTF-8">

        <title>flex布局</title>

        <styletype="text/css">

                  #box{width:800px;height: 680px;border: 5px solid deeppink;margin: 10px auto;display:flex;justify-content: center;align-items: center;}

                  #boxdiv{width: 120px;height: 80px;background: red;border: 5px solid #ccc;}

        </style>

</head>

<body>

        <divid="box">

           <divclass="h100">1</div>

        </div>

</body>

</html>

7、常见的兼容性问题

/*

1 ie6.0横向margin加倍

产生因素:块属性、float、有横向margin。

解决方法:display:inline;

2 ie6.0下默认有行高

解决方法:overflow:hidden;或font-size:0;或line-height:xx px;

3在各个浏览器下img有空隙(原因是:回车。)

解决方法:让图片浮动。

4一个父标签与几个子标签嵌套,父标签不浮动,子标签float,子标签不撑开父的高度。

 

解决方法:a在子标签最后清浮动{<divstyle="height:0;clear:both;">&nbsp;</div>}

                 b父标签添加{overflow:hidden;}

                 c给父标签设置高度

5 Ie6下,不识别最大宽、高度和最小宽高度,意即min-width/height和Max-width/height在ie6中没效果,

解决方法:(1):.abc{border:1px blue solid;width:200px;height:200px;}

                         html>body.abc{width:auto;height:auto;min-width:200px;min-height:200px;}

       (2):.abc{width:200px;height:200px;_width:200px;_height:200px;}(因为ie6有一个特征,当定义一个高度时,如果内容超过高度,元素会自动调整高度。)

6 Ie6里面:如li设宽、高,并且li里面的标签浮动,那么li之间会有间距

解决方法:li不设宽、高或者li内的标签不浮动

7 li之间有间距

解决方法:li设置vertical-align:middle;

8 3像素问题:ie6下,当浮动元素与流动元素并列显示时,他们之间会存在三像素问题。

 

  解决方法:用hack技术,例如:所有浏览器通用height:100px;

                                                 ie6专用_height:100px;

                                                 ie7专用*+height:100px;

                                                 ie6/ie7共用*height:100px;

9当定义行内元素为包含框时,且包含框包含的绝对定位元素以百分比为单位进行定位时,会出现混乱。

 

   解决方法:在行内元素里加入{zoom:1;}

10当多个浮动元素中间夹杂着HTML注释语句时,如果浮动元素宽度为100%,则在下一行多显示一个上一行最后一个字符。

       解决办法:给浮动元素添加display:inline;。

11 opacity定义元素的不透明度

 filter:alpha(opacity=80);ie支持该属性

 opacity:0.8;支持css3的浏览器

12两个块元素,竖向的margin值不增加,会重叠,其间距为最大margin值。

13优先级:被!important注明的css属性具有最高优先级(.abc{color:red!important;})。但在ie6中!important具有一个bug:在同一组css属性中,!important不起作用。

14火狐不识别background-position-y或background-position-x;

15 ie6不支持 fixed

*/

8、输出明天日期

function GetDateStr(AddDayCount) {

                     var dd = new Date();

                     dd.setDate(dd.getDate()+AddDayCount);//获取                                                                            AddDayCount天后的日期

                     var y = dd.getFullYear();

                     var m = dd.getMonth()+1;//获取当前月份的日期

                     var d = dd.getDate();

                     return y+"-"+m+"-"+d;

                  }

                   

                  document.write("前天:"+GetDateStr(-2));

                  document.write("<br/>昨天:"+GetDateStr(-1));

                  document.write("<br/>今天:"+GetDateStr(0));

                  document.write("<br/>明天:"+GetDateStr(1));

                  document.write("<br/>后天:"+GetDateStr(2));

                  document.write("<br/>大后天:"+GetDateStr(13));


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表