前端面试JS部分(二)jQuery

前端面试JS部分(二)jQuery

1、你觉得jQuery或zepto源码有哪些写的好的地方?

jquery源码封装在一个匿名函数的自执行环境中,有助于防止变量的全局污染,然后通过传入window对象参数,可以使window对象作为局部变量使用,好处是当jquery中访问window对象的时候,就不用将作用域链退回到顶层作用域了,从而可以更快的访问window对象。同样,传入undefined参数,可以缩短查找undefined时的作用域链
 (function( window, undefined ) {

         //用一个函数域包起来,就是所谓的沙箱

         //在这里边var定义的变量,属于这个函数域内的局部变量,避免污染全局

         //把当前沙箱需要的外部变量通过函数参数引入进来

         //只要保证参数对内提供的接口的一致性,你还可以随意替换传进来的这个参数

        window.jQuery = window.$ = jQuery;

    })( window );
jquery将一些原型属性和方法封装在了jquery.prototype中,为了缩短名称,又赋值给了jquery.fn,这是很形象的写法
有一些数组或对象的方法经常能使用到,jQuery将其保存为局部变量以提高访问速度
jquery实现的链式调用可以节约代码,所返回的都是同一个对象,可以提高代码效率

2、JQuery的源码看过吗?能不能简单概况一下它的实现原理?

(function(window, undefined) {})(window);

jQuery 利用 JS 函数作用域的特性,采用立即调用表达式包裹了自身,解决命名空间和变量污染问题

window.jQuery = window.$ = jQuery;

在闭包当中将 jQuery 和 $ 绑定到 window 上,从而将 jQuery 和 $ 暴露为全局变量

3、jQuery.fn 的 init 方法返回的 this 指的是什么对象? 为什么要返回 this?

jQuery.fn 的 init 方法 返回的 this 就是 jQuery 对象
用户使用 jQuery()$() 即可初始化 jQuery 对象,不需要动态的去调用 init 方法

4、jquery中如何将数组转化为json字符串,然后再转化回来?

现代浏览器中提供了JSON.stringify()方法 将数组,对象转成json。
JSON.stringify 把一个对象转换成json字符串, 
JSON.parse 把一个json字符串解析成对象。
不支持的可以引入json2.js


// 通过原生 JSON.stringify/JSON.parse 扩展 jQuery 实现
 $.array2json = function(array) {
    return JSON.stringify(array);
 }

 $.json2array = function(array) {
    // $.parseJSON(array); // 3.0 开始,已过时
    return JSON.parse(array);
 }

 // 调用
 var json = $.array2json(['a', 'b', 'c']);
 var array = $.json2array(json);

5、jQuery 的属性拷贝(extend)的实现原理是什么,如何实现深拷贝?

浅拷贝(只复制一份原始对象的引用)
var newObject = $.extend({}, oldObject);

深拷贝(对原始对象属性所引用的对象进行进行递归拷贝)
var newObject = $.extend(true, {}, oldObject);

6、jQuery.extend 与 jQuery.fn.extend 的区别?

$.fn.extend() 和 $.extend() 是 jQuery 为扩展插件提拱了两个方法
$.extend(object); // 为jQuery添加“静态方法”(工具方法)

$.extend({
  min: function(a, b) { return a < b ? a : b; },
  max: function(a, b) { return a > b ? a : b; }
});
$.min(2,3); //  2
$.max(4,5); //  5
$.extend([true,] targetObject, object1[, object2]); // 对target对象进行扩展
var settings = {validate:false, limit:5};
var options = {validate:true, name:"bar"};
$.extend(settings, options);  // 注意:不支持第一个参数传 false
// settings == {validate:true, limit:5, name:"bar"}
$.fn.extend(json); // 为jQuery添加“成员函数”(实例方法)

$.fn.extend({
   alertValue: function() {
      $(this).click(function(){
        alert($(this).val());
      });
   }
});

$("#email").alertValue();

7、jQuery 的队列是如何实现的?队列可以用在哪些地方?

jQuery 核心中有一组队列控制方法,由 queue()/dequeue()/clearQueue() 三个方法组成。
主要应用于 animate(),ajax,其他要按时间顺序执行的事件中
var func1 = function(){alert('事件1');}
var func2 = function(){alert('事件2');}
var func3 = function(){alert('事件3');}
var func4 = function(){alert('事件4');}

// 入栈队列事件
$('#box').queue("queue1", func1);  // push func1 to queue1
$('#box').queue("queue1", func2);  // push func2 to queue1

// 替换队列事件
$('#box').queue("queue1", []);  // delete queue1 with empty array
$('#box').queue("queue1", [func3, func4]);  // replace queue1

// 获取队列事件(返回一个函数数组)
$('#box').queue("queue1");  // [func3(), func4()]

// 出栈队列事件并执行
$('#box').dequeue("queue1"); // return func3 and do func3
$('#box').dequeue("queue1"); // return func4 and do func4

// 清空整个队列
$('#box').clearQueue("queue1"); // delete queue1 with clearQueue

8、jQuery 中的 bind(), live(), delegate(), on()的区别?

bind 直接绑定在目标元素上
live 通过冒泡传播事件,默认document上,支持动态数据
delegate 更精确的小范围使用事件代理,性能优于 live
on 是最新的1.9版本整合了之前的三种方式的新事件绑定机制

9、jQuery 一个对象可以同时绑定多个事件,这是如何实现的?

  $("#btn").on("mouseover mouseout", func);

  $("#btn").on({
      mouseover: func1,
      mouseout: func2,
      click: func3
  });

