zepto和jquery的区别,zepto的不同使用8条小结
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了zepto和jquery的区别,zepto的不同使用8条小结相关的知识,希望对你有一定的参考价值。
总体介绍:Zepto最初是为移动端开发的库,是jQuery的轻量级替代品,因为它的API和jQuery相似,而文件更小。
Zepto优点:
(1)、Zepto最大的优势是它的文件大小,只有8k多,是目前功能完备的库中最小的一个,尽管不大,Zepto所提供的工具足以满足开发程序的需要。
(2)、Zepto的API大部分都能和jQuery兼容,所以用起来极其容易,如果熟悉jQuery,就能很容易掌握Zepto。你可用同样的方式重用jQuery中的很多方法,也可以方面地把方法串在一起得到更简洁的代码,甚至不用看它的文档。
Zepto和jQuery的不同之处:
(1)、针对移动端程序,Zepto有一些基本的触摸事件可以用来做触摸屏交互(tap事件、swipe事件),Zepto是不支持IE浏览器的,这不是Zepto的开发者Thomas Fucks在跨浏览器问题上犯了迷糊,而是经过了认真考虑后为了降低文件尺寸而做出的决定,就像jQuery的团队在2.0版中不再支持旧版的IE(6 7 8)一样。因为Zepto使用jQuery句法,所以它在文档中建议把jQuery作为IE上的后备库。那样程序仍能在IE中,而其他浏览器则能享受到Zepto在文件大小上的优势,然而它们两个的API不是完全兼容的,所以使用这种方法时一定要小心,并要做充分的测试。
(2)、操作的区别:添加id时jQuery不会生效而Zepto会生效。
(3)、事件触发的区别:使用 jQuery 时 load 事件的处理函数不会执行;使用 Zepto 时 load 事件的处理函数会执行。
(4)、width()和height()的区别:Zepto由盒模型(box-sizing)决定,用.width()返回赋值的width,用.css('width')返回加border等的结果;jQuery会忽略盒模型,始终返回内容区域的宽/高(不包含padding、border)。
(5)、offset()的区别:Zepto返回top,left,width,height;jQuery返回width,height。
(6)、,Zepto无法获取隐藏元素宽高,jQuery 可以。
(7)、Zepto中没有为原型定义extend方法而jQuery有。
(8)、Zepto 的each 方法只能遍历 数组,不能遍历JSON对象。
(9)、Zepto在操作dom的selected和checked属性时尽量使用prop方法,在读取属性值的情况下优先于attr。Zepto获取select元素的选中option不能用类似jQuery的方法$('option[selected]'),因为selected属性不是css的标准属性。应该使用$('option').not(function() return !this.selected )。
例如执行: $().bind('cust', function());
结果: TypeError: Object has no method 'addEventListener'
解决办法是创建一个脱离文档流的节点作为事件对象:
例如: $('').bind('cust', function());
2. Zepto 的选择器表达式: [name=value] 中value 必须用 双引号 " or 单引号 ' 括起来
例如执行:$('[data-userid=123123123]')
结果:Error: SyntaxError: DOM Exception 12
解决办法: $('[data-userid="123123123]"') or $("[data-userid='123123123']")
2-1.zepto的选择器没有办法选出 $("div[name!='abc']") 的元素
2-2.zepto获取select元素的选中option不能用类似jq的方法$('option[selected]'),因为selected属性不是css的标准属性
应该使用$('option').not(function() return !this.selected )
比如:jq:$this.find('option[selected]').attr('data-v') * 1
zepto:$this.find('option').not(function() return !this.selected).attr('data-v') * 1
但是获取有select中含有disabled属性的元素可以用 $this.find("option:not(:disabled)") 因为disabled是标准属性
参考网址:https://github.com/madrobby/zepto/issues/503
2-3、zepto在操作dom的selected和checked属性时尽量使用prop方法,以下是官方说明:
3.Zepto 是根据标准浏览器写的,所以对于节点尺寸的方法只提供 width() 和 height(),省去了 innerWidth(), innerHeight(),outerWidth(),outerHeight()
Zepto.js: 由盒模型( box-sizing )决定
jQery: 忽略盒模型,始终返回内容区域的宽/高(不包含 padding 、 border )解决方式就是使用 .css('width') 而不是 .width() 。
3-1.边框三角形宽高的获取
假设用下面的 html 和 CSS 画了一个小三角形:
[html] view plain copy print?
<div class="caret"></div>
.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() 。
3-2.offset()
Zepto.js: 返回 top 、 left 、 width 、 height
jQuery: 返回 width 、 height
3-3.隐藏元素
Zepto.js: 无法获取宽高;
jQuery: 可以获取。
4.Zepto 的each 方法只能遍历 数组,不能遍历JSON对象
5.Zepto 的animate 方法参数说明 :详情点击->
zepto中animate的用法
6.zepto的jsonp callback函数名无法自定义
7.DOM 操作区别
jq代码:
[html] view plain copy print?
(function($)
$(function()
var $list = $('<ul><li>jQuery 插入</li></ul>',
id: 'insert-by-jquery'
);
$list.appendTo($('body'));
);
)(window.jQuery);
jQuery 操作 ul 上的 id 不会被添加。
zepto代码:
[html] view plain copy print?
Zepto(function($)
var $list = $('<ul><li>Zepto 插入</li></ul>',
id: 'insert-by-zepto'
);
$list.appendTo($('body'));
);
Zepto 可以在 ul 上添加 id 。
8.事件触发区别
jq代码:
[html] view plain copy print?
(function($)
$(function()
$script = $('<script />',
src: 'http://cdn.amazeui.org/amazeui/1.0.1/js/amazeui.min.js',
id: 'ui-jquery'
);
$script.appendTo($('body'));
$script.on('load', function()
console.log('jQ script loaded');
);
);
)(window.jQuery);
使用 jQuery 时 load 事件的处理函数 不会 执行
zepto代码:
[html] view plain copy print?
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 时 load 事件的处理函数 会 执行。 参考技术B 1. Zepto 对象 不能自定义事件
例如执行: $().bind('cust', function());
结果: TypeError: Object has no method 'addEventListener'
解决办法是创建一个脱离文档流的节点作为事件对象:
例如: $('').bind('cust', function());
2. Zepto 的选择器表达式: [name=value] 中value 必须用 双引号 " or 单引号 ' 括起来
例如执行:$('[data-userid=123123123]')
结果:Error: SyntaxError: DOM Exception 12
解决办法: $('[data-userid="123123123]"') or $("[data-userid='123123123']")
2-1.zepto的选择器没有办法选出 $("div[name!='abc']") 的元素
2-2.zepto获取select元素的选中option不能用类似jq的方法$('option[selected]'),因为selected属性不是css的标准属性
应该使用$('option').not(function() return !this.selected )
比如:jq:$this.find('option[selected]').attr('data-v') * 1
zepto:$this.find('option').not(function() return !this.selected).attr('data-v') * 1
但是获取有select中含有disabled属性的元素可以用 $this.find("option:not(:disabled)") 因为disabled是标准属性
参考网址:https://github.com/madrobby/zepto/issues/503
2-3、zepto在操作dom的selected和checked属性时尽量使用prop方法,以下是官方说明:
3.Zepto 是根据标准浏览器写的,所以对于节点尺寸的方法只提供 width() 和 height(),省去了 innerWidth(), innerHeight(),outerWidth(),outerHeight()
Zepto.js: 由盒模型( box-sizing )决定
jQery: 忽略盒模型,始终返回内容区域的宽/高(不包含 padding 、 border )解决方式就是使用 .css('width') 而不是 .width() 。
3-1.边框三角形宽高的获取
假设用下面的 HTML 和 CSS 画了一个小三角形:
[html] view plaincopyprint?在CODE上查看代码片派生到我的代码片
<div class="caret"></div>
.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() 。
3-2.offset()
Zepto.js: 返回 top 、 left 、 width 、 height
jQuery: 返回 width 、 height
3-3.隐藏元素
Zepto.js: 无法获取宽高;
jQuery: 可以获取。
4.Zepto 的each 方法只能遍历 数组,不能遍历JSON对象
5.Zepto 的animate 方法参数说明 :详情点击->
zepto中animate的用法
6.zepto的jsonp callback函数名无法自定义
7.DOM 操作区别
jq代码:
[html] view plaincopyprint?在CODE上查看代码片派生到我的代码片
(function($)
$(function()
var $list = $('<ul><li>jQuery 插入</li></ul>',
id: 'insert-by-jquery'
);
$list.appendTo($('body'));
);
)(window.jQuery);
jQuery 操作 ul 上的 id 不会被添加。
zepto代码:
[html] view plaincopyprint?在CODE上查看代码片派生到我的代码片
Zepto(function($)
var $list = $('<ul><li>Zepto 插入</li></ul>',
id: 'insert-by-zepto'
);
$list.appendTo($('body'));
);
Zepto 可以在 ul 上添加 id 。
8.事件触发区别
jq代码:
[html] view plaincopyprint?在CODE上查看代码片派生到我的代码片
(function($)
$(function()
$script = $('<script />',
src: 'http://cdn.amazeui.org/amazeui/1.0.1/js/amazeui.min.js',
id: 'ui-jquery'
);
$script.appendTo($('body'));
$script.on('load', function()
console.log('jQ script loaded');
);
);
)(window.jQuery);
使用 jQuery 时 load 事件的处理函数 不会 执行
zepto代码:
[html] view plaincopyprint?在CODE上查看代码片派生到我的代码片
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 时 load 事件的处理函数 会 执行。
复习 | 重温jQuery和Zepto的API
jq和zepto很相似有许多共同的api,zepto也出了很多与jq不一样的api,总的来说,两者更相似,但是zepto更轻量一点,正好公司也在用,复习这两个没错
jq中的zepto的事件和ajax我没有整理,因为之前有专门的文章去详细的写了ajax和事件绑定的区别
再学ajax--第二天 | 基于php+mysql+ajax的表单注册、登录、注销
面试 | 蚂蚁金服面试经历 也讲到了js中的绑定事件的区别bind、on、delegate,以及事件绑定 事件委托的区别等
jquery复习
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <style > *{ margin:0; padding: 0; } </style> <script src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script> <script> /* jQuery([selector,[context]]) */ console.log($(\'div>p\')); $(document.body).css("background","black"); // 在文档的第一个表单中,查找所有的单选按钮 console.log($(\'input:radio\',document.forms[0])) /*jQuery(html,[ownerDocument])*/ $(function(){ $(\'<div>hello world</div>\').appendTo(\'.test\'); // 动态创建一个 div 元素(以及其中的所有内容),并将它追加到 body 元素中 $(\'<div>\',{ "class":"test_valid", text:"click me", click:function(){ $(this).toggleClass("test2"); } }).appendTo(".test") // 创建一个 <input> 元素,同时设定 type 属性、属性值,以及一些事件。 $(\'<input>\',{ type:\'text\', val:"text", focusin:function(){ // alert("focusin"); }, focusout:function(){ // alert("focusout"); } }).appendTo(".test"); }) /* jQuery(callback)*/ $(function(){ // do something // 等价于$(document).ready() }) /* jQuery.holdReady(hold) */ // 延迟就绪事件,直到已加载的插件。 // $.holdReady(true); // $.getScript("plugin.js",function(){ // $.holdReady(false) // }) /* each(callback) */ $(function(){ $(\'.test > span\').each(function(i){ // console.log(this); // console.log($(this)); this.innerHTML="span"+i; // $(this).toggleClass("span"+i); // $(this).text("hello"); // 跳出遍历 // return false; }) }) /* size() */ // jQuery 对象中元素的个数 console.log($("div").size()); console.log($(\'div\').length); /* selector、context 、get([index]) 、index([selector|element]) */ $(function(){ $("ul") // 返回传给jQuery()的原始选择器 .append("<li>"+$(\'ul\').selector+"</li>") // 返回传给jQuery()的原始的DOM节点内容,即jQuery()的第二个参数。那么context指向当前的文档(document)。 console.log($(\'ul\').context) console.log($(\'ul\',document.body).context) console.log($(\'.innerTest>span\').get(0)); // 选择文档中所有图像作为元素数组,并用数组内建的 reverse 方法将数组反向。 console.log($(\'.innerTest>span\').get().reverse()); //传递一个DOM对象,返回这个对象在原先集合中的索引位置 console.log($(\'.innerTest>span\').index(document.getElementById(\'bar\'))); //传递一个jQuery对象 console.log($(\'.innerTest>span\').index($(\'#bar\'))); //传递一组jQuery对象,返回这个对象中第一个元素在原先集合中的索引位置 console.log($(\'.innerTest>span\').index($(\'.innerTest>span:nth-child(2)\'))); }) /*数据缓存data*/ $(function(){ // 没什么卵用 $(\'.data\').data("div-data","data"); }) /*queue(element,[queueName])*/ $(function(){ $("#show").on(\'click\',function(){ var n = $(".queue").queue("fx"); // 显示在匹配元素上执行的函数队列的个数 console.log(n.length); }) function resuIt(){ $(\'.queue\').show("slow"); $(\'.queue\').animate({left:"+=200"},2000); $(\'.queue\').slideToggle(1000); } resuIt() }) /*queue(element,[queueName]) jQuery.extend(object)*/ $(function(){ // 给选择器提供新方法 jQuery.fn.extend({ check:function(){ return this.each(function(){this.checked=true}) }, uncheck:function(){ return this.each(function(){this.checked=false}) } }) // 扩展jQuery对象本身 jQuery.extend({ min:function(a,b){return a<b?a:b}, max:function(a,b){return a>b?a:b} }) $(".innerTest>input[type=checkbox]").check(); $(".innerTest>input[type=radio]").uncheck(); console.log(jQuery.min(1,2)); console.log(jQuery.max(3,4)); }) /*属性相关*/ $(function(){ // attr console.log($(\'.innerTest>input\').eq(1).attr(\'type\')) $(\'.innerTest>span\').eq(2).attr({class:"innerSpan","data-span":"innerSpan"}) // class的值为innerHTML的值 $(\'.innerTest>span\').eq(2).attr("class",function(){return this.innerHTML}) // removeAttr $(\'.innerTest>span\').eq(0).removeAttr("class"); // prop 获取在匹配的元素集中的第一个元素的属性值。 console.log($(".innerTest>input[type=\'checkbox").prop(\'checked\')); // 禁用所有checkbox $(".innerTest>input[type=\'checkbox\']").prop(\'checked\',function(i,val){ return !val; }) // addClass $(".innerTest>span:nth-child(5)").addClass("span5 span_5") // 加上不同的class $(".innerTest>span").addClass(function(){ return "span_"+$(this).index(); }) // removeClass $(".innerTest>span").eq(0).removeClass(\'span_0\'); // 删除最后一个元素与上面重复的class $(".innerTest>span:last").removeClass(function(){ return $(this).prev().attr(\'class\'); }) // toggleClass 如果存在(不存在)就删除(添加)一个类。 // 点击三下添加一个类 let count = 1; $(\'.innerTest>span\').eq(5).on(\'click\',function(){ $(this).toggleClass("highlight",count ++ % 3==0) }) // 根据父元素添加类 $(\'.innerTest>span\').eq(5).toggleClass(function(){ if($(this).parent().is(".innerTest")){ return "span_6" } }) // html和text $(".innerTest>pzepto和jquery的区别,zepto的不同使用8条小结