惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
T
Threatpost
Latest news
Latest news
N
News | PayPal Newsroom
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Help Net Security
Help Net Security
D
Darknet – Hacking Tools, Hacker News & Cyber Security
AI
AI
Simon Willison's Weblog
Simon Willison's Weblog
TaoSecurity Blog
TaoSecurity Blog
The Last Watchdog
The Last Watchdog
L
LINUX DO - 热门话题
Google DeepMind News
Google DeepMind News
T
Threat Research - Cisco Blogs
O
OpenAI News
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
The Exploit Database - CXSecurity.com
NISL@THU
NISL@THU
Application and Cybersecurity Blog
Application and Cybersecurity Blog
S
Securelist
小众软件
小众软件
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Martin Fowler
Martin Fowler
S
SegmentFault 最新的问题
Cisco Talos Blog
Cisco Talos Blog
云风的 BLOG
云风的 BLOG
AWS News Blog
AWS News Blog
GbyAI
GbyAI
N
News and Events Feed by Topic
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
美团技术团队
Engineering at Meta
Engineering at Meta
A
About on SuperTechFans
博客园 - 三生石上(FineUI控件)
S
Schneier on Security
博客园 - 聂微东
V2EX - 技术
V2EX - 技术
T
Troy Hunt's Blog
SecWiki News
SecWiki News
S
Secure Thoughts
B
Blog RSS Feed
Hugging Face - Blog
Hugging Face - Blog
WordPress大学
WordPress大学
腾讯CDC
H
Heimdal Security Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Apple Machine Learning Research
Apple Machine Learning Research
月光博客
月光博客
www.infosecurity-magazine.com
www.infosecurity-magazine.com
P
Privacy International News Feed

博客园 - John Liu

C#中处理SQL Server中的空的DateTime型字段 推荐一个不错的国外html5模板网站 SQL SERVERR中未公开的存储过程sp_MSforeachtable - John Liu .net 4.0 ValidateRequest="false" 无效 - John Liu 《数据库设计指南》学习笔记一:设计数据库之前 巧用case when 解决多条件模糊查询问题 安装vs2010后新建项目FrameWork版本选择只有4.0的解决方案 SQL Server直接执行.sql文件 小技巧:Response.Redirect(...,true/false) [转]100多个很有用的JavaScript函数以及基础写法大集合 思维导图,相见恨晚 jQuery的图像裁剪插件Jcrop的简单使用 微软提供的web.config文件的加密方式,掩耳盗铃! 开始专注数据库:动态Sql,自定义函数 将sql server表中的数据导出为inert into语句的形式 js进行图片的等比缩放(转自yayayaangel的百度空间) - John Liu - 博客园 金额数字的格式化(转自mimimo的百度空间) web.config文件加密 - John Liu - 博客园 使用sql语句建立与删除链接服务器及执行数据库操作
【转自大家论坛】jQuery 1.4: 15个你应该知道的新特性 - John Liu
John Liu · 2010-02-25 · via 博客园 - John Liu
jQuery 1.4 最近刚刚发布. 这个版本可不是一个简单的改进,它不仅包含了很多新的特性,还改进了很多功能, 更在性能优化方面下了很大功夫, 本文将对这些新的特性和增强的部分进行讨论,希望能对你有所帮助.

首先现在你可以从这里下载最新的1.4的版本了: http://code.jquery.com/jquery-1.4.js

1. 传递属性给jQuery

1.4之前的版本中jQuery就通过"attr”方法支持了添加属性到元素集合中,"attr”方法不仅可以传递属性名和值,也可以传递包含有多个属性的对象集合。在1.4中,除了可以创建新的对象,现在它更能将属性对象作为参数传递给jQuery函数或对象自身。如你可以创建一个含有多个属性的链接元素,通过1.4代码如下:

  1. jQuery('<a/>', {
  2. id: 'gid',
  3. href: 'http://www.google.com',
  4. title: 'google非和谐版',
  5. rel: 'external',
  6. text: '进入Google!'
  7. });

复制代码

你可能会注意到"text”属性并且猜测它是干吗的,因为a标签是没有"text”属性的。呵呵,当你传递某些属性时,jquery 1.4同样会检查并使用它自己的方法。因此上面的"text”属性可以让jQuery调用它的".text()”方法并将"进入Google!“作为它的唯一参数。

这里给出一个更好的例子:

  1. jQuery('<div/>', {
  2. id: 'foo',
  3. css: {
  4. fontWeight: 700,
  5. color: 'green'
  6. },
  7. click: function(){
  8. alert('Foo被点击过!');
  9. }
  10. });

