jQuery和Zepto的差异是什么?

jQuery 和 Zepto.js 表面看起来差不多,其实一些细节上差异很大,同时支持 jQuery 和 Zepto.js 是一件吃力不讨好的事情,这应该也是 Foundation 5 放弃支持 Zepto 的一个原因。

DOM操作的区别:

DOM 操作在添加id时,jQuery不会生效,而Zepto会生效。

jQuery操作的 ul 上的 id 不会被添加。

(function($) {
  $(function() {
    var $list = $('<ul><li>jQuery 插入</li></ul>', {
      id: 'insert-by-jquery'
    });
    $list.appendTo($('body'));
  });})(window.jQuery);

Zepto 可以在 ul 上添加 id。

Zepto(function($) {
  var $list = $('<ul><li>Zepto 插入</li></ul>', {
    id: 'insert-by-zepto'
  });
  $list.appendTo($('body'));
});

事件触发的区别:

使用jquery时load事件的处理函数不会执行;

(function($) {
    $(function() {    
        $script = $('<script />', {
            src: 'http://cdn.amazeui.org/amazeui/1.0.1/js/amazeui.js',
            id: 'ui-jquery'
        });

        $script.appendTo($('body'));

        $script.on('load', function() {
            console.log('jQ script loaded');
        });
    });})(window.jQuery);

使用zepto时load事件的处理函数会执行

Zepto(function($) {  
    $script = $('<script />', {
        src: 'http://cdn.amazeui.org/amazeui/1.0.1/js/amazeui.js',
        id: 'ui-zepto'
    });

    $script.appendTo($('body'));

    $script.on('load', function() {
        console.log('zepto script loaded');
    });});

事件委托的区别:

zepto中,选择器上所有的委托事件都依次放入到一个队列中,而在jquery中则委托成独立的多个事件

API 方面的区别

width() 和 height() 的区别

在Zepto和jQuery中使用width() 或 height()获取的值是不一样的:

  • Zepto 由盒模型(box-sizing)决定;

  • jQuery 会忽略盒模型,始终返回内容区域的宽/高(不包含padding、border)。

jQuery官方的说明:

Note that .width() will always return the content width, regardless of the value of the CSS box-sizing property. As of jQuery 1.8, this may require retrieving the CSS width plus box-sizing property and then subtracting any potential border and padding on each element when the element has box-sizing: border-box . To avoid this penalty, use .css("width") rather than .width() .

解决方式就是使用 .css('width') 而不是 .width() 。下面我们举个叫做《边框三角形宽高的获取》的栗子来说明这个问题。

首先用下面的 HTML 和 CSS 画了一个小三角形吧。

// html
<div class="caret"></div>

// css
.caret {
    width: 0;
    height: 0;
    border-width: 0 20px 20px;
    border-color: transparent transparent blue; 
    border-style: none dotted solid;
}
  • jQuery 使用 .width() 和 .css('width') 都返回 ,高度也一样;

  • Zepto 使用 .width() 返回 ,使用 .css('width') 返回 0px 。
    所以,这种场景,jQuery 使用 .outerWidth() / .outerHeight() ;Zepto 使用 .width() / .height()。

offset()的区别:

Zepto offset()处理角度与jQuery不同。在Zepto中,offset()会获取并返回 top、left、width、height四个值;在jquery中,offset()就只获取并返回width、height两个值。

获取隐藏元素width和height的区别

如果是隐藏元素,Zepto无法获取其宽高;但jquery可以获取隐藏元素的宽高。

extend() 的区别

zepto中没有为原型定义extend方法,而jquery有。

jQuery 在原型上拓展方法使用的方式是:

// For example
// Extend a function named 'sayHello' to the protorype of jQuery
(function($) {
    $.fn.extend({
        sayHello: function() {
            $(this).html('Hello !');
        }
    });
})(window.jQuery);

Zepto 中并没有为原型定义extend方法,所以如果要是要在 Zepto 的原型上拓展方法可以使用的方式是:

// For example
// Extend a function named 'sayHello' to the protorype of Zepto
Zepto(function($) {
    sayHello: function() {
        $(this).html('Hello !');
    }
});

each方法的区别

zepto的each方法只能遍历数组,不能遍历JSON对象。

clone()的区别

Zepto clone()不支持传递参数来克隆事件处理程序,但jQuery支持。

更多jQuery相关技术文章,请访问 jQuery答疑 栏目进行学习!!

以上就是jQuery和Zepto的差异是什么?的详细内容,更多请关注易知道|edz.cc其它相关文章!

推荐阅读