10、是否知道自定义事件? jQuery 里的 fire 函数是什么意思,什么时候用?

事件即“发布/订阅”模式,自定义事件即“消息发布”,事件的监听即“事件订阅”
JS 原生支持自定义事件,示例:
  document.createEvent(type); // 创建事件
  event.initEvent(eventType, canBubble, prevent); // 初始化事件
  target.addEventListener('dataavailable', handler, false); // 监听事件
  target.dispatchEvent(e);  // 触发事件
  
jQuery 里的 fire 函数用于调用 jQuery 自定义事件列表中的事件

11、jQuery 是通过哪个方法和 Sizzle 选择器结合的?(jQuery.fn.find()进入Sizzle)

Sizzle 选择器采取 Right To Left 的匹配模式,先搜寻所有匹配标签,再判断它的父节点
jQuery 通过 $(selecter).find(selecter); 和 Sizzle 选择器结合

12、针对 jQuery 的优化方法?

缓存频繁操作DOM对象
尽量使用id选择器代替class选择器
总是从#id选择器来继承
尽量使用链式操作
使用时间委托 on绑定事件
采用jQuery的内部函数data()来存储数据
使用最新版本的 jQuery

13、jQuery 与 jQuery UI、jQuery Mobile 区别?

jQuery 是 JS 库,兼容各种PC浏览器,主要用作更方便地处理 DOM、事件、动画、AJAX

jQuery UI 是在jQuery的基础上,利用jQuery的扩展性,设计的插件。 提供了一些常用的界面元素,诸如对话框、拖动行为、改变大小行为等等

jQuery Mobile 以 jQuery 为基础,用于创建“移动Web应用”的框架

14、jQuery 和 Zepto 的区别? 各自的使用场景?

jQuery 主要目标是PC的网页中,兼容全部主流浏览器。在移动设备方面,单独推出 `jQuery Mobile`

Zepto从一开始就定位移动设备,相对更轻量级。它的API 基本兼容jQuery`,但对PC浏览器兼容不理想

15、Zepto的点透问题如何解决?

点透事件据我的理解,就是因为Zepto在Click事件上有300毫秒的延迟,为了跟其他各种各样的乱七八糟的东西兼容。但是很不凑巧,我们是在一个模态弹出框上绑定了这样一个延迟300ms的点击事件,点击事件又会被冒泡到最下层,而最下层刚好是一个输入框。这样事件就会被这个输入框给捕捉,导致最上层事件无法触发(具体更深层次原因未知,只是知道不能被触发)。

`方案一:来得很直接github上有个fastclick可以完美解决https://github.com/ftlabs/fastclick`

引入fastclick.js,因为fastclick源码不依赖其他库所以你可以在原生的js前直接加上

1 window.addEventListener( "load", function() {
2     FastClick.attach( document.body );
3 }, false );
或者有zepto或者jqm的js里面加上

1 $(function() {
2     FastClick.attach(document.body);
3 });
当然require的话就这样:

1 var FastClick = require('fastclick');
2 FastClick.attach(document.body, options);

`方案二:用touchend代替tap事件并阻止掉touchend的默认行为preventDefault()`
1 $("#cbFinish").on("touchend", function (event) {
2     //很多处理比如隐藏什么的
3     event.preventDefault();
4 });

`方案三:延迟一定的时间(300ms+)来处理事件`
1 $("#cbFinish").on("tap", function (event) {
2     setTimeout(function(){
3     //很多处理比如隐藏什么的
4     },320);
5 });    
这种方法其实很好,可以和fadeInIn/fadeOut等动画结合使用,可以做出过度效果

理论上上面的方法可以完美的解决tap的点透问题,如果真的倔强到不行,用click

16、jQuery UI 如何自定义组件?

通过向 $.widget() 传递组件名称和一个原型对象来完成
$.widget("ns.widgetName", [baseWidget], widgetPrototype);

17、如何判断当前脚本运行在浏览器还是node环境中?(阿里)

  this === window ? 'browser' : 'node';

  通过判断Global对象是否为window,如果不为window,当前脚本没有运行在浏览器中

18、移动端最小触控区域是多大?

移动端最小触控区域44*44px,再小就容易点击不到或者误点  (Apple)

19、jQuery 的 slideUp 动画,当鼠标快速连续触发, 动画会滞后反复执行,该如何处理呢?

在触发元素上的事件设置为延迟处理:使用 JS 原生 setTimeout 方法

在触发元素的事件时预先停止所有的动画,再执行相应的动画事件:$('.tab').stop().slideUp();

20、移动端的点击事件的有延迟,时间是多久,为什么会有? 怎么解决这个延时?

移动浏览器为什么会设置300毫秒的等待时间呢?这与双击缩放的方案有关。平时我们有可能已经注意到了,双击缩放,即用手指在屏幕上快速点击两次,可以看到内容或者图片放大,再次双击,浏览器会将网页缩放至原始比例。

      浏览器捕获第一次单击后,会先等待一段时间,如果在这段时间区间里用户未进行下一次点击,则浏览器会做单击事件的处理。如果这段时间里用户进行了第二次单击操作,则浏览器会做双击事件处理。这段时间就是上面提到的300毫秒延迟。
解决方法:

`1.视口标签中禁止用户缩放`
<meta name="viewport" content="width=device-width, initial-scale=1.0,user-scalable=no">
         
`2.利用touch事件封装事件解除300ms延迟`

`3.使用插件 fastclick插件解决300ms延迟`

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值