复制代码

"id”属性是作为一个普通属性被添加的。但"css”和"click”属性则对应特定的jQuery方法。上面的代码在1.4之前一种写法如下:
  1. jQuery('<div/>')
  2. .attr('id', 'foo')
  3. .css({
  4. fontWeight: 700,
  5. color: 'green'
  6. })
  7. .click(function(){
  8. alert('Foo被点击过!');
  9. });

复制代码

2. 所有的东西都可以"until“了

1.4新增了三个对DOM操作的方法,他们分别是"nextUntil",  "prevUntil"  和  "parentsUntil"。 这些方法会按照某个顺序去遍历DOM对象直到满足指定的筛选条件。假设我们有一个水果列表:

  1. <ul>
  2. <li>苹果</li>
  3. <li>香蕉</li>
  4. <li>葡萄</li>
  5. <li>草莓</li>
  6. <li>例子</li>
  7. <li>桃子</li>
  8. </ul>

复制代码

如果你想选择所有在"Apple”和"Strawberry”之间的元素。代码可以这样写:
  1. jQuery('ul li:contains(苹果)').nextUntil(':contains(梨子)');
  2. // 得到 香蕉,葡萄,草莓

复制代码

3. 绑定多个事件

与通过jquery链绑定多个方法到一起相比,现在你可以通过一次调用来绑定所有这些事件,如:

  1. jQuery('#foo).bind({
  2. click: function() {
  3. // 具体代码
  4. },
  5. mouseover: function() {
  6. // 具体代码
  7. },
  8. mouseout: function() {
  9. // 具体代码
  10. }
  11. })

复制代码

你也可以通过 ".one()"方法操作。

4. Per-Property Easing

与给一个动画仅仅定义一个缓动效果相比,现在你可以给你想要添加动画效果的属性定义不同的缓动函数了。jQuery包含两个缓动函数,旋转(默认)和线性移动。如果你需要其他的效果的话,你需要去单独下载它们 !

要给每个属性指定一个缓动函数的话,你可以简单的通过属性数组来达到目的,在数组中,第一个值是你想要实现的效果值,第二个参数则是使用的缓动函数,如:

  1. jQuery('#foo').animate({
  2. left: 500,
  3. top: [500, 'easeOutBounce']
  4. }, 2000);

复制代码

你也可以以键值对的形式在那些可选设置项中单独指定属性缓动函数:
  1. jQuery('#foo').animate({
  2. left: 500,
  3. top: 500
  4. }, {
  5. duration: 2000,
  6. specialEasing: {
  7. top: 'easeOutBounce'
  8. }
  9. });

复制代码

5. 新的Live事件!

1.4添加了对"submit”,"change”,"focus”, 和"blur”事件的委托支持。在jQuery中,我们可以使用".live()”方法去委托事件。这在你需要注册事件到大量元素中或新的元素需要不断的被添加(使用".live()”会比不断的重新绑定事件更高效)将会很有用。

但是,注意!如果你需要委托"focus”和"blur”事件的时候,你必须使用"focusin”和"focusout”事件名称!

  1. jQuery('input').live('focusin', function(){
  2. //具体操作
  3. });

复制代码

6. 控制函数的上下文

jQuery 1.4提供了一个新的叫"proxy”的函数,它在jQuery命名空间下。该函数需要两个参数,不管是代码域还是方法名,或者是函数和其所处的代码域。 t"this”关键字在JavaScrip中是相当难掌握的。有时候你可能期待它指的是你之前创建的某个对象,而不是一个你可能没想到的元素。

举例说明,假设我们有一个"app”对象,它有两个属性,一个是"clickHandler”方法, 另外一个则是一个config对象。

  1. var app = {
  2. config: {
  3. clickMessage: '你好!'
  4. },
  5. clickHandler: function() {
  6. alert(this.config.clickMessage);
  7. }
  8. };

复制代码

当我们调用如"app.clickHandler()"时,"clickHandler"会将"app”作为其上下文。这意味着在这里"this"关键字将允许其访问"app"。这在我们简单调用下面函数时没什么问题:
  1. app.clickHandler(); // "你好!" 消息触发

复制代码

让我们试试将其作为事件绑定会有什么情况:
  1. jQuery('a').bind('click', app.clickHandler);

复制代码

