Submitted by gouki on 2011, May 4, 7:31 AM
我晶,我1.5都还没有用太多次,1.6居然都出来了,还TMD是正式版。。。
据jQuery官方博客5月3日的最新消息,jQuery 1.6 正式版已经可以下载使用。jQuery 1.6 版本包括了对属性(Attribute)模型的重要重写,还有诸多性能优化。借此机会感谢jQuery开发团队和jQuery错误分类团队的成员。 可以从这里下载jQuery 1.6:
http://code.jquery.com/jquery-1.6.js
http://code.jquery.com/jquery-1.6.min.js
Microsoft CDN 下载: http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.6.min.js
jQuery的官方博文中也鼓励社区会员参与到jQuery的核心工作中。此外,jQuery官方透露,已准备着手jQuery 1.7的开发工作,如果你有相关建议,可以向他们提交表单。(请翻墙)
看了一下changelog,发现还是以修复bug和加速为主,看到上面贴的那么多性能图片,发现在ie下几乎都维持着原来的状态,看来IE下,jquery是无法提高性能了。。。
http://blog.jquery.com/2011/05/03/jquery-16-released/
Tags: jquery
Javascript | 评论:1
| 阅读:16959
Submitted by gouki on 2011, March 4, 11:11 PM
做前端的用户都会想过如何做lazyLoad,其实很多时候都有很多想法,比如占位图片,TEXTAREA后处理,根据滚动条的位置显示图片等。
介绍介绍上面的说法,因为这些名词是我自己想出来的。。。和一些标准的前端讲法可能是不一致的。
1、占位图片,这个用的比较多一点,即在页面还没有全部加载完的时候,涉及到图片的地方,先用占位图片(1X1大小的图片进行放大)占好,不影响整个DOM的加载,等全部加载完后,再慢慢加载图片。这样的方式优点在于,不影响DOM加载,代码修改量也最小,缺点是,其实还是加载了所有的图片。。。
2、teatarea后处理,这个,被用的比较明显的应该算是淘宝的trademark的页面上,当时在抢购活动的时候就用上了这个技巧,trademark这个页面全是图片,如果全部读出来并显示,很可能一下子就下载大约3M左右的图片,如果用第一种办法,那么占用的流量就非常夸张。于是淘宝当时的页面源码里就很明显的内容就是第一屏是正常的HTML代码,第二屏开始,把每一层的内容都放在textarea容器里。当滚动条滚动的时候,即当textarea开始出现在页面中时,就把textarea中的HTML代码转化成DOM,显示在页面上。它的优点是,textarea中的内容在初次加载时,不会被当成DOM被页面所加载。因此事实上首次加载的时候,只有第一屏的内容。缺点是需要写很多JS。(和第三点也有关)
3、根据滚动条的位置显示图片,这个其实是现在很多网站采用的技巧了,即滚动条滚动到哪里,图片就开始加载到哪里。和第二点其实有点象,只是处理的结构不一样而已。
介绍完这个,那就好好介绍一下第三点的技术了,原文从这里来:http://www.zhangjingwei.com/archives/jquery-inviewport/。
晚上在微博上“拔赤”写了个lazyload插件,发现其中用到一个很有意思的方法”div.inViewportRegion()”,字面意思就是在可视区域内。
在网上找了找,发现这是YUI提供的一个组件,觉得很有意思。
http://gillserver.com/yui/api/dom-region.js.html
如果jQ里面也包含类似的方法,可以做很多事,于是GG了一下,发现国外的同学写过这种选择器,代码表现上更直观。
代码如下:
JavaScript代码
- (function($) {
-
- $.belowthefold = function(element, settings) {
- var fold = $(window).height() + $(window).scrollTop();
- return fold < = $(element).offset().top - settings.threshold;
- };
-
- $.abovethetop = function(element, settings) {
- var top = $(window).scrollTop();
- return top >= $(element).offset().top + $(element).height() - settings.threshold;
- };
-
- $.rightofscreen = function(element, settings) {
- var fold = $(window).width() + $(window).scrollLeft();
- return fold < = $(element).offset().left - settings.threshold;
- };
-
- $.leftofscreen = function(element, settings) {
- var left = $(window).scrollLeft();
- return left >= $(element).offset().left + $(element).width() - settings.threshold;
- };
-
- $.inviewport = function(element, settings) {
- return !$.rightofscreen(element, settings) && !$.leftofscreen(element, settings) && !$.belowthefold(element, settings) && !$.abovethetop(element, settings);
- };
-
- $.extend($.expr[':'], {
- "below-the-fold": function(a, i, m) {
- return $.belowthefold(a, {threshold : 0});
- },
- "above-the-top": function(a, i, m) {
- return $.abovethetop(a, {threshold : 0});
- },
- "left-of-screen": function(a, i, m) {
- return $.leftofscreen(a, {threshold : 0});
- },
- "right-of-screen": function(a, i, m) {
- return $.rightofscreen(a, {threshold : 0});
- },
- "in-viewport": function(a, i, m) {
- return $.inviewport(a, {threshold : 0});
- }
- });
-
- })(jQuery);
来源:http://www.appelsiini.net/projects/viewport
简单测了下,不错,呵呵~
Demo:http://www.zhangjingwei.com/inviewport.zip
------EOF--
事后测试了一下,加载了这段的JS后,剩下对代码的处理就其实不多了,只需要BIND一个in-viewport就OK了,也算是比较方便。值得推荐,不知道啥时候类似功能可以直接进jQuery类库
Tags: jquery, inviewport, lazyload
Javascript | 评论:0
| 阅读:18587
Submitted by gouki on 2011, March 2, 9:32 PM
前两天看的文章里刚刚说ECMA 262中的一些String特性,又正好看到一篇博客介绍一些其他操作的实现,比如foreach,这个对于PHP用户来说就太常用了,而以前在javascript中只能用for(i in arr)来实现,虽然都没有问题,但毕竟看起来怪怪的。
上次的文章在这里:Javascript中各种trim的实现,这次的文章引用自Javascript1.6数组新特性和jquery的几个工具方法。
原文如下,其中会插入自己的内容,会特别标记
JavaScript 1.6 引入了几个新的Array 方法,具体的介绍见:New in JavaScript 1.6 。这些方法已经被写进了ECMA262 V5。现代浏览器(IE9/Firefox/Safari/Chrome/Opera)都已经支持,但IE6/7/8不支持。jquery的工具方法中提供了类似的功能。【膘叔:上次在讲trim的时候自己也测试过,确实IE8不支持,低于IE8的就更不用想了】
1、Array.forEach()和jquery的$().each()。在数组中的每个项上运行一个函数。类似java5 增强的for循环。
JavaScript代码
- var ary = [2,4,6,8];
-
-
- ary.forEach(function(i){alert(i);});
-
-
- $(ary).each(function(){alert(this);});
-
- $(ary).each(function(index,item){alert(item);});
- //膘叔:这个相当于PHP中如下代码。。
- while (list($key, $val) = each($fruit)) {
echo "$key => $val\n";
}
2、Array.filter()和jquery的$.grep()。在数组中的每个项上运行一个函数,并将函数返回真值的项作为数组返回。简单的说就是用一个条件过滤掉不符合的数组元素,剩下的符合条件的元素组合成新的数组返回。
JavaScript代码
- var ary = [2,4,6,8];
-
-
- var otherAry1 = ary.filter(function(item){return item>4;});
- alert(otherAry1);
-
-
-
-
- var otherAry2 = $.grep(ary,function(item,index){return item>4;});
- alert(otherAry2);
- //膘叔:PHP中有类似函数,比如array_filter,也是可以通过callback来处理
3、Array.map()和jquery的$.map()。在数组中的每个项上运行一个函数,并将全部结果作为数组返回。这个方法非常强大,尤其是作用于DOM数组时(在abcc项目上用过,对每个查询模块DOM生成查询字符串)。简单说就是把每个数组元素运算的结果作为新数组元素(还是很拗口)【膘叔:php中有array_map,array_walk等】
JavaScript代码
- var ary = [2,4,6,8];
-
-
- var newAry1 = ary.map(function(item){return item+1;});
- alert(newAry1);
-
-
- var newAry2 = $.map(ary,function(item,index){return item+1;});
- alert(newAry2);
4、Array.every()方法。检查数组元素是否都符合某个条件,只要有一个不符合返回false,否则返回true
JavaScript代码
- var ary = [2,4,6,8,10];
-
- alert(ary.every(function(item){return item>1}));
- alert(ary.every(function(item){return item>2}));
5、Array.some()方法。检查数组中元素是否符合某个条件,只要有一个符合返回true,否则返回false
JavaScript代码
- var ary = [2,4,,6,8,10];
-
- alert(ary.some(function(item){return item>9;}));
- alert(ary.some(function(item){return item>10;}));
最后给出 IE6/7/8的解决方案,让这些浏览器完美支持JS1.6的Array新方法。
JavaScript代码
- -function(){
-
- function applyIf(o, c) {
- if(o) {
- for(var p in c) {
- if(o[p]===undefined) {
- o[p] = c[p];
- }
- }
- }
- return o;
- }
- applyIf(Array.prototype, {
- indexOf : function(obj, idx) {
- var from = idx == null ? 0 : (idx < 0 ? Math.max(0, arr.length + idx) : idx);
- for(var i = from, l = this.length; i < l; i++) {
- if(i in this && this[i] === obj) {
- return i;
- }
- }
- return -1;
- },
- lastIndexOf : function(obj, idx) {
- var len = this.length, from = idx == null ? len - 1 : idx;
- if(from < 0) {
- from = Math.max(0, len + from);
- }
- for(var i = from; i >= 0; i--) {
- if (i in this && this[i] === obj) {
- return i;
- }
- }
- return -1;
- },
- every : function(fn, thisObj) {
- var l = this.length;
- for(var i = 0; i < l; i++) {
- if(i in this && !fn.call(thisObj, this[i], i, this)) {
- return false;
- }
- }
- return true;
- },
- some : function(fn, thisObj) {
- var l = this.length;
- for(var i = 0; i < l; i++) {
- if(i in this && fn.call(thisObj, this[i], i, this)) {
- return true;
- }
- }
- return false;
- },
- filter : function(fn, thisObj) {
- var l = this.length, res = [], resLength = 0;
- for(var i = 0; i < l; i++) {
- if(i in this) {
- var val = this[i];
- if(fn.call(thisObj, val, i, this)) {
- res[resLength++] = val;
- }
- }
- }
- return res;
- },
- map : function(fn, thisObj) {
- var l = this.length, res = [];
- for(var i = 0; i < l; i++) {
- if(i in this) {
- res[i] = fn.call(thisObj, this[i], i, this);
- }
- }
- return res;
- },
- forEach : function(fn, thisObj) {
- var l = this.length;
- for(var i = 0; i < l; i++) {
- if(i in this) {
- fn.call(thisObj, this[i], i, this);
- }
- }
- }
- });
- }();
------EOF----
最后这一段有事没事可以参考一下哦,毕竟这些都是可以拿来做参考的,比如象最后一个foreach,可以好好学学这些代码哦。
最后,var evens = [i for each (i in numbers) if (i % 2 == 0)];,看到这个,有没有感觉很象python的写法???这个是javascript 1.7中的写法了,看看这里的介绍:https://developer.mozilla.org/en/JavaScript/Guide/Predefined_Core_Objects#Working_with_Array-like_objects
Tags: jquery
Javascript | 评论:0
| 阅读:18699
Submitted by gouki on 2011, February 26, 9:54 PM
一点小记录吧
第一:jQuery 升级到1.5.1了,前两天在群里的时候还有人在说,1.5不支持IE9,因为在使用的时候居然出错了。报错信息居然是document.getElementsByTagName,但是直接写这样的document.getE....是正常的。所以,这明显就是1.5的BUG。
当然这里不是说这个,这里是一篇翻译,http://www.cnblogs.com/sanshi/archive/2011/02/25/1964441.html。我觉得主要内容是这一段:
“jQuery 目前把 IE9作为一个重要的浏览器来支持。所有已知的BUG都已经得到修复或者已经提交给IE的开发团队以便在最终版本中得到解决。(All known bugs have been fixed and/or been reported to the IE team for resolution in the final release.)
三个新的参数被添加到jQuery.ajax():
isLocal: 允许当前的执行环境被识别为“local”(例如文件系统),jQuery默认情况下是不会识别这种环境。如下的协议被识别为本地环境:file, *-entension, widget. 如果需要修改isLocal,推荐使用$.ajaxSetup()方法来修改。
mimeType: 可以用来覆盖XHR的mime type.
xhrFields: 一个可以添加到原生XHR对象上的键值对(fieldName-fieldValue)。比如,你可以在跨域调用中设置withCredentials为true。”
第二:第二件嘛就是果粉比较开心的事了,那就是前两天刚刚苹果刚刚更新了商店里商品的信息,所有的mac pro现在都更新CPU为i5了,而且价格没变。这实在太让人激动开心了。黑黑,看来我去年没有买成mac pro也是属于塞翁失马焉知非福吧。
第三:yahoo的邮箱更新了。其实这并不算是什么 新闻吧。不过自从我用yahoo的邮箱以来,这是第三次更新了。虽然每一次打开邮箱都感觉比较慢(应该是邮箱服务器在国外的关系吧),但是我想说的是用户体验。用过很多WEB邮箱,几乎到现在都没有更新过,几年前什么 界面现在还是。。。当然QQ邮箱变化是较大的,以前最喜欢用网易的邮箱,SINA以前是最烂的,现在好很多。139邮箱原来也不行,现在也好很多了。gmail的变化也比较小,只是一些小功能的更新,只是这些小功能的更新会让用户使用起来更流畅。
第四:Google JavaScript Style Guide。这个嘛,啥时候有空的时候翻译翻译吧。还是算比较好的,虽然只是google的js style,但是对我们开发人员来说也可以学习学习。原文在这里http://google-styleguide.googlecode.com/svn/trunk/javascriptguide.xml?showone=Tips_and_Tricks
Tags: jquery, apple
Misc | 评论:0
| 阅读:17172
Submitted by gouki on 2011, January 27, 8:49 PM
jquery在1.5的时候多了一个subclass,代码大约如下:
JavaScript代码
- subclass: function(){
- function jQuerySubclass( selector, context ) {
- return new jQuerySubclass.fn.init( selector, context );
- }
- jQuerySubclass.superclass = this;
- jQuerySubclass.fn = jQuerySubclass.prototype = this();
- jQuerySubclass.fn.constructor = jQuerySubclass;
- jQuerySubclass.subclass = this.subclass;
- jQuerySubclass.fn.init = function init( selector, context ) {
- if (context && context instanceof jQuery && !(context instanceof jQuerySubclass)){
- context = jQuerySubclass(context);
- }
- return jQuery.fn.init.call( this, selector, context, rootjQuerySubclass );
- };
- jQuerySubclass.fn.init.prototype = jQuerySubclass.fn;
- var rootjQuerySubclass = jQuerySubclass(document);
- return jQuerySubclass;
- },
很多看到这个代码的人都认为这个功能是用来优化插件的,因为现在jQuery的插件越来越多,有类似功能,类似名称的插件也越来越多了,所以,同名插件带来的困扰也就更多了。
未来怎么办,jQuery鼓励用户开发插件,但插件总不能老是给用户带来麻烦吧?所以这个subclass就成了新的插件机制所必备的方法,利用subclass来创建一个新的实例(即所谓的继承,当然也能覆写父类[jQuery]的方法 )。
只是这样的频繁继承,肯定会造成效率降低吧。怎么样既能继承,又不降低效率,这恐怕就是未来jQuery团队要考虑的事情了?但是否靠什么behavior这种行为的方式来加载呢?现在都在讲究这种行为触发性的插件。jQuery是不是未来也会采用这种方式呢。
Tags: jquery, plugin, subclass
Javascript | 评论:0
| 阅读:17641