jQuery 1.3 中文文档发布

jQuery 1.3自从2009年1月14日发布后,后引来了各界的关注。我们也随即投入到翻译文档的工作中来。经过4天的努力,终于完工了。这个版本更新了不少东西

changelog:

2009-01-21 20:23:38 +0800
* #4 关于1.3版的日期 (感谢liushuang630)
* #5 die()的标题误为toggle() (感谢dadao5.com)
* queue([name],callback) queue([name],queue)少参数 (感谢Horatio)

2009-01-19 00:00:10 +0800
+ offsetParent()
* closest() 说明

2009-01-18 16:06:52 +0800
* triggerHandler 进一步说明
* trigger 进一步说明

2009-01-17 22:37:11 +0800
* live() – 与bind()不同的是,live()一次只能绑定一个事件。
* [attribute!=value] jQuery 1.3中意义改变
* load 的data参数在jQuery 1.3中也可以接受String
+ ajax的error回调的第二个参数可能值”timeout”, “error”, “notmodified” 和 “parsererror”
+ ajax参数xhr
* animate 的duration为0的问题
* show, hide, toggle, slideDown, slideUp, slideToggle 在jQuery 1.3中,padding和margin也会有动画,效果更流畅。
* jQuery(html,[ownerDocument])等效于$(document.createElement(“span”)
* is支持复杂表达式

2009-01-17 18:31:10 +0800
+ jQuery.support.scriptEval
+ 原 Dimension 插件功能(1.2.6版加入jQuery核心)

2009-01-16 19:11:10 +0800
+ jQuery.fx.off
+ toggleClass( class, switch )
+ toggle( switch )
+ toggle(speed,[callback])
* 修改queue和dequeue方法的参数和说明

2009-01-15 22:31:02 +0800
* jQuery(html,[ownerDocument])
+ jQuery.selector
+ jQuery.context
* 效果下的queue和dequeue搬到核心下
+ live()
+ die()
+ closest()
* stop( [clearQueue], [gotoEnd]) 增加两个参数
+ jQuery.support
+ jQuery.isArray( obj )

感谢Cloudream的热情帮忙。还要感谢一揪制作chm版。这个版本还加入了检查更新的功能。如果有需要的同学可轻松查看是否有更新的中文文档(chm版中的检查更新也将同步升级)。目前chm版尚未完工,请稍候。
继续阅读jQuery 1.3 中文文档发布

jQuery 1.3 正式版发布公告

http://docs.jquery.com/Release:jQuery_1.3

jQuery 1.3终于发布了。
min版(gzip后18kb)
源码(114kb)

另外可以用google的代码托管:
http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js

下面这个是我自己用Packer压缩的pack版
http://shawphy.com/down/jquery-1.3.pack.js(37kb)

简要来说:

更新了Sizzle选择器引擎,这个之前也提到过。可以查看他的性能:

此外据声称,把代码给了dojo基金会。这回Sizzle的野心在于能够让其他各种JS库都能用,包括Prototype, Dojo, Yahoo UI, MochiKit, 和 TinyMCE等等其他库。

live 事件
这也是jQuery 1.3这次更新的第二个重大更新。

可以看下面iframe中的效果以及源码

性能比较:

这样,我以前写的关于重复绑定的文章就差不多可以抛弃了

Event 对象
新增了一个jQuery.Event对象,他根据w3c文档,做了一个完整的,兼容所有浏览器的一个对象。具体还得看文档。

append, prepend, before, 和 after 方法重写
据声称,这些方法的效率提升了6倍

重写了offset方法
这回更快了

取消了浏览器侦测,全面改用jQuery.support
具体还得看文档了。
变化:
其中与开发者比较密切的是
[@attr] 中的@在1.3里不能用了
用trigger触发的事件现在能冒泡了
ready方法中,再也不等css加载完了再执行其中代码了。直接要求把css放在脚本之前就行
简化了.isFunction方法,那些偏门的就被无视了
用选择器a, b, c选择东西,在支持querySelectorAll (Safari, Firefox 3.1+, Opera 10+, IE 8+)中会按照这些元素在文档中顺序来确定这些数组在获得的对象列表中的位置。而不支持这个方法的浏览器则按照选择器顺序排好
新增了jQuery.Event
要求网页都在标准模式下,不要在怪异模式下使用,否则会报错。
以下3个方法属性已被不推荐使用。
* jQuery.browser
* jQuery.browser.version
* jQuery.boxModel

具体内容:
内核部分:
更好的queue, dequeue
新增selector, context这两个属性,分别指向获取这个元素的原始选择器和被查找的内容(可选)
选择器部分:
Sizzle的使用
复杂的css例如not(a, b)
属性部分:
toggleClass( “className”, state ) – 增加了一个布朗值的参数。
筛选文档:
.closest( selector ) – 找到离这个元素最近的一个父元素。这跟parents不一样。
is() 也支持更复杂的选择器了。
操作文档:
HTML Injection重写了
$(“<script/>”) 就自动转化为 $(document.createElement(“script”))
css:
offset()重写了
事件:
Live 事件
jQuery.Event
trigger()会冒泡了
效果:
hide() .show()之类的加快速度
内置动画效果考虑到了margin和 padding
.toggle( boolean ) 多提供了一个参数
jQuery.fx.off 关闭所有动画
AJAX:
.load()支持了文本格式的数据
工具:
新增jQuery.isArray

内部:
jQuery.support

另外这回改用YUI的工具压脚本了

========================================

最后预告一下,jQuery文档官网已经针对1.3版做了修改,中文文档也在紧张制作中。
文档地址:http://jquery-api-zh-cn.googlecode.com/svn/trunk/index.html

[推荐]jQuery 源码分析

不得不承认,我看到这个帖子晚了好几个月。
但幸运的是,我在年末的时候看到了。Better late than never.
就当作圣诞礼物送给我自己吧。
也送给各位:
http://jljlpch.javaeye.com/blog/234218
非常全面得分析了jQuery 1.2.6
100多页的pdf文档,引用fins的话是,这是今年JavaEye上精华中的精华了。
没看过的请务必去看一下。

json2select

这是我之前为了ThinkSNS写的一个小工具。通过json生成无限联动的select。至少要求jQuery 1.2.3 以上,因为我用了data方法。
查看DEMO 源文件 min版

//构建如下json,t为列表框的text,v为列表框的value,s表示子一级对象
var json=[
{
t:”欧洲某地”,
v:”欧洲”
},
{
t:”中国某地”,
v:”中国”,
s:[
{
t:”上海”,
v:”上海”
},
{
t:”云南某地”,
v:”云南”,
s:[
{
t:”大理”,
v:”大理”
}
]
}
]
},
{
t:”日本某地”,
v:”日本”,
s:[
{
t:”东京”,
v:”东京”
},
{
t:”北海道”,
v:”北海道”,
s:[
{
t:”北海道的某个地方”,
v:”北海道的某个地方”
}
]
}
]
}
];
//调用即可
$(“#selectt”).json2select(json,[“中国”,”云南”,”大理”]);

另外,如果用1.2.1的也想用的话,可以手动提取1.2.6里的data方法,或者简单用下面的模拟一下即可

(function($) {
$.fn.data=function(key,value) {
return $.data(this[0],key,value);
}
})(jQuery);

update:
附: 全国城市数据
并且更新到了 1.0.1版。以前下载的同学可以重新下载一份。

jQuery中不为人知的秘密之三——判断元素上是否绑定了事件

好久没写博客了,抱歉抱歉,最近半年很忙很忙。
正好群里 Q.Lee.lulu 问起怎样判断有没有绑定一个事件。
我研究了一下之后发现,jQuery都将事件缓存起来了,其实也是为了防止内存溢出以及页面unload的时候的速度,也包括多函数触发,方便管理等诸多好处,具体可以参考此文
jQuery会在window.unload的时候卸载所有绑定过的事件,释放内存的。

OK,言归正传。判断元素上是否绑定过事件用如下语句


jQuery.data(elem,”events”)[type] //老版本也能用
$(elem).data(“events”)[type] //1.2.3以后才能用

返回值:
一个Object,可以用for in来遍历。或者undefined。
参数:
elem是一个DOM对象,type是事件类型。
举例:
判断id为foo的元素上是否绑定了click事件

if( $(“#foo”).data(“events”)[“click”] ){
//your code
}

“另类”的阻止冒泡

论坛里有人问

HTML:
<div id=”b”>
<div>sssssssssssss</div>
<div>aaaaaaaaaaaa</div>
</div>

JQ;
$(‘div:contains(aaa)’).addClass(‘aa’);

如何才能让这个id=”b”的div不要被选择器匹配到呢?

底下讨论了老半天基本都是无解,只能回避这个问题,加入class之类的限定条件。

后来我仔细翻了翻API,发现还有filter这个方法可以用。

之后还不过瘾,写了个选择器插件,需要的同学可以拿去用。

直接上代码了,写的不好,有能力的帮忙优化一下,毕竟选择器函数属于运算密集型函数。
filter方法:

$(‘div:contains(aaa)’).filter(function() {
return $(this).children().length == 0;
});

选择器插件:

shawphy
this is a demo — shawphy
test
test



/*
Shawphy:用于查找不含子元素的元素(可以包含文本,不同于:empty选择器)
*/
;(function($) {
$.extend($.expr[“:”], {
nochild : function( a ) {
return $(a).children().length == 0; //Shawphy:子元素数量为0的元素会被保留
}
});
})(jQuery);
//Shawphy:测试是否能查到所需要的东西
alert($(‘div:contains(shawphy):nochild’).length)

jQuery中不为人知的秘密之二

又开始写jQuery的秘密了~
这里写的基本上都是没啥用的东西,大家随便看看好了,有用的都放在文档里了~

这回先说选择器,
两个特殊的选择器,没有在文档里列出来。有可能只是选择器正则匹配的失误,也可能是故意的,但我源码中看不出来。望各位看官指点。注意,下面两个特殊选择器,随时可能在以后版本中消失,慎用。本文涉及的是1.2.6,经测试1.2.3也可使用。

创建一个空jQuery对象:

$(” “); //切记,引号中间至少有_一个_空格

这段简易的代码即可创建一个空的jQuery对象。这就类似创建一个代码片段。但由于是空的,所以无法append进任何东西。但你可以用add将你要的东西添加进去。

获取document,有时候需要写一些关于document的事件,比如keypress之类的,或者其他的,就可以用

$(“”); //切记,引号中间_没有_空格

这一定程度上可以用于混淆代码,比如将$(document).ready()写成$(“”).ready(),不知道的人就看不懂了。当然,要看过本文的人就都知道了~~(笑~)

顺便一说,前端加密是没有可能的,混淆也是有限度的。有jQuery的操作是链式操作,没有中间变量,同时通常绑定函数也是匿名函数,所以对于jQuery代码的混淆更是没有太大用处。除非,不再使用匿名函数,每次都外部定义一个。同时不再使用链式操作,用next,parent之类操作的时候,统统再定义一个中间变量。这样你的jQuery代码已经没有jQuery风格了,对混淆会稍微有点点帮助。注意,以上所有混淆操作,只防君子不防小人!切记,前端开发不可能加密!所以一切都做好开源的准备!了解GPL、MIT之类的都是有必要的!

如果你要用中间变量,像前面说的为了混淆,有时候你可能需要用到之前的一个对象,就好像在链式写法中用end()的效果,那就可以用prevObject属性,end()就是返回这个属性。

$(“#id”).prevObject; //切记,最后没有括号,这个是属性不是方法

下面说的这个其实不是很秘密,但值得一提
attr是很伟大的方法,以下这些都是可以执行的,你就可以通过这些来进行一些简单的判断,比如这个元素的标签名啦之类的。

$(“body”).attr(“tagName”);
$(“body”).attr(“nodeName”);
$(“body”).attr(“nodeType”);

还有个相关的,他返回的是布尔值true/false

jQuery.nodeName( elem, nodeName )

第一个参数是一个DOM对象,不是jQuery对象,第二个就是节点名称(标签名)了,大小写无关。返回true/false
有人问,为什么我不直接使用elem.nodeName==nodeName呢,爱用写这么麻烦呢?
看一下jQuery的源码就知道了

nodeName: function( elem, name ) {
return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase();
},

明白了么?浏览器兼容性问题,某些浏览器中的nodeName是大写,有些是小写,够恶心吧?
兼容一下总是好的~~