当我们点击一个链接的时候什么都不会发生,函数不会工作。这是因为 jQuery(其他任何正常的事件模型同样如此)默认会把目标元素a设置成为事件的上下文。即"this”现在其实是指刚刚被点击过的元素a。但我们实际上并不想这样子的。我们期待"this”应该被设置为"app”.在jQuery 1.4中实现这个再简单不过了:
  1. jQuery('a').bind(
  2. 'click',
  3. jQuery.proxy(app, 'clickHandler')
  4. );

复制代码

现在无论什么时候一个链接被点击到,"你好"的消息都会被触发了!

proxy函数会返回一个你的函数被"包装过"之后的对象,在该对象中,"this”被设置成任意你指定的对象。这在其他的情景下同样有用,如传递回调函数给其他的jQuery对象或者一些插件的时候。

7. 在动画中添加停顿

现在你可以再你的动画队列中添加停顿效果了。事实上,任何队列中都可以添加该函数,但最常用的情况应该还是在使用"fx”队列的时候。这允许你在多个动作中间添加暂停而不需要通过回调函数去调用"setTimeout"。".delay()" 函数的第一个参数是你想停顿的毫秒数。

  1. jQuery('#foo')
  2. .slideDown() // Slide down
  3. .delay(200) // 停顿 200 ms
  4. .fadeIn(); // Fade in

复制代码

如果你想给其他不是默认的"fx”的队列也添加停顿的话,这时候,你需要将队列名作为第二个参数传递给".delay()"。

8. 检查元素是否拥有某对象

通过".has()”方法,jQuery 1.4使得检查一个元素(或者集合)是不是有某对象变得相当简单。从程序角度看,它和jQuery的selector过滤器":has()”是一样的。该方法会返回在当前集合中所有包含有至少一个符合条件的元素数组。

  1. jQuery('div').has('ul');

复制代码

上面方法会返回所有包含有UL元素的DIV元素数组。在这种情况下,你可能会更倾向于简单使用选择器的过滤器(":has()"), 但当你需要通过代码过滤一个数组的时候,该方法仍会很有用。

1.4同样在jQuery命名空间下添加了新的"contains"函数。这是一个低级的函数,它接受两个DOM节点作为参数。它会返回一个布尔值来表示后面一个元素是否在前面一个元素中存在。如:

  1. jQuery.contains(document.documentElement, document.body);
  2. // 返回true - <body>在<html>存在

复制代码

9. 去掉元素的包装

".warp()”已经在jQuery中有段日子了,现在跟它对应的".unwrap()”方法也被加进到1.4中了。这个方法刚好跟warp()方法相反。假设有下面的DOM结构:

  1. <div>
  2. <p>Foo</p>
  3. </div>

复制代码

我们可以用下面的函数去掉段落元素的外层:
  1. jQuery('p').unwrap();

复制代码

最终的DOM结构如下: 注意,这个方法处理比较简单,它会移掉任何元素的父节点。

10. detach() vs remove()

新的".detach()”方法允许你从DOM中移掉元素,这跟".remove()”很像。但与".remove()”有本质不同的是"detach()”不会将jQuery赋给该元素的数据也给注销掉。这包含通过".data()”和其他任意的通过jQuery的事件系统添加的事件等数据。

如果你想从DOM中移除某个元素,但你又可能需要在后面的某个时候把该元素重新添加到DOM中的时候这个函数将会很有用,这时候该元素的事件和其他的数据都会被保留下来。

  1. var foo = jQuery('#foo');
  2. // 绑定一个重要的事件
  3. foo.click(function(){
  4. alert('Foo!');
  5. });
  6. foo.detach(); // 从 DOM中移除事件
  7. // … 其他操作
  8. foo.appendTo('body'); // 将元素重新加入到 DOM
  9. foo.click(); // 弹出 "Foo!"

复制代码

11. index(…) 加强

jQuery 1.4中我们有两种使用".index()”方法的方式。首先,你可以仅仅将一个元素自身作为参数,这样你可以得到该元素在当前集合中所处的索引位置值。

如果不设置参数的话,现在会返回该元素的兄弟节点。因此,假设有下面的DOM结构:

  1. <ul>
  2. <li>苹果</li>
  3. <li>香蕉</li>
  4. <li>葡萄</li>
  5. <li>草莓</li>
  6. <li>例子</li>
  7. <li>桃子</li>
  8. </ul>

复制代码

当一个节点被点击的时候,你如果想找到在所有的节点集合中被单击的节点的位置,你可以这样写:
  1. jQuery('li').click(function(){
  2. alert( jQuery(this).index() );
  3. });

复制代码

jQuery 1.4还允许你指定一个选择器作为".index()”的第一个参数,这样它会返回该元素在选择器中产生的元素集合中的位置。

最后需要注意的是,如果该元素在集合中存在的话,该函数会返回一个其位置的整数,如果不存在,则返回-1。

12. DOM 操作的方法支持回调函数

大部分对DOM进行操作的函数现在都支持传递函数作为唯一参数了(如果是".css()”和".attr()”的情况的话,它会作为第二参数)。该函数会在集合中的每个元素上都执行一次,从而确定哪些应作为该函数的实际值提供给回调函数调用。

下面给出所有支持该功能的函数列表:

  1. [list]
  2. [*][url=http://api.jquery.com/after]after[/url]
  3. [*][url=http://api.jquery.com/before]before[/url]
  4. [*][url=http://api.jquery.com/append]append[/url]
  5. [*][url=http://api.jquery.com/prepend]prepend[/url]
  6. [*][url=http://api.jquery.com/addClass]addClass[/url]
  7. [*][url=http://api.jquery.com/toggleClass]toggleClass[/url]
  8. [*][url=http://api.jquery.com/removeClass]removeClass[/url]
  9. [*][url=http://api.jquery.com/wrap]wrap[/url]
  10. [*][url=http://api.jquery.com/wrapAll]wrapAll[/url]
  11. [*][url=http://api.jquery.com/wrapInner]wrapInner[/url]
  12. [*][url=http://api.jquery.com/val]val[/url]
  13. [*][url=http://api.jquery.com/text]text[/url]
  14. [*][url=http://api.jquery.com/replaceWith]replaceWith[/url]
  15. [*][url=http://api.jquery.com/css]css[/url]
  16. [*][url=http://api.jquery.com/attr]attr[/url]
  17. [*][url=http://api.jquery.com/html]html[/url]
  18. [/list]

复制代码

通过回调函数,你可以通过"this”访问数组中的当前元素,还可以通过第一个参数得到它在数组中的位置。
  1. jQuery('li').html(function(i){
  2. return '该列表中的索引位置: ' + i;
  3. });

复制代码

同样,你也可以通过上面的某些方法得到另外一个参数,如果你调用一个setter方法(如".html()”或".attr(‘href’)")你就可以直接访问当前的值了。如:
  1. jQuery('a').attr('href', function(i, currentHref){
  2. return currentHref + '?foo=bar';
  3. });

复制代码

正如上面看到的,在使用".css()" 和 ".attr()" 方法时,因为第一个参数需要被用作指定那些你需要设置或改变的属性名,你需要将回调函数作为第二参数。
  1. jQuery('li').css('color', function(i, currentCssColor){
  2. return i % 2 ? 'red' : 'blue';
  3. });

复制代码

13. 对象类型判断

jQuery 1.4添加了两个新的方法(直接放到了jQuery命名空间下面)以方便我们来判断当前处理的对象的类型。

首先是方法"isEmptyObject”,顾名思义,这个函数会返回一个布尔值来表明传递的对象是不是空对象(缺乏属性--无论是对象自身还是继续的对象)。其次是方法"isPlainObject”,它会返回一个布尔值来表明操作的对象是否是一个简单的js对象(指通过"{ }"或者"new Object”创建的对象)。

  1. jQuery.isEmptyObject({}); // true
  2. jQuery.isEmptyObject({foo:1}); // false
  3. jQuery.isPlainObject({}); // true
  4. jQuery.isPlainObject(window); // false
  5. jQuery.isPlainObject(jQuery()); // false

复制代码

14. Closest(…) 增强

jQuery的".closest()”方法现在可以接受一组选择器了。如果开发人员想遍历一个元素的祖先,并在其中查找离其最近的那些符合某些特征的节点的时候,这会很有用。

另外,该函数现在也接受将上下文作为第二参数了。这意味着你现在可以控制你想在DOM中遍历的元素范围了。虽然这两种情况我们一般很少用到,不过它们在jQuery内部被很好的使用。

15. 新的事件! focusIn 和focusOut

上文已经提到,为了委托"focus”和"blur”事件你需要这些新的事件,它们是"focusin”和"focusout”。这些新的事件将允许你在一个元素或其子元素获取焦点的时候进行相应操作。

  1. jQuery('form')
  2. .focusin(function(){
  3. jQuery(this).addClass('focused');
  4. });
  5. .focusout(function(){
  6. jQuery(this).removeClass('focused');
  7. });

复制代码

同时应该注意的是这两个事件都不是按冒泡顺序传递,它们将按捕获顺序触发。这意味着最外层的(也即祖先)元素会在实际节点事件触发前被触发。