一月 3rd, 2010

jQuery快速上手

No Comments, 前端开发, by admin.
这份指南是对jQeury库的介绍,它需要对JavaScript和文档对象模型(DOM)有基本的了解。它从零开始讲解并解释必要的细节。
该指南讲到了一个简单的hello world例子,selector和event基础,AJAX,FX以及使用和创作plugins。
这份指南不包含”click me”例子,只提供”copy me”代码的意图是激发你来自己尝试例子。Copy一个例子,看看它做什么,并修改它。

目录
1 Setup
2 Hello jQuery
3 Find me: 使用selectors和events
4 Rate me: 使用Ajax
5 Animate me: 使用Effects
6 Sort me: 使用tablesorter plugin
7 Plug me: 写你自己的plugins
8 Next steps

Setup
我们首先需要jQuery库的copy来开始。最新的版本可以在http://docs.jquery.com/Downloading_jQuery找到,这份指南也提供一个基本包来下载。
jQuery Starterkit
下载该文件并解压,用你最喜欢的编辑器打开starterkit.html和custom.js并用浏览器打开starterkit.html。
现在我们准备好了开始著名的”Hello world”例子的任何事情。
本节里有意思的链接:
jQuery Starterkit
Downloading jQuery

Hello jQuery
当我们使用jQuery时所做的几乎任何事情都会读取或操作文档对象模型(DOM),我们需要确认一旦DOM准备好了则我们开始添加events等东西。
为了做这件事,我们为document注册一个ready事件。

Java代码
$(document).ready(function() {
 // do stuff when DOM is ready
});

在该方法里放入一个alert不会有多大意义,因为alert不需要DOM成功loaded。所以让我们尝试一些更复杂的东西:当点击该链接时显示一个alert。

Java代码
$(document).ready(function() {
 $(“a”).click(function() {
  alert(“Hello world!”);
 });
});

这将在你点击该链接时显示alert。
让我们看看我们做了什么:$(“a”)是一个jQuery selector,在这里,它选择所有的a元素。$本身为jQuery”类”的别名,因此$()构建了一个jQuery对象。
我们下一步调用的click()方法为该jQuery对象的一个方法。它绑定了一个click事件到所有被选择的元素(在这里为一个单独的anchor元素)并当事件发生时执行
提供的方法。
这与下面的代码类似:

Java代码
<a href=”" onclick=”alert(‘Hello world’)”>Link</a>
 

区别非常明显:我们不需要为每个单独的元素写一个onclick。对结构(HTML)和行为(JS)我们有一个清晰的分离,就像我们使用CSS来分离结构和呈现。
了解了这些,我们来对selectors和events做一些更多的东西。
本节里有意思的链接:
jQuery Base
jQuery Expressions
jQuery Basic Events

Find me: 使用selectors和events
jQuery提供了两种方式来选择元素。第一种使用作为字符串传递给jQuery构造器的CSS和XPath选择器的联合(例如$(“div > ul a”))。第二种使用jQuery对象的
一些方法。两种方式可以联合。
我们选择并修改我们的starterkit里的第一个排序列表来尝试一些选择器。
我们以选择列表本身开始。列表有一个ID “orderedlist”。在传统的JavaScript里,你可以通过使用document.getElementById(“orderedlist”)来使用它。使用
jQuery的话,我们像这样做:

Java代码
$(document).ready(function() {
 $(“#orderedlist”).addClass(“red”);
});

starterkit提供了一个带有一个class为”red”的简单的添加一个红色背景的stylesheet。因此,当你在浏览器里reload页面时,你应该看到第一个ordered list
将拥有一个红色背景。第二个list则没变。
现在让我们添加一些classes到该list的子元素中。

Java代码
$(document).ready(function() {
 $(“#orderedlist > li”).addClass(“blue”);
});

这将选择id为orderedlist的元素的所有子li元素并为其添加class “blue”。
现在看看一个更复杂的:我们希望当用户hover到该list的最后一个li元素时添加和删除class。

Java代码
$(document).ready(function() {
 $(“#orderedlist li:last”).hover(function() {
  $(this).addClass(“green”);
 },function() {
  $(this).removeClass(“green”);
 });
});

有许多其他类似于CSSXPath语法的选择器。更多的例子以及一个所有可得到的表达式的列表可以在这里找到。
对每个可得到的onxxx事件,像onclick,conchange,onsubmit,都有一个jQuery等价物。一些其他的事件,像ready和hover,被提供来作为方法方便某些任务。
你可以在jQuery Events Documentation里找到完整的事件列表。
使用这些selectors和events你已经可以做许多事情,但是这里还有一个。

Java代码
$(document).ready(function() {
 $(“#orderedlist”).find(“li”).each(function(i) {
  $(this).append(” BAM! ” + i);
 });
});
 
find()允许你对已经选择的元素做更深的子搜索,因此$(“#orderedlist”).find(“li”)几乎和$(“#orderedlist li”)一样。
each()对每个元素迭代并允许更多的处理。大多数方法,像addClass(),自己使用each()。
在这个例子中,append()用来在每个元素的末尾添加一些文本。
另外一个你经常面对的任务是在jQuery没有cover的DOM元素上调用方法。考虑一个你想在通过AJAX成功提交后reset它的form。
Java代码
$(document).ready(function() {
 // use this to reset a single form
 $(“#reset”).click(function() {
  $(“#form”).reset();
 });
});

这些代码选择ID为”form”的元素并对每个选择的元素调用reset()。当你有多于一个form时,你也可以这样做:

Java代码
$(document).ready(function() {
 // use this to reset several forms at once
 $(“#reset”).click(function() {
  $(“form”).reset();
 });
});

这将在你的document里选择所有的forms,迭代它们并对每个调用reset()。
另一个你可能面临的问题是不选择某一个元素。jQuery为它提供filter()和not()。filter()通过满足该filter表达式来减少选择的元素,not()则相反删除掉
所有满足该表达式的元素。考虑一个unordered的list,你想选择所有没有ul子元素的li元素。

Java代码
$(document).ready(function() {
 $(“li”).not(“[ul]“).css(“border”, “1px solid black”);
});
 
这将选择所有的li元素并删除有ul子元素的元素。因此所有的li元素将有一个border,除了有ul子元素的。[expression]语法来自XPath并且可以用来被子元素
和属性filter。可能你想选择所有的有一个name属性的anchors:
Java代码
$(document).ready(function() {
 $(“a[@name]“).background(“#eee”);
});

这将对所有的有一个name属性的anchor元素添加一个background颜色。
比通过name选择anchors更常用的是,你可能需要通过它们的”href”属性选择anchors。由于浏览器的行为不一致这可能返回不同的”href”值(注意:这个问题最近
在jQuery中解决了,只要在1.1.1版本后都可以)。为了只匹配一部分值,我们可以使用包含选择”*=”来代替等于”=”:

Java代码
$(document).ready(function() {
 $(“a[@href*=/content/gallery]“).click(function() {
  // do something with all links that point somewhere to /content/gallery
 });
});

到目前为止,所有的selectors用来选择子或filter当前选择。还有你需要选择前一个或下一个元素的情况,即所谓的siblings。考虑FAQ页面,所有的答案首先
隐藏,而当问题点击时显示。该jQuery代码为:

Java代码
$(document).ready(function() {
 $(‘#faq’).find(‘dd’).hide().end().find(‘dt’).click(function() {
  $(this).next().slideToggle();
 });
});

这里我们使用链来减少代码量并得到更好的性能,因为’#faq’只选择了一次。
通过使用end(),第一个find()不会结束,则我们可以对#faq元素继续搜索下一个find(),而不是对dd子元素操作。
在click处理器即传递给click()方法的function里,我们使用$(this).next()来从当前dt查找下一个sibling。这允许我们快速选择紧跟在点击的问题后的答案。
除了sibling,你也可以选择父元素(对属性XPath的人而言为所谓的ancestors)。你可能想对用户hover的链接的父paragraph高亮,试试这个:

Java代码
$(document).ready(function() {
 $(“a”).hover(function() {
  $(this).parents(“p”).addClass(“highlight”);
 },function() {
  $(this).parents(“p”).removeClass(“highlight”);
 });
});

对于所有hover的anchor元素,搜索它的父paragraph并添加和删除一个”highlight” class。
让我们继续之前了解一下:jQuery很多时候是让代码变得更短而更容易阅读和维护。以下是一个$(document).ready(callback)记号的捷径:

Java代码
$(function() {
 // code to execute when the DOM is ready
});

对于Hello world!例子,我们可以这样写:

Java代码
$(function() {
 $(“a”).click(function() {
  alert(“Hello world!”);
 });
});

现在有了基本知识后,我们想explore一些其它方面,开始使用AJAX。
本节里有意思的链接:
jQuery API documentation
Visual jQuery – A catgorized browsable API documentation.
jQuery Selectors
jQuery Events
jQuery DOM Traversing

Rate me: 使用Ajax
在这个部分我们写一个小Ajax程序,它允许用户rate something,就像在youtube.com上做的一样。
我们需要一些服务器端代码来完成这个。我的例子使用php文件来读”rating”参数并返回ratings的数量和平均的rating。看看rate.php的服务器端代码。
我们想让这个例子用Ajax来工作,因此我们用jQuery生成一些必要的东西并加到一个ID为”rating”的容器里

Java代码

$(document).ready(function() {
 // generate markup
 $(“#rating”).append(“Please rate: “);

 for ( var i = 1; i <=5; i++ )
  $(“#rating”).append(“<a href=’#'>” + i + “</a>”);

 // add markup to container and applier click handlers to anchors
 $(“$raing a “).click(function(e)
  // send request
  $.post(“rate.php”, {rating: $(this).html()}, function(xml) {
   // format and output result
   $(“#rating”).html(
    ”Thanks for rating, current average: ” +
    $(“average”, xml).text() +
    ”, number of votes: ” +
    $(“count”, xml).text()
   );
  });

  // stop normal link click
  return false;
 });
});

这个代码片段生成5个anchor元素并把它们添加到id为”rating”的容器元素。最后,对容器里的每个anchor添加一个click处理器。当点击anchor时,一个以anchor
的内容为参数的post请求发送到rate.php。结果作为一个XML返回,并添加到容器代替anchors。
如果你手头上没有一个安装的PHP服务器,你可以看看一个online example。对于一个非常好的甚至不用JavaScript工作的rating系统的例子,访问softonic.de
点击”Kurz bewerten!”
jQuery的Ajax方法的更多的文档可以在Ajax Documentation或者用Ajax开发的Visual jQuery上找到。
当通过Ajax载入内容时遇到的一个非常常见的问题是:当添加事件处理器到你的文档时,如果事件处理器也适合载入的内容,则你必须在内容载入之后也添加这些
处理器。为了防止代码重复,你可以写一个方法代理。例如:

Java代码
function addClickHandlers() {
 $(“a.remote”, this).click(function() {
  $(“#target”).load(this.href, addClickHandlers);
 });
}
$(document).ready(addClickHandlers);

现在一旦当DOM为ready以及每次当一个用户点击class为remote的链接并且内容完成载入后addClickHandlers都会被调用。
注意$(“a.remote”, this)查询,this传递过来作为一个context:对于document ready事件,this表示document,则它搜索整个document中class为remote的anchors
当addClickHandlers用来作为load()的回调时,this表示另一个不同的元素:在这个例子中,表示id为target的元素。这防止了click事件一次又一次的赋给同一
链接,从而最终导致崩溃。
回调的另一个常见的问题是参数。你已经指定了你的回调但是需要传递一个额外的参数。达到次目标的最简单的方式是在另一个方法里包装回调:

Java代码

// get some data
var foobar = …;

// specify handler, it needs data as a parameter
function handler(data) {
 // …
}

// add click handler and pass foobar!
$(‘a’).click(function() {
 handler(foobar);
});

// if you need the context of the original handler, use apply:
$(‘a’).click(function() {
 handler.apply(this, [foobar]);
});

使用Ajax我们可以cover许多”Web 2.0″。既然我们已经看了一些基本的Ajax,让我们添加一些简单的effects和animations到页面中。
本节有意思的链接:
jQuery Ajax Documentation
jQuery API – 包含所有的jQuery方法的描述和例子
Thick Box – 一个使用jQuery来加强著名的lightbox的jQuery插件

Animate me: 使用Effects
可以使用jQuery的show()和hide()构建的简单的animations。

Java代码
$(document).ready(function() {
 $(“a”).toggle(function() {
  $(“.stuff”).hide(’slow’);
 },function() {
  $(“.stuff”).show(‘fast’);
 });
});

你可以使用animate()创建任何animations的联合。例如,一个具有fade的slide:

Java代码
$(document).ready(function() {
 $(“a”).toggle(function() {
  $(“.stuff”).animate({ height: ‘hide’, opacity: ‘hide’ }, ’slow’);
 },function() {
  $(“.stuff”).animate({ height: ’show’, opacity: ’show’ }, ’slow’);
 });
});

更炫的effects可以在interface plugin collection找到。该站点提供demos和文档。虽然Interface在jQuery的插件列表的最前面,还有许多其他的插件。下一
部分显示了怎样使用tablesorter插件。
本节有意思的链接:
jQuery Effects Documentation
Interface plugin

Sort me: 使用tablesorter plugin
tablesorter插件允许在客户端对表格排序。你只需引入jQuery和插件,并告诉插件哪个表格是你想排序的。
添加以下内容到starterkit.html(下jquery引入的下面)来尝试该例子:

Java代码
<script src=”lib/jquery.tablesorterjs”></script>

引入了该插件后,你可以像这样调用它:

Java代码
$(document).ready(function() {
 $(“#large”).tableSorter();
});
 
试着点击table的头部并看看它怎样在第一次升序排序以及第二次降序排序。该表格可以使用一些行高亮,我们可以通过传递一些选项来添加这个:
Java代码
$(document).ready(function() {
 $(“#large”).tableSorter({
  // Class names for striping supplied as a array.
  stripingRowClass: ['odd', 'even'],
  // Stripe rows on tableSorter init
  stripeRowsOnStartUp: true
 });
});

tablesorter homepage有更多关于可得到的选项的例子和文档。
大多数插件可以像这样使用:引入插件文件并在某些元素上调用插件方法,传递一些选项设置来定制插件。
一个可得到的up-to-date插件列表可以在jQuery Plugin site找到。
当你使用jQuery的越频繁,你可能发现把你自己的代码打包成一个插件非常有用,可以为你自己或者你的公司重用它,或者与社区分享。下一节讲述了怎样构建
一个插件。
本节有意思的链接:
Plugins for jQuery
Tablesorter Plugin

Plug me: 写你自己的plugins
为jQuery写你自己的插件非常简单。如果你遵循下面的规则,则其他人集成你的插件也非常简单。
插件命名
为你的插件找一个名字,让我们称我们的例子为”foobar”。创建一个名为jquery.[yourpluginname].js文件,例如,jquery.foobar.js。
添加一个自定义方法
通过扩展jQuery对象来创建一个或多个插件方法,例如:

Java代码
jQuery.fn.foobar = function() {
 // do something
};
 
则通过执行下面代码就可以得到使用上面的插件:
Java代码
$(…).foobar();

默认设置:
创建可以被用户更改的默认设置,例如:

Java代码
jQuery.fn.foobar = function(options) {
 var settings = jQuery.extend({
  value: 5, name: “pete”, bar: 655
 }, options);
};
 

 你可以调用该插件而不带选项,即使用默认配置:
Java代码

$(“…”).foobar();
或者带一些选项:
Java代码 

$(“…”).foobar({ value: 123, bar: 9 });
文档
如果你发表你的插件,你应该也提供一些例子和文档。有许多插件可以作为很好的参考。
现在你应该具有了写插件的基本知识。让我们来写一个我们自己的插件。
Checkbox插件
很多人使用jQuery来处理表单时会问到radio buttons或checkboxes的checking和unchecking。他们常用这样的代码:

Java代码
$(“input[@type='checkbox']“).each(function() {
 this.checked = true;
 this.checked = false; // or, to uncheck
 this.checked = !this.checked; // or, to toggle
});

无论何时你的代码里有一个each时,你可能想重写它为一个插件,非常直接:

Java代码
jQuery.fn.check = function() {
 return this.each(function() {
  this.checked = true;
 });
}; 

现在该插件可以使用了:

Java代码
$(“input[@type='checkbox']“).check();

现在你也可以为uncheck()和toggleCheck()写插件了。但是我们通过扩展我们的插件来接收一些选项来替代。

Java代码
jQuery.fn.check = function(mode) {
// if mode is undefined, use ‘on’ as default
var mode = mode || ‘on’;

return this.each(function() {
switch(mode) {
case ‘on’:
this.checked = true;
break;
case ‘off’:
this.checked = false;
break;
case ‘toggle’:
this.checked = !this.checked;
break;
}
});
};

我们可以提供选项”on”,”off”和”toggle”或者默认无选项,例如:

Java代码
$(“input[@type='checkbox']“).check();
$(“input[@type='checkbox']“).check(‘on’);
$(“input[@type='checkbox']“).check(‘off’);
$(“input[@type='checkbox']“).check(‘toggle’);

可选设置
写多于一个设置选项会变得复杂,因为如果用户想省略第一个参数而只使用第二个参数时他必须传递一个null值。
上一节中对tablesorter的使用证明了使用一个对象来解决这个问题。用户可以省略所有的参数或者为每个他想override的设置传递一个具有键/值对的对象。
出于练习,你可以尝试重写第4节的Voting代码为一个插件。插件骨架可能看起来像这样:

Java代码
jQuery.fn.rateMe = function(options) {
// instead of slecting a static container with
// $(“#rating”), we now use the jQuery context
var container = this;

var settings = jQuery.extend({
url: “rate.php”
// put more defaults here
}, options);

// … rest of the code …

// if possible, return “this” to not break the chain
return this;
});

则可以允许你像这样允许该插件:

Java代码
$(…).rateMe({ url: “test.php” });

Next steps
如果你计划开发更多的JavaScript,你应该考虑称为FireBug的Firefox插件。它提供一个console(很好的替代alerts),一个debugger和其他有用的stuff来为
JavaScript开发。
如果你有不能解决的问题、想分享的主意或者只是需要用jQuery表达你的看法,请自由舒畅的post给jQuery mailing list
对于与本指南相关的任何东西请在我的blog上post一个comment或者直接联系我。
Whats left…Thanks a lot to John Resig for this greate library! Thanks to the jQuery community for providing John with enough coffee
and everything else!

事件与事件对象 

一.摘要

  事件是脚本编程的灵魂. 所以本章内容也是jQuery学习的重点. 本文将对jQuery中的事件处理以及事件对象进行详细的讲解. 

  二.前言

  本篇文章是至今为止本系列内容最多的一篇, 足以可见其重要性.  大家反映要多列举示例. 我会在时间允许的情况下尽量多列举示例. 真正的投入生产使用的实例暂时还无法加入到文章中, 但是可能最后我会列举一些作品供大家借鉴. 另外本人水平有限, 因为我不是UI设计师. 文章可能有错误的地方, 希望大家帮忙指出, 一起学习一起进步. 在技术的世界里我们是没有任何利益瓜葛. 希望大家都抱着彼此鼓励的心态, 对于回复中的激进评论我也都会考虑, 但是希望能够彼此尊重, 保护博客园这片程序员的净土!

  三.事件与事件对象

  曾经在我的 “Javascript公共脚本库系列(二): 添加事件多播委托的方法” 和 “Javascript公共脚本库系列(三): 格式化事件对象/事件对象详解” 两篇文章中,  曾讲解过javascript中的事件和事件对象.

  首先看一下我们经常使用的添加事件的方式:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>javascript中的事件</title>

  <script type="text/javascript" src="scripts/jquery-1.3.2-vsdoc2.js"></script>

  <script type="text/javascript">
    $(function()
    {
      document.getElementById("testDiv2").onclick = showMsg;
    })

    function showMsg(event)
    {
      alert("!!!");
    }    
  </script>
</head>
<body>
  <div id="testDiv1" onclick="showMsg();">单击事件 1</div>
  <div id="testDiv2">单击事件 2</div>
</body>
</html>
background-color: #ffffff;

/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{

background-color: #f4f4f4;

width: 100%;

margin: 0em;
}
.csharpcode .lnum { color: #606060; }

  我们最常使用为元素添加onclick元素属性的方式添加事件.

  为testDiv2的添加onclick事件的方式是修改Dom属性.

  在上一章中已经说明了什么是元素属性, 什么是Dom属性.这两种方式的效果相同. 当单击div时会显示提示框.

  请注意, 虽然效果相同, 但是并不等效.

document.getElementById("testDiv2").onclick = showMsg;

  等效于:

<div id="testDiv1" onclick="alert("!!!");">单击事件 1</div>

  注意两者的区别了吗?  我们常用的修改元素属性添加事件的方式, 实际上是建立了一个匿名函数:

document.getElementById("testDiv1").onclick = function(event)
{
  alert("!!!");
};

  这个匿名函数的签名和我们手写的showMsg签名相同, 所以可以把showMsg直接赋值给onclick.

  这种方式的弊端是:

  1. 只能为一个事件绑定一个事件处理函数.  使用”=”赋值会把前面为此时间绑定的所有事件处理函数冲掉.

  2. 在事件函数(无论是匿名函数还是绑定的函数)中获取事件对象的方式在不同浏览器中要特殊处理:

  IE中,事件对象是window对象的一个属性.事件处理函数必须这样访问事件对象:

    obj.onclick=function()
    {
      var oEvent = window.event;
    }

  在DOM标准中,事件对象必须作为唯一参数传给事件处理函数:

    obj.onclick=function()
    {
      var oEvent = arguments[0];
    }

  除了使用argument[0]访问此参数, 我们也可以指定参数名称,上面的代码等同于:

    obj.onclick=function(oEvent)
    {
      
    }

  目前兼容DOM的浏览器有Firefox,Safari,Opera,IE7等.

  3. 添加多播委托的函数在不同浏览器中是不一样的.

  下面是在”Javascript公共脚本库系列(二): 添加事件多播委托的方法”文章中,  提供的兼容多浏览器添加多播委托的方法:

//统一的为对象添加多播事件委托的方法
/* 
  参数说明:
  oTarget   : 要添加事件的对象.比如"document".
  sEventType : 事件类型.比如单击事件"click".
  fnHandler  : 发生事件时调用的方法. 比如一个静态函数"hideCalendar"
  
  使用举例:
  //单击页面的任何元素,只要没有取消冒泡,都可以关闭日历控件
  var cf = document.getElementById("CalFrame");
  if( cf != null && hideCalendar != null )
  {
    ScriptHelper.addEventListener( document, "click", hideCalendar );
  }
*/
scriptHelper.prototype.addEventListener = function(oTarget, sEventType, fnHandler)
{
  if( oTarget.addEventListener )//for dom
  {
    oTarget.addEventListener( sEventType, fnHandler, false )
  }
  else if( oTarget.attachEvent )//for ie
  {
    oTarget.attachEvent( "on" + sEventType, fnHandler);
  }
}

  所以我们首先应该摒弃<div onclick=”…”></div>这种通过修改元素属性添加事件的方式. 尽量使用添加多播事件委托的方式为一个事件绑定多个事件处理函数, 比如为document对象的单击事件添加一个关闭弹出层的方法, 使用多播就不会影响document对象原有的事件处理函数.

  四. jQuery中的事件

  有了jQuery,  我们有了处理对象事件的一系列函数.  上面基础知识还是要懂, 但是再也不用自己去实现处理多播事件委托的函数了.  正所谓有了jQuery, 天天喝茶水. 下面是在jQuery中最常使用的bind()方法举例:

$("#testDiv4").bind("click", showMsg);

  我们为id是testDiv4的元素, 添加列click事件的事件处理函数showMsg.

  使用jQuery事件处理函数的好处:

  1. 添加的是多播事件委托.  也就是为click事件又添加了一个方法, 不会覆盖对象的click事件原有的事件处理函数.

      $("#testDiv4").bind("click", function(event) { alert("one"); });
      $("#testDiv4").bind("click", function(event) { alert("two"); });

  单击testDiv4对象时, 依次提示”one”和”two”.

  2. 统一了事件名称. 

  添加多播事件委托时, ie中是事件名称前面有”on”. 但是使用bind()函数我们不用区分ie和dom ,  因为内部jQuery已经帮我们统一了事件的名称.

  3. 可以将对象行为全部用脚本控制.

  让HTML代码部分只注意”显示”逻辑. 现在的趋势是将HTML的行为, 内容与样式切分干净. 其中用脚本控制元素行为, 用HTML标签控制元素内容, 用CSS控制元素样式. 使用jQuery事件处理函数可以避免在HTML标签上直接添加事件.

  下面是基础的jQuery事件处理函数:

  事件处理  Event Handling:

名称 说明 举例
 

  bind( type, [data], fn )

为每一个匹配元素的特定事件(像click)绑定一个事件处理器函数。 当每个段落被点击的时候,弹出其文本: 

$("p").bind("click", function(){
  alert( $(this).text() );
});

one( type, [data], fn ) 为每一个匹配元素的特定事件(像click)绑定一个一次性的事件处理函数。 当所有段落被第一次点击的时候,显示所有其文本: 

$("p").one("click", function(){
  alert( $(this).text() );
});

trigger( event, [data] ) 在每一个匹配的元素上触发某类事件。 

  这个函数也会导致浏览器同名的默认行为的执行。比如,如果用trigger()触发一个’submit’,则同样会导致浏览器提交表单。如果要阻止这种默认行为,应返回false。

  你也可以触发由bind()注册的自定义事件

给一个事件传递参数: 

$("p").click( function (event, a, b) {
  // 一个普通的点击事件时,a和b是undefined类型
  // 如果用下面的语句触发,那么a指向"foo",而b指向"bar"
} ).trigger("click", ["foo", "bar"]);

triggerHandler( event, [data] ) 这个特别的方法将会触发指定的事件类型上所有绑定的处理函数。但不会执行浏览器默认动作. 如果你对一个focus事件执行了 .triggerHandler() ,浏览器默认动作将不会被触发,只会触发你绑定的动作: 

$("#old").click(function(){
  $("input").trigger("focus");
});
$("#new").click(function(){
  $("input").triggerHandler("focus");
});
$("input").focus(function(){   $("<span>Focused!</span>").appendTo("body").fadeOut(1000); });

unbind( type, fn ) bind()的反向操作,从每一个匹配的元素中删除绑定的事件。 

  如果没有参数,则删除所有绑定的事件。

  你可以将你用bind()注册的自定义事件取消绑定。

  如果提供了事件类型作为参数,则只删除该类型的绑定事件。

  如果把在绑定时传递的处理函数作为第二个参数,则只有这个特定的事件处理函数会被删除。

把所有段落的所有事件取消绑定: 

$("p").unbind()

  将段落的click事件取消绑定:

$("p").unbind( "click" )

  删除特定函数的绑定,将函数作为第二个参数传入:

var foo = function () {
  // 处理某个事件的代码
};
$("p").bind("click", foo); // ... 当点击段落的时候会触发 foo
$("p").unbind("click", foo); // ... 再也不会被触发 foo

  五.常用事件函数举例

  1.bind( type, [data], fn ) 函数举例

  bind()是最常使用的函数,  注意方法签名上data参数, 可以在事件处理之前传递一些附加的数据:

function handler(event) {
 alert(event.data.foo);
}
$("p").bind("click", {foo: "bar"}, handler) 

  注意event参数的使用. jQuery中统一了事件对象, 将事件对象作为事件处理函数的唯一参数传递.

  data参数我们也要通过event.data 进行访问.  为何要提供data参数呢?

  因为我们经常碰到这样的问题: 希望在事件处理中根据事件源的某些数据进行特殊处理.

  目前网上有两种存在争议的解决方法:

  (1) 使用自定义元素属性存储数据.

  比如:

<div id="testDiv5" customer="customer data 1">获取自定义数据-1</div>

  在事件处理函数中获取数据:

$("#testDiv5").bind("click", function(event) { alert($(event.target).attr("customer")); });

  attr函数是上一讲中的知识, 用于获取元素的”元素属性”, 而且可以获取自定义的元素属性. 单击div后将显示:

从零开始学习jQuery (五) 事件与事件对象

  (2) 使用脚本将数据传递给事件处理函数:

<div id="testDiv6">获取自定义数据-2</div>

  元素没有任何的自定义属性, 添加事件处理函数时将额外的数据传递:

$("#testDiv6").bind("click", { customer: "customer data 2" }, function(event) { alert(event.data.customer) });

  点击div后的结果和方法1相同:

从零开始学习jQuery (五) 事件与事件对象

  方法1便于存储和查找数据. 但是自定义属性通过不W3C验证.

  方法2必须要自己想办法存储数据, 并且要制定规则查找指定元素的数据.

  从”开发人员”的角度方法1要更加简单直观. 但是缺点比较严重. 所以如何取舍请大家自己决定.

  one( type, [data], fn ) 函数和bind一样, 但是只执行一次.

  2. trigger( event, [data] ) 和 triggerHandler( event, [data] )

  虽然为元素绑定了某些事件, 比如click, 但是有时希望在程序中触发这些事件,  这两个函数可以实现此功能.

  主要区别是trigger会出发浏览器默认的动作, 而triggerHandler不会出发.

  通过下面的实例可以明确的区分这两个函数:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>jQuery事件处理:trigger和triggerHandler示例</title>

  <script type="text/javascript" src="scripts/jquery-1.3.2-vsdoc2.js"></script>

  <script type="text/javascript">
    $(function()
    {
      $("#old").click(function()
      {
        $("#divResult").html("");
        $("input").trigger("focus");
      });
      $("#new").click(function()
      {
        $("#divResult").html("");
        $("input").triggerHandler("focus");
      });
      $("input").focus(function() { $("<span>Focused!</span>").appendTo("#divResult"); });
    })
    
  </script>

</head>
<body>
  <button id="old">
    .trigger("focus")</button>
  <button id="new">
    .triggerHandler("focus")</button><br />
  <br />
  <input type="text" value="To Be Focused" />
  <div id="divResult"></div>
</body>
</html>

  当单击”.trigger”按钮时, 会调用两次Focesed, 并且input元素获得了焦点:

从零开始学习jQuery (五) 事件与事件对象

  单击”.triggerHandler”按钮时, 只调用一次,并且input元素没有获得焦点:

从零开始学习jQuery (五) 事件与事件对象

  也就是说, trigger函数出发了浏览器默认的获取焦点的行为,让input元素获得了焦点, 所以再次调用了focus事件处理函数.

  triggerHandler只调用为focus事件绑定的事件处理函数, 而不引发浏览器行为, 所以最后input元素没有获得焦点.

  六.快捷事件 Event Helpers

  BUG提示:jquery-1.3.2-vsdoc2.js 这个最新的官方带智能提示的类库, 无法使用快捷事件, 比如click(), focus(). 使用其他版本的类库则没有问题.

  虽然我们可以使用事件处理函数完成对象事件的几乎所有操作, 但是jQuery提供了对常用事件的封装. 比如单击事件对应的两个方法click()和click(fn)分别用来触发单击事件和设置单击事件.

  设置单击事件:

$("#testDiv").click(function(event) { alert("test div clicked ! "); });

  等效于:

$("#testDiv").bind("click", function(event) { alert("test div clicked ! "); });

  触发单击事件:

$("#testDiv").click();

  等效于

$("#testDiv").trigger("click");

  注意这里等效的是trigger而不是triggerHandler.

  此类方法在jQuery中英文叫做Event Helpers, 我找不到很好的翻译方式, 所以按照功能称其为”快捷方法”,  征集好的翻译名称!

  下面是jQuery的快捷方法列表:

  由于都是都是对应的事件, 所以不再写说明和举例了.

名称 说明 举例
blur( )    
blur( fn )    
change( )    
change( fn )    
click( )    
click( fn )    
dblclick( )    
dblclick( fn )    
error( )    
error( fn )    
focus( )    
focus( fn )    
keydown( )    
keydown( fn )    
keypress( )    
keypress( fn )    
keyup( )    
keyup( fn )    
load( fn )    
mousedown( fn )    
mouseenter( fn )    
mouseleave( fn )    
mousemove( fn )    
mouseout( fn )    
mouseover( fn )    
mouseup( fn )    
resize( fn )    
scroll( fn )    
select( )    
select( fn )    
submit( )    
submit( fn )    
unload( fn )    

  七. 交互帮助方法

  除了基本的实践, jQuery提供了两个和事件相关的帮助方法: hover( over, out ) 和 toggle( fn, fn2, fn3,fn4,… )

  1. hover( over, out ) 

  hover函数主要解决在原始javascript中mouseover和mouseout函数存在的问题, 看下面这个示例:

从零开始学习jQuery (五) 事件与事件对象

  有两个div(红色区域), 里面分别嵌套了一个div(黄色区域). HTML代码如下:

  <div class="outer" id="outer1">
   Outer 1
   <div class="inner" id="inner1">Inner 1</div>
  </div>
  <div class="outer" id="outer2">
   Outer 2
   <div class="inner" id="inner2">Inner 2</div>
  </div>
  <div id="console"></div>

  绑定如下事件:

  <script type="text/javascript">
   function report(event) {
    $('#console').append('<div>'+event.type+'</div>');
   }

   $(function(){
    $('#outer1')
     .bind('mouseover',report)
     .bind('mouseout',report);
    $('#outer2').hover(report,report);
   });
  </script>

  Outer1我们使用了mouseover和mouseout事件,  当鼠标从Outer1的红色区域移动到黄色区域时, 会发现虽然都是在outer1的内部移动, 但是却触发了mouseout事件:

从零开始学习jQuery (五) 事件与事件对象

  很多时候我们不希望出现上图的结果,  而是希望只有鼠标在Outer1内部移动时不触发事件, Outer2使用Hover()函数实现了这个效果:

从零开始学习jQuery (五) 事件与事件对象

  注意这里的事件名称进入叫做”mouseenter”, 离开叫做”mouseleave”, 而不再使用”mouseover”和”mouseleave”事件.

  有经验的开发人员会立刻想到在制作弹出菜单时, 经常遇到这个问题: 为弹出菜单设置了mouseout事件自动关闭, 但是鼠标在弹出菜单内移动时常常莫名其妙触发mouseout事件让菜单关闭. hover()函数帮助我们很好的解决了这个问题.

  2. toggle( fn, fn2, fn3,fn4,… )

  toggle函数可以为对象添加click事件绑定函数,  但是设置每次点击后依次的调用函数。

  如果点击了一个匹配的元素,则触发指定的第一个函数,当再次点击同一元素时,则触发指定的第二个函数,如果有更多函数,则再次触发,直到最后一个。随后的每次点击都重复对这几个函数的轮番调用。

  可以使用unbind(“click”)来删除。

  下面的示例演示如何使用toggle函数:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
  <title>toggle example</title>
  <link rel="stylesheet" type="text/css" href="css/hover.css">

  <script type="text/javascript" src="scripts/jquery-1.3.2-vsdoc2.js"></script>

  <script type="text/javascript">
    $(function()
    {
      $("li").toggle(
       function()
       {
         $(this).css({ "list-style-type": "disc", "color": "blue" });
       },
       function()
       {
         $(this).css({ "list-style-type": "square", "color": "red" });
       },
       function()
       {
         $(this).css({ "list-style-type": "none", "color": "" });
       }
      );
    })
  </script>

</head>
<body>
  <ul>
    <li style="cursor:pointer">click me</li>
  </ul>
</body>
</html>

  结果是每点击一次”click me”变换一次列表符号和文字颜色.

  八.使用jQuery事件对象

  使用事件自然少不了事件对象.  因为不同浏览器之间事件对象的获取, 以及事件对象的属性都有差异, 导致我们很难跨浏览器使用事件对象.

  jQuery中统一了事件对象,  当绑定事件处理函数时,  会将jQuery格式化后的事件对象作为唯一参数传入:

$("#testDiv").bind("click", function(event) { });

  关于event对象的详细说明, 可以参考jQuery官方文档: http://docs.jquery.com/Events/jQuery.Event

  jQuery事件对象将不同浏览器的差异进行了合并, 比如可以在所有浏览器中通过 event.target 属性来获取事件的触发者(在IE中使用原生的事件对象, 需要访问event.srcElement).

  下面是jQuery事件对象可以在扩浏览器支持的属性:

属性名称 描述 举例
 

  type

事件类型.如果使用一个事件处理函数来处理多个事件, 可以使用此属性获得事件类型,比如click. $("a").click(function(event) {
 alert(event.type);
});
 

  target

获取事件触发者DOM对象 $("a[href=http://google.com]").click(function(event) {
 alert(event.target.href);
});
 

  data

事件调用时传入额外参数. $("a").each(function(i) {
 $(this).bind('click', {index:i}, function(e){
   alert('my index is ' + e.data.index);
 });
});
 

  relatedTarget

对于鼠标事件, 标示触发事件时离开或者进入的DOM元素 $("a").mouseout(function(event) {
 alert(event.relatedTarget);
});
 

  currentTarget

冒泡前的当前触发事件的DOM对象, 等同于this. $("p").click(function(event) {
 alert( event.currentTarget.nodeName );
});
 

  结果:P

 

  pageX/Y

鼠标事件中, 事件相对于页面原点的水平/垂直坐标. $("a").click(function(event) {
 alert("Current mouse position: " + event.pageX + ", " + event.pageY );
});
 

  result

上一个事件处理函数返回的值 $("p").click(function(event) {
 return "hey"
});
$("p").click(function(event) {
 alert( event.result );
});
 

  结果:”hey”

 

  timeStamp

事件发生时的时间戳. var last;
$("p").click(function(event) {
  if( last )
   alert( "time since last event " + event.timeStamp - last );
  last = event.timeStamp;
});

  上面是jQuery官方文档中提供的event对象的属性. 在”jQuery实战”一书中还提供了下面的多浏览器支持的属性, 时间关系我没有尝试每一个属性, 大家可以帮忙验证是否在所有浏览器下可用:

属性名称 描述 举例
altKey Alt键是否被按下. 按下返回true  
ctrlKey ctrl键是否被按下, 按下返回true  
metaKey Meta键是否被按下, 按下返回true. 

  meta键就是PC机器的Ctrl键,或者Mac机器上面的Command键

 
shiftKey Shift键是否被按下, 按下返回true  
keyCode 对于keyup和keydown事件返回被按下的键. 不区分大小写, a和A都返回65. 

  对于keypress事件请使用which属性, 因为which属性跨浏览时依然可靠.

 
which 对于键盘事件, 返回触发事件的键的数字编码. 对于鼠标事件, 返回鼠标按键号(1左,2中,3右).  
screenX/Y 对于鼠标事件, 获取事件相对于屏幕原点的水平/垂直坐标  

  事件对象除了拥有属性, 还拥有事件. 有一些是一定会用到的事件比如取消冒泡 stopPropagation() 等.下面是jQuery事件对象的函数列表:

名称 说明 举例
 

  preventDefault()

取消可能引起任何语意操作的事件. 比如<a>元素的href链接加载, 表单提交以及click引起复选框的状态切换. $("a").click(function(event){
 event.preventDefault();
 // do something
});
 

  isDefaultPrevented()

是否调用过 

  preventDefault()

  方法

$("a").click(function(event){
 alert( event.isDefaultPrevented() );
 event.preventDefault();
 alert( event.isDefaultPrevented() );
});
 

  stopPropagation()

取消事件冒泡 $("p").click(function(event){
 event.stopPropagation();
 // do something
});
 

  isPropagationStopped()

是否调用过 

  stopPropagation()

  方法

$("p").click(function(event){
 alert( event.isPropagationStopped() );
 event.stopPropagation();
 alert( event.isPropagationStopped() );
});
 

  stopImmediatePropagation()

取消执行其他的事件处理函数并取消事件冒泡. 

  如果同一个事件绑定了多个事件处理函数, 在其中一个事件处理函数中调用此方法后将不会继续调用其他的事件处理函数.

$("p").click(function(event){
 event.stopImmediatePropagation();
});
$("p").click(function(event){
 // This function won't be executed
});
 

  isImmediatePropagationStopped()

是否调用过 

  stopImmediatePropagation()

  方法

$("p").click(function(event){
 alert( event.isImmediatePropagationStopped() );
 event.stopImmediatePropagation();
 alert( event.isImmediatePropagationStopped() );
});

  这些函数中  stopPropagation()  是我们最长用的也是一定会用到的函数. 相当于操作原始event对象的event.cancelBubble=true来取消冒泡.

  九. 总结

  事件是javascript的灵魂, 我花了很久写这篇文章,翻译jQuery官方的API文档. 列表中的很多例子直接从官网上摘抄的,  有些列表中的方法我也没有用过, 所以如果大家发现问题请及时通知我修改.

  接下来的文章将分别讲解Ajax和动画效果.  最后通过讲解两个我修改的jQuery插件来学习jQuery的插件开发.

使用jQuery操作元素的属性与样式 

 一.摘要

  本篇文章讲解如何使用jQuery获取和操作元素的属性和CSS样式. 其中DOM属性和元素属性的区分值得大家学习.

  二.前言

  通过前面几章我们已经能够完全控制jQuery包装集了,  无论是通过选择器选取对象, 或者从包装集中删除,过滤元素. 本章将讲解如何使用jQuery获取和修改元素属性和样式.

  三. 区分DOM属性和元素属性

  一个img标签:

<img src="images/image.1.jpg" id="hibiscus" alt="Hibiscus" class="classA" />

  通常开发人员习惯将id, src, alt等叫做这个元素的”属性”. 我将其称为”元素属性”. 但是在解析成DOM对象时, 实际浏览器最后会将标签元素解析成”DOM对象”, 并且将元素的”元素属性”存储为”DOM属性”. 两者是有区别的.

  虽然我们设置了元素的src是相对路径:images/image.1.jpg

  但是在”DOM属性”中都会转换成绝对路径:http://localhost/images/image.1.jpg.

  甚至有些”元素属性”和”DOM属性”的名称都不一样,比如上面的元素属性class, 转换为DOM属性后对应className.

  牢记, 在javascript中我们可以直接获取或设置”DOM属性”:

  <script type="text/javascript">
    $(function() {
      var img1 = document.getElementById("hibiscus");
      alert(img1.alt);
      img1.alt = "Change the alt element attribute";
      alert(img1.alt);
    })
  </script>

  所以如果要设置元素的CSS样式类, 要使用的是”DOM属性”className”而不是”元素属性”class:

img1.className = "classB";

  四. 操作”DOM属性”

  在jQuery中没有包装操作”DOM属性”的函数, 因为使用javascript获取和设置”DOM属性”都很简单. 在jQuery提供了each()函数用于遍历jQuery包装集, 其中的this指针是一个DOM对象, 所以我们可以应用这一点配合原生javascript来操作元素的DOM属性:

      $("img").each(function(index) {
        alert("index:" + index + ", id:" + this.id + ", alt:" + this.alt);
        this.alt = "changed";
        alert("index:" + index + ", id:" + this.id + ", alt:" + this.alt);
      });

  下面是each函数的说明:

  each( callback )  Returns: jQuery包装集

  对包装集中的每一个元素执行callback方法. 其中callback方法接受一个参数, 表示当前遍历的索引值,从0开始.

  五. 操作”元素属性”

  我们可以使用javascript中的getAttribute和setAttribute来操作元素的”元素属性”.

  在jQuery中给你提供了attr()包装集函数, 能够同时操作包装集中所有元素的属性:

名称 说明 举例
 

  attr( name )

取得第一个匹配元素的属性值。通过这个方法可以方便地从第一个匹配元素中获取一个属性的值。如果元素没有相应属性,则返回 undefined 。 返回文档中第一个图像的src属性值: 

  $(“img”).attr(“src”);

attr( properties )  

  将一个“名/值”形式的对象设置为所有匹配元素的属性。

  这是一种在所有匹配元素中批量设置很多属性的最佳方式。 注意,如果你要设置对象的class属性,你必须使用’className’ 作为属性名。或者你可以直接使用.addClass( class ) 和 .removeClass( class ).

为所有图像设置src和alt属性: 

  $(“img”).attr({ src: “test.jpg”, alt: “Test Image” });

attr( key, value ) 为所有匹配的元素设置一个属性值。 为所有图像设置src属性: 

  $(“img”).attr(“src”,”test.jpg”);

attr( key, fn )  

  为所有匹配的元素设置一个计算的属性值。

  不提供值,而是提供一个函数,由这个函数计算的值作为属性值。

把src属性的值设置为title属性的值: 

  $(“img”).attr(“title”, function() { return this.src });

removeAttr( name ) 从每一个匹配的元素中删除一个属性 将文档中图像的src属性删除: 

  $(“img”).removeAttr(“src”);

  当使用id选择器时常常返回只有一个对象的jQuery包装集, 这个时侯常使用attr(name)函数获得它的元素属性:

function testAttr1(event) {
  alert($("#hibiscus").attr("class"));
}

  注意attr(name)函数只返回第一个匹配元素的特定元素属性值. 而attr(key, name)会设置所有包装集中的元素属性:

//修改所有img元素的alt属性
$("img").attr("alt", "修改后的alt属性");

  而 attr( properties ) 可以一次修改多个元素属性:

$("img").attr({title:"修改后的title", alt: "同时修改alt属性"});

  另外虽然我们可以使用 removeAttr( name ) 删除元素属性, 但是对应的DOM属性是不会被删除的, 只会影响DOM属性的值.

  比如将一个input元素的readonly元素属性去掉,会导致对应的DOM属性变成false(即input变成可编辑状态):

$("#inputTest").removeAttr("readonly");

  六,修改CSS样式

  修改元素的样式, 我们可以修改元素CSS类或者直接修改元素的样式.

  一个元素可以应用多个css类, 但是不幸的是在DOM属性中是用一个以空格分割的字符串存储的, 而不是数组. 所以如果在原始javascript时代我们想对元素添加或者删除多个属性时, 都要自己操作字符串.

  jQuery让这一切变得异常简单. 我们再也不用做那些无聊的工作了.

  1. 修改CSS类

  下表是修改CSS类相关的jQuery方法:

名称 说明 实例
 

  addClass( classes )

为每个匹配的元素添加指定的类名。 为匹配的元素加上 ’selected’ 类: 

  $(“p”).addClass(“selected”);

hasClass( class ) 判断包装集中是否至少有一个元素应用了指定的CSS类  

  $(“p”).hasClass(“selected”);

removeClass( [classes] ) 从所有匹配的元素中删除全部或者指定的类。 从匹配的元素中删除 ’selected’ 类: 

  $(“p”).removeClass(“selected”);

toggleClass( class ) 如果存在(不存在)就删除(添加)一个类。 为匹配的元素切换 ’selected’ 类: 

  $(“p”).toggleClass(“selected”);

toggleClass( class, switch ) 当switch是true时添加类, 

  当switch是false时删除类

 

  每三次点击切换高亮样式:

  var count = 0;

  $(“p”).click(function(){

   $(this).toggleClass(“highlight”, count++ % 3 == 0);

  });

  使用上面的方法, 我们可以将元素的CSS类像集合一样修改, 再也不必手工解析字符串.

  注意  addClass( class ) 和removeClass( [classes] ) 的参数可以一次传入多个css类, 用空格分割,比如:

$("#btnAdd").bind("click", function(event) { $("p").addClass("colorRed borderBlue"); });

  removeClass方法的参数可选, 如果不传入参数则移除全部CSS类:

 $("p").removeClass()

  2. 修改CSS样式

  同样当我们想要修改元素的具体某一个CSS样式,即修改元素属性”style”时,  jQuery也提供了相应的方法:

名称 说明 实例
css( name ) 访问第一个匹配元素的样式属性。 取得第一个段落的color样式属性的值: 

  $(“p”).css(“color”);

css( properties )  

  把一个“名/值对”对象设置为所有匹配元素的样式属性。

  这是一种在所有匹配的元素上设置大量样式属性的最佳方式。

将所有段落的字体颜色设为红色并且背景为蓝色: 

  $(“p”).css({ color: “#ff0011″, background: “blue” });

css( name, value )  

  在所有匹配的元素中,设置一个样式属性的值。

  数字将自动转化为像素值

将所有段落字体设为红色: 

  $(“p”).css(“color”,”red”);

  七.获取常用属性

  虽然我们可以通过获取属性,特性以及CSS样式来取得元素的几乎所有信息,  但是注意下面的实验:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>获取对象宽度</title>
  <script type="text/javascript" src="scripts/jquery-1.3.2-vsdoc2.js"></script>
  <script type="text/javascript">
    $(function()
    {
      alert("attr("width"):" + $("#testDiv").attr("width")); //undifined
      alert("css("width"):" + $("#testDiv").css("width")); //auto(ie6) 或 1264px(ff)
      alert("width():" + $("#testDiv").width()); //正确的数值1264
      alert("style.width:" + $("#testDiv")[0].style.width ); //空值
    })
  </script>
</head>
<body>
  <div id="testDiv">
    测试文本</div>
</body>
</html>

  我们希望获取测试图层的宽度,  使用attr方法获取”元素特性”为undifined, 因为并没有为div添加width. 而使用css()方法虽然可以获取到style属性的值, 但是在不同浏览器里返回的结果不同, IE6下返回auto, 而FF下虽然返回了正确的数值但是后面带有”px”. 所以jQuery提供了width()方法, 此方法返回的是正确的不带px的数值.

  针对上面的问题, jQuery为常用的属性提供了获取和设置的方法, 比如width()用户获取元素的宽度, 而 width(val)用来设置元素宽度.

  下面这些方法可以用来获取元素的常用属性值:

  1.宽和高相关 Height and Width

名称 说明 举例
height( ) 取得第一个匹配元素当前计算的高度值(px)。 获取第一段的高: 

  $(“p”).height();

height( val ) 为每个匹配的元素设置CSS高度(hidth)属性的值。如果没有明确指定单位(如:em或%),使用px。 把所有段落的高设为 20: 

  $(“p”).height(20);

width( ) 取得第一个匹配元素当前计算的宽度值(px)。 获取第一段的宽: 

  $(“p”).width();

width( val )  

  为每个匹配的元素设置CSS宽度(width)属性的值。

  如果没有明确指定单位(如:em或%),使用px。

将所有段落的宽设为 20: 

  $(“p”).width(20);

innerHeight( )  

  获取第一个匹配元素内部区域高度(包括补白、不包括边框)。

  此方法对可见和隐藏元素均有效。

见最后示例
innerWidth( )  

  获取第一个匹配元素内部区域宽度(包括补白、不包括边框)。

  此方法对可见和隐藏元素均有效。

见最后示例
outerHeight( [margin] )  

  获取第一个匹配元素外部高度(默认包括补白和边框)。

  此方法对可见和隐藏元素均有效。

见最后示例
outerWidth( [margin] )  

  获取第一个匹配元素外部宽度(默认包括补白和边框)。

  此方法对可见和隐藏元素均有效。

见最后示例

  关于在获取长宽的函数中, 要区别”inner”, “outer”和height/width这三种函数的区别:

从零开始学习jQuery (四) 使用jQuery操作元素的属性与样式

  图片看不清楚?请点击这里查看原图(大图)。

  outerWith可以接受一个bool值参数表示是否计算margin值.

  相信此图一目了然各个函数所索取的范围. 图片以width为例说明的, height的各个函数同理. 

  2.位置相关 Positioning

  另外在一些设计套弹出对象的脚本中,常常需要动态获取弹出坐标并且设置元素的位置.

  但是很多的计算位置的方法存在着浏览器兼容性问题,  jQuery中为我们提供了位置相关的各个函数:

名称 说明 举例
offset( )  

  获取匹配元素在当前窗口的相对偏移。

  返回的对象包含两个整形属性:top 和 left。此方法只对可见元素有效。

获取第二段的偏移: 

var p = $("p:last");
var offset = p.offset();
p.html( "left: " + offset.left + ", top: " + offset.top );

position( )  

  获取匹配元素相对父元素的偏移。

  返回的对象包含两个整形属性:top 和 left。为精确计算结果,请在补白、边框和填充属性上使用像素单位。此方法只对可见元素有效。

获取第一段的偏移: 

var p = $("p:first");
var position = p.position();
$("p:last").html( "left: " + position.left + ", top: " + position.top );

scrollTop( )  

  获取匹配元素相对滚动条顶部的偏移。

  此方法对可见和隐藏元素均有效。

获取第一段相对滚动条顶部的偏移: 

var p = $("p:first");
$("p:last").text( "scrollTop:" + p.scrollTop() );

scrollTop( val )  

  传递参数值时,设置垂直滚动条顶部偏移为该值。

  此方法对可见和隐藏元素均有效。

设定垂直滚动条值: 

$("div.demo").scrollTop(300);

scrollLeft( )  

  获取匹配元素相对滚动条左侧的偏移。

  此方法对可见和隐藏元素均有效。

获取第一段相对滚动条左侧的偏移: 

var p = $("p:first");
$("p:last").text( "scrollLeft:" + p.scrollLeft() );

scrollLeft( val )  

  传递参数值时,设置水平滚动条左侧偏移为该值。

  此方法对可见和隐藏元素均有效。

设置相对滚动条左侧的偏移: 

$("div.demo").scrollLeft(300);

  八.总结

  本篇文章主要讲解如何使用jQuery操作元素的属性和修改样式. 请大家主要注意元素属性和DOM属性的区别. 下一篇文章将讲解最重要的事件, 介绍如何绑定事件, 操作事件对象等.

原文链接:http://tech.ddvip.com/2009-05/1241493455117686.html

管理jQuery包装集

 一.摘要

  在使用jQuery选择器获取到jQuery包装集后, 我们需要对其进行操作. 本章首先讲解如何动态的创建元素, 接着学习如何管理jQuery包装集, 比如添加,删除,切片等. 

  二.前言 

  本系列的2,3篇上面列举了太多的API相信大家看着眼晕. 不过这些基础还必须要讲, 基础要扎实.其实对于这些列表大家可以跳过, 等以后用到时再回头看或者查询官方的API说明. 

  本章内容很少, 主要讲解动态创建元素和操作jQuery包装集的各个函数. 

  三.动态创建元素 

  1.错误的编程方法 

  我们经常使用javascript动态的创建元素, 有很多程序员通过直接更改某一个容器的HTML内容.比如: 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>动态创建对象</title>
</head>
<body>
<div id="testDiv">测试图层</div>
<script type="text/javascript">
  document.getElementById("testDiv").innerHTML = "<div style="border:solid 1px #FF0000">动态创建的div</div>";
</script>
</body>
</html>
 

  上面的示例中我通过修改testDiv的内容,在页面上动态的添加了一个div元素. 但是请牢记,这是错误的做法! 

  错误的原因: 

  (1) 在页面加载时改变了页面的结构. 在IE6中如果网络变慢或者页面内容太大就会出现”终止操作”的错误. 也就是说”永远不要在页面加载时改变页面的Dom模型”. 

  (2) 使用修改HTML内容添加元素,  不符合Dom标准. 在实际工作中也碰到过使用这种方法修改内容后, 某些浏览器中并不能立刻显示添加的元素, 因为不同浏览器的显示引擎是不同的. 但是如果我们使用Dom的CreateElement创建对象, 在所有的浏览器中几乎都可以. 但是在jQuery中如果传入的而是一个完整的HTML字符串, 内部也是使用innerHTML. 所以也不是完全否定innerHTML函数的使用.  

  所以从现在开始请摒弃这种旧知识, 使用下面介绍的正确方法编程. 

  2.创建新的元素 

  下面介绍两种正确的创建元素的方式. 

  (1)使用HTML DOM创建元素 

  什么是 DOM? 

  通过 JavaScript,您可以重构整个 HTML 文档。您可以添加、移除、改变或重排页面上的项目。 

  要改变页面的某个东西,JavaScript 就需要对 HTML 文档中所有元素进行访问的入口。这个入口,连同对 HTML 元素进行添加、移动、改变或移除的方法和属性,都是通过文档对象模型来获得的(DOM)。 

  在 1998 年,W3C 发布了第一级的 DOM 规范。这个规范允许访问和操作 HTML 页面中的每一个单独的元素。 

  所有的浏览器都执行了这个标准,因此,DOM 的兼容性问题也几乎难觅踪影了。 

  DOM 可被 JavaScript 用来读取、改变 HTML、XHTML 以及 XML 文档。 

  DOM 被分为不同的部分(核心、XML及HTML)和级别(DOM Level 1/2/3): 

Core DOM
定义了一套标准的针对任何结构化文档的对象
XML DOM
定义了一套标准的针对 XML 文档的对象
HTML DOM
定义了一套标准的针对 HTML 文档的对象。 

  关于使用HTML DOM创建元素本文不做详细介绍, 下面举一个简单的例子: 

  //使用Dom标准创建元素
  var select = document.createElement("select");
  select.options[0] = new Option("加载项1", "value1");
  select.options[1] = new Option("加载项2", "value2");
  select.size = "2";
  var object = testDiv.appendChild(select);
 

 

  通过使用 document.createElement 方法我们可以创建Dom元素, 然后通过appendChild方法为添加到指定对象上. 

  (2) 使用jQuery函数创建元素 

  在jQuery中创建对象更加简单, 比如创建一个Div元素: 

$("<div style="border:solid 1px #FF0000">动态创建的div</div>")
.csharpcode, .csharpcode pre
{

font-size: small;

color: black;

font-family: consolas, "Courier New", courier, monospace;

background-color: #ffffff;

/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{

background-color: #f4f4f4;

width: 100%;

margin: 0em;
}
.csharpcode .lnum { color: #606060; }
 

  我们主要使用jQuery核心类库中的一个方法: 

  jQuery( html, ownerDocument ) 

  Returns: jQuery 

  根据HTML原始字符串动态创建Dom元素. 

  其中html参数是一个HTML字符串,  在jQuery1.3.2中对此函数做了改进: 

  当HTML字符串是没有属性的元素是, 内部使用document.createElement创建元素, 比如: 

//jQuery内部使用document.createElement创建元素:
$("<div/>").css("border","solid 1px #FF0000").html("动态创建的div").appendTo(testDiv);
 

 

  否则使用innerHTML方法创建元素: 

//jQuery内部使用innerHTML创建元素:
$("<div style="border:solid 1px #FF0000">动态创建的div</div>").appendTo(testDiv);
 

  3.将元素添加到对象上 

  我们可以使用上面两种方式创建一个而元素, 但是上面已经提到一定不要在页面加载时就改变页面的DOM结构, 比如添加一个元素. 正确的做法是在页面加载完毕后添加或删除元素. 

  传统上, 使用window.onload完成上述目的: 

//DOM加载完毕后添加元素
//传统方法
window.onload = function() { testDiv.innerHTML = "<div style="border:solid 1px #FF0000">动态创建的div</div>"; }
 

 

  虽然能够在DOM完整加载后, 在添加新的元素, 但是不幸的是浏览器执行window.onload函数不仅仅是在构建完DOM树之后, 也是在所有图像和其他外部资源完整的加载并且在浏览器窗口显示完毕之后. 所以如果某个图片或者其他资源加载很长时间, 访问者就会看到一个不完整的页面, 甚至在图片加载之前就执行了需要依赖动态添加的元素的脚本而导致脚本错误. 

  解决办法就是等DOM被解析后, 在图像和外部资源加载之前执行我们的函数.在jQuery中让这一实现变得可行: 

//jQuery 使用动态创建的$(document).ready(function)方法
$(document).ready(
    function() { testDiv.innerHTML = "<div style="border:solid 1px #FF0000">使用动态创建的$(document).ready(function)方法</div>"; }
);
 

 

  或者使用简便语法: 

//jQuery 使用$(function)方法
$(
    function() { testDiv.innerHTML += "<div style="border:solid 1px #FF0000">使用$(function)方法</div>"; }
);
 

  使用$()将我们的函数包装起来即可. 而且可以在一个页面绑定多个函数, 如果使用传统的window.onload则只能调用一个函数. 

  所以请大家将修改DOM的函数使用此方法调用. 另外还要注意document.createElement和innerHTML的区别. 如果可以请尽量使用document.createElement和$(“<div/>”)的形式创建对象. 

  四.管理jQuery包装集元素 

  既然学会了动态创建元素, 接下来就会想要把这些元素放入我们的jQuery包装集中. 

  我们可以在jQuery包装集上调用下面这些函数, 用来改变我们的原始jQuery包装集, 并且大部分返回的都是过滤后的jQuery包装集. 

  jQuery提供了一系列的函数用来管理包装集: 

  1.过滤 Filtering

名称 说明 举例
eq( index ) 获取第N个元素 获取匹配的第二个元素: 

  $(“p”).eq(1) 

filter( expr )  

  筛选出与指定表达式匹配的元素集合。 

保留带有select类的元素: 

  $(“p”).filter(“.selected”) 

filter( fn )  

  筛选出与指定函数返回值匹配的元素集合 

  这个函数内部将对每个对象计算一次 (正如 ‘$.each’). 如果调用的函数返回false则这个元素被删除,否则就会保留。 

保留子元素中不含有ol的元素: 

  $(“div”).filter(function(index) { 

   return $(“ol”, this).size() == 0; 

  }); 

is( expr ) 

  注意: 这个函数返回的不是jQuery包装集而是Boolean值 

 

  用一个表达式来检查当前选择的元素集合,如果其中至少有一个元素符合这个给定的表达式就返回true。 

  如果没有元素符合,或者表达式无效,都返回’false’. ‘filter’ 内部实际也是在调用这个函数,所以,filter()函数原有的规则在这里也适用。 

由于input元素的父元素是一个表单元素,所以返回true: 

  $(“input[type='checkbox']“).parent().is(“form”) 

map( callback )  

  将一组元素转换成其他数组(不论是否是元素数组) 

  你可以用这个函数来建立一个列表,不论是值、属性还是CSS样式,或者其他特别形式。这都可以用’$.map()’来方便的建立 

把form中的每个input元素的值建立一个列表: 

  $(“p”).append( $(“input”).map(function(){ 

   return $(this).val(); 

  }).get().join(“, “) ); 

not( expr ) 删除与指定表达式匹配的元素 从p元素中删除带有 select 的ID的元素: 

  $(“p”).not( $(“#selected”)[0] ) 

 

  slice( start, end ) 

选取一个匹配的子集 选择第一个p元素: 

  $(“p”).slice(0, 1); 

  2.查找 Finding

名称 说明 举例
add( expr )  

  把与表达式匹配的元素添加到jQuery对象中。这个函数可以用于连接分别与两个表达式匹配的元素结果集。 

动态生成一个元素并添加至匹配的元素中: 

  $(“p”).add(“<span>Again</span>”) 

children( [expr] )  

  取得一个包含匹配的元素集合中每一个元素的所有子元素的元素集合。 

  可以通过可选的表达式来过滤所匹配的子元素。注意:parents()将查找所有祖辈元素,而children()只考虑子元素而不考虑所有后代元素。 

查找DIV中的每个子元素: 

  $(“div”).children() 

closest( [expr] ) 取得与表达式匹配的最新的父元素  

  为事件源最近的父类li对象更换样式: 

  $(document).bind(“click”, function (e) { 

   $(e.target).closest(“li”).toggleClass(“hilight”); 

  }); 

contents( ) 查找匹配元素内部所有的子节点(包括文本节点)。如果元素是一个iframe,则查找文档内容 查找所有文本节点并加粗: 

  $(“p”).contents().not(“[nodeType=1]“).wrap(“<b/>”); 

find( expr )  

  搜索所有与指定表达式匹配的元素。这个函数是找出正在处理的元素的后代元素的好方法。 

  所有搜索都依靠jQuery表达式来完成。这个表达式可以使用CSS1-3的选择器语法来写。 

从所有的段落开始,进一步搜索下面的span元素。与$(“p span”)相同: 

  $(“p”).find(“span”) 

next( [expr] )  

  取得一个包含匹配的元素集合中每一个元素紧邻的后面同辈元素的元素集合。 

  这个函数只返回后面那个紧邻的同辈元素,而不是后面所有的同辈元素(可以使用nextAll)。可以用一个可选的表达式进行筛选。 

找到每个段落的后面紧邻的同辈元素: 

  $(“p”).next() 

nextAll( [expr] )  

  查找当前元素之后所有的同辈元素。 

  可以用表达式过滤 

给第一个div之后的所有元素加个类: 

  $(“div:first”).nextAll().addClass(“after”); 

offsetParent( ) 返回第一个有定位的父类(比如(relative或absolute)).   
parent( [expr] )  

  取得一个包含着所有匹配元素的唯一父元素的元素集合。 

  你可以使用可选的表达式来筛选。 

查找每个段落的父元素: 

  $(“p”).parent() 

parents( [expr] ) 取得一个包含着所有匹配元素的祖先元素的元素集合(不包含根元素)。可以通过一个可选的表达式进行筛选。 找到每个span元素的所有祖先元素: 

  $(“span”).parents() 

prev( [expr] )  

  取得一个包含匹配的元素集合中每一个元素紧邻的前一个同辈元素的元素集合。 

  可以用一个可选的表达式进行筛选。只有紧邻的同辈元素会被匹配到,而不是前面所有的同辈元素。 

找到每个段落紧邻的前一个同辈元素: 

  $(“p”).prev() 

prevAll( [expr] )  

  查找当前元素之前所有的同辈元素 

  可以用表达式过滤。 

给最后一个之前的所有div加上一个类: 

  $(“div:last”).prevAll().addClass(“before”); 

siblings( [expr] ) 取得一个包含匹配的元素集合中每一个元素的所有唯一同辈元素的元素集合。可以用可选的表达式进行筛选。 找到每个div的所有同辈元素: 

  $(“div”).siblings() 

  3.串联 Chaining

名称 说明 举例
andSelf( )  

  加入先前所选的加入当前元素中 

  对于筛选或查找后的元素,要加入先前所选元素时将会很有用。 

选取所有div以及内部的p,并加上border类: 

  $(“div”).find(“p”).andSelf().addClass(“border”); 

end( ) 回到最近的一个”破坏性”操作之前。即,将匹配的元素列表变为前一次的状态。 

  如果之前没有破坏性操作,则返回一个空集。所谓的”破坏性”就是指任何改变所匹配的jQuery元素的操作。这包括在 Traversing 中任何返回一个jQuery对象的函数–’add’, ‘andSelf’, ‘children’, ‘filter’, ‘find’, ‘map’, ‘next’, ‘nextAll’, ‘not’, ‘parent’, ‘parents’, ‘prev’, ‘prevAll’, ’siblings’ and ’slice’–再加上 Manipulation 中的 ‘clone’。 

选取所有的p元素,查找并选取span子元素,然后再回过来选取p元素: 

  $(“p”).find(“span”).end() 

  五.常用函数举例 

  [待续] 

  六.总结 

  本篇文章内容较少, 主要讲解如何动态创建元素以及管理jQuery包装集, 接口文档列举了太多,  实例部分还没来得及写. 因为要睡觉明天还要上班, 所以请各位见谅, 等以后有空的时候补上! 

原文链接:http://tech.ddvip.com/2009-05/1241493381117684.html

万能的选择器

一.摘要

  本章讲解jQuery最重要的选择器部分的知识. 有了jQuery的选择器我们几乎可以获取页面上任意的一个或一组对象, 可以明显减轻开发人员的工作量.

  二.前言

  编写任何javascript程序我们要首先获得对象, jQuery选择器能彻底改变我们平时获取对象的方式, 可以获取几乎任何语意的对象, 比如”拥有title属性并且值中包含test的<a>元素”, 完成这些工作只需要编写一个jQuery选择器字符串. 学习jQuery选择器是学习jQuery最重要的一步.

  三.Dom对象和jQuery包装集

  无论是在写程序还是看API文档,  我们要时刻注意区分Dom对象和jQuery包装集.

  1.Dom对象

  在传统的javascript开发中,我们都是首先获取Dom对象,比如:

  var div = document.getElementById("testDiv");
  var divs = document.getElementsByTagName("div");

  我们经常使用 document.getElementById 方法根据id获取单个Dom对象, 或者使用 document.getElementsByTagName 方法根据HTML标签名称获取Dom对象集合.

  另外在事件函数中, 可以通过在方法函数中使用this引用事件触发对象(但是在多播事件函数中IE6存在问题), 或者使用event对象的target(FF)或srcElement(iIE6)获取到引发事件的Dom对象.

  注意我们这里获取到的都是Dom对象, Dom对象也有不同的类型比如input, div, span等.  Dom对象只有有限的属性和方法:

  2.jQuery包装集

  jQuery包装集可以说是Dom对象的扩充.在jQuery的世界中将所有的对象, 无论是一个还是一组, 都封装成一个jQuery包装集,比如获取包含一个元素的jQuery包装集:

var jQueryObject = $("#testDiv");

  jQuery包装集都是作为一个对象一起调用的. jQuery包装集拥有丰富的属性和方法, 这些都是jQuery特有的:

  3.Dom对象与jQuery对象的转换

  (1) Dom转jQuery包装集

  如果要使用jQuery提供的函数,  就要首先构造jQuery包装集.  我们可以使用本文即将介绍的jQuery选择器直接构造jQuery包装集,比如:

$("#testDiv");

  上面语句构造的包装集只含有一个id是testDiv的元素.

  或者我们已经获取了一个Dom元素,比如:

var div = document.getElementById("testDiv");

  上面的代码中div是一个Dom元素, 我们可以将Dom元素转换成jQuery包装集:

var domToJQueryObject = $(div);

  小窍门:因为有了智能感知, 所以我们可以通过智能感知的方法列表来判断一个对象啊是Dom对象还是jQuery包装集.

  (2) jQuery包装集转Dom对象

  jQuery包装集是一个集合, 所以我们可以通过索引器访问其中的某一个元素:

var domObject = $("#testDiv")[0];

  注意, 通过索引器返回的不再是jQuery包装集, 而是一个Dom对象!

  jQuery包装集的某些遍历方法,比如each()中, 可以传递遍历函数, 在遍历函数中的this也是Dom元素,比如:

$("#testDiv").each(function() { alert(this) })

  如果我们要使用jQuery的方法操作Dom对象,怎么办? 用上面介绍过的转换方法即可:

$("#testDiv").each(function() { $(this).html("修改内容") })

  小结: 先让大家明确Dom对象和jQuery包装集的概念, 将极大的加快我们的学习速度. 我在学习jQuery的过程中就花了很长时间没有领悟到两者的具体差异, 因为书上并没有专门讲解两者的区别, 所以经常被”this指针为何不能调用jQuery方法”等问题迷惑.  直到某一天豁然开朗, 发现只要能够区分这两者, 就能够在写程序时变得清清楚楚.

  四. 什么是jQuery选择器

  在Dom编程中我们只能使用有限的函数根据id或者TagName获取Dom对象.

  在jQuery中则完全不同,jQuery提供了异常强大的选择器用来帮助我们获取页面上的对象, 并且将对象以jQuery包装集的形式返回.

  首先来看看什么是选择器:

  //根据ID获取jQuery包装集
  var jQueryObject = $("#testDiv");

  上例中使用了ID选择器, 选取id为testDiv的Dom对象并将它放入jQuery包装集, 最后以jQuery包装集的形式返回.

  ”$”符号在jQuery中代表对jQuery对象的引用, “jQuery”是核心对象, 其中包含下列方法:

  jQuery( expression, context )

  Returns: jQuery

  这个函数接收一个CSS选择器的字符串,然后用这个字符串去匹配一组元素。

  This function accepts a string containing a CSS selector which is then used to match a set of elements.

  jQuery( html, ownerDocument )

  Returns: jQuery

  根据HTML原始字符串动态创建Dom元素.

  Create DOM elements on-the-fly from the provided String of raw HTML.

  jQuery( elements )

  Returns: jQuery

  将一个或多个Dom对象封装jQuery函数功能(即封装为jQuery包装集)

  Wrap jQuery functionality around a single or multiple DOM Element(s).

  jQuery( callback )

  Returns: jQuery

  $(document).ready()的简写方式

  A shorthand for $(document).ready().

  上面摘选自jQuery官方手册.Returns的类型为jQuery即表示返回的是jQuery包装集.其中第一个方法有些问题, 官方接口写的是CSS选择器, 但是实际上这个方法不仅仅支持CSS选择器, 而是所有jQuery支持的选择器, 有些甚至是jQuery自定义的选择器(在CSS标准中不存在的选择器). 为了能让大家理解的更清楚,  我将方法修改如下:

  jQuery( selector, context )

  Returns: jQuery 包装集

  根据选择器选取匹配的对象, 以jQuery包装集的形式返回. context可以是Dom对象集合或jQuery包装集, 传入则表示要从context中选择匹配的对象, 不传入则表示范围为文档对象(即页面全部对象).

  上面这个方法就是我们选择器使用的核心方法.可以用”$”代替jQuery让语法更简介, 比如下面两句话的效果相同:

  //根据ID获取jQuery包装集
  var jQueryObject = $("#testDiv");
  //$是jQuery对象的引用:
  var jQueryObject = jQuery("#testDiv");

 

  接下来让我们系统的学习jQuery选择器.

  五.jQuery选择器全解

  通俗的讲, Selector选择器就是”一个表示特殊语意的字符串”. 只要把选择器字符串传入上面的方法中就能够选择不同的Dom对象并且以jQuery包装集的形式返回.

  但是如何将jQuery选择器分类让我犯难. 因为书上的分类和jQuery官方的分类截然不同. 最后我决定以实用为主, 暂时不去了解CSS3选择器标准, 而按照jQuery官方的分类进行讲解.

  jQuery的选择器支持CSS3选择器标准. 下面是W3C最新的CSS3选择器标准:

  http://www.w3.org/TR/css3-selectors/

  标准中的选择器都可以在jQuery中使用.

  jQuery选择器按照功能主要分为”选择”和”过滤”. 并且是配合使用的. 可以同时使用组合成一个选择器字符串. 主要的区别是”过滤”作用的选择器是指定条件从前面匹配的内容中筛选, “过滤”选择器也可以单独使用, 表示从全部”*”中筛选. 比如:

  $(“:[title]“)

  等同于:

  $(“*:[title]“)

  而”选择”功能的选择器则不会有默认的范围, 因为作用是”选择”而不是”过滤”.

  下面的选择器分类中,  带有”过滤器”的分类表示是”过滤”选择器,  否则就是”选择”功能的选择器.

  jQuery选择器分为如下几类:

  [说明]

  1.点击”名称”会跳转到此方法的jQuery官方说明文档.

  2.可以在下节中的jQuery选择器实验室测试各种选择器

  1. 基础选择器 Basics

名称 说明 举例
#id 根据元素Id选择 $(“divId”) 选择ID为divId的元素
element 根据元素的名称选择, $(“a”) 选择所有<a>元素
.class 根据元素的css类选择 $(“.bgRed”) 选择所用CSS类为bgRed的元素
* 选择所有元素 $(“*”)选择页面所有元素
selector1,   selector2,  selectorN 可以将几个选择器用”,”分隔开然后再拼成一个选择器字符串.会同时选中这几个选择器匹配的内容. $(“#divId, a, .bgRed”)

  [学习建议]: 大家暂时记住基础选择器即可, 可以直接跳到下一节”jQuery选择器实验室”进行动手练习, 以后再回来慢慢学习全部的选择器, 或者用到的时候再回来查询.

  2.层次选择器 Hierarchy

名称 说明 举例
ancestor descendant 使用”form input”的形式选中form中的所有input元素.即ancestor(祖先)为from, descendant(子孙)为input. $(“.bgRed div”) 选择CSS类为bgRed的元素中的所有<div>元素.
parent > child 选择parent的直接子节点child.  child必须包含在parent中并且父类是parent元素. $(“.myList>li”) 选择CSS类为myList元素中的直接子节点<li>对象.
prev + next prev和next是两个同级别的元素. 选中在prev元素后面的next元素. $(“#hibiscus+img”)选在id为hibiscus元素后面的img对象.
prev ~ siblings  选择prev后面的根据siblings过滤的元素   注:siblings是过滤器 $(“#someDiv~[title]“)选择id为someDiv的对象后面所有带有title属性的元素

  3.基本过滤器 Basic Filters

名称 说明 举例
:first 匹配找到的第一个元素 查找表格的第一行:$(“tr:first”)
:last 匹配找到的最后一个元素 查找表格的最后一行:$(“tr:last”)
:not(selector) 去除所有与给定选择器匹配的元素 查找所有未选中的 input 元素: $(“input:not(:checked)”)
:even 匹配所有索引值为偶数的元素,从 0 开始计数 查找表格的1、3、5…行:$(“tr:even”)
:o dd 匹配所有索引值为奇数的元素,从 0 开始计数 查找表格的2、4、6行:$(“tr:odd”)
:eq(index) 匹配一个给定索引值的元素   注:index从 0 开始计数 查找第二行:$(“tr:eq(1)”)
:gt(index) 匹配所有大于给定索引值的元素   注:index从 0 开始计数 查找第二第三行,即索引值是1和2,也就是比0大:$(“tr:gt(0)”)
:lt(index) 选择结果集中索引小于 N 的 elements   注:index从 0 开始计数 查找第一第二行,即索引值是0和1,也就是比2小:$(“tr:lt(2)”)
:header 选择所有h1,h2,h3一类的header标签. 给页面内所有标题加上背景色: $(“:header”).css(“background”, “#EEE”);
:animated 匹配所有正在执行动画效果的元素 只有对不在执行动画效果的元素执行一个动画特效:   $(“#run”).click(function(){   $(“div:not(:animated)”).animate({ left: “+=20″ }, 1000);

  });

  4. 内容过滤器 Content Filters

名称 说明 举例
:contains(text) 匹配包含给定文本的元素 查找所有包含 “John” 的 div 元素:$(“div:contains(‘John’)”)
:empty 匹配所有不包含子元素或者文本的空元素 查找所有不包含子元素或者文本的空元素:$(“td:empty”)
:has(selector) 匹配含有选择器所匹配的元素的元素 给所有包含 p 元素的 div 元素添加一个 text 类: $(“div:has(p)”).addClass(“test”);
:parent 匹配含有子元素或者文本的元素 查找所有含有子元素或者文本的 td 元素:$(“td:parent”)

  5.可见性过滤器  Visibility Filters

名称 说明 举例
   :hidden    匹配所有的不可见元素  注:在1.3.2版本中, hidden匹配自身或者父类在文档中不占用空间的元素.如果使用CSS visibility属性让其不显示但是占位,则不输入hidden. 查找所有不可见的 tr 元素:$(“tr:hidden”)
:visible 匹配所有的可见元素 查找所有可见的 tr 元素:$(“tr:visible”)

  6.属性过滤器 Attribute Filters

名称 说明 举例
[attribute] 匹配包含给定属性的元素 查找所有含有 id 属性的 div 元素:   $(“div[id]“)
[attribute=value] 匹配给定的属性是某个特定值的元素 查找所有 name 属性是 newsletter 的 input 元素:   $(“input[name='newsletter']“).attr(“checked”, true);
[attribute!=value] 匹配给定的属性是不包含某个特定值的元素 查找所有 name 属性不是 newsletter 的 input 元素:   $(“input[name!='newsletter']“).attr(“checked”, true);
[attribute^=value] 匹配给定的属性是以某些值开始的元素 $(“input[name^='news']“)
[attribute$=value] 匹配给定的属性是以某些值结尾的元素 查找所有 name 以 ‘letter’ 结尾的 input 元素:   $(“input[name$='letter']“)
[attribute*=value]    匹配给定的属性是以包含某些值的元素    查找所有 name 包含 ‘man’ 的 input 元素:  $(“input[name*='man']“)
[attributeFilter1][attributeFilter2][attributeFilterN] 复合属性选择器,需要同时满足多个条件时使用。 找到所有含有 id 属性,并且它的 name 属性是以 man 结尾的:   $(“input[id][name$='man']“)

  7.子元素过滤器 Child Filters

名称 说明 举例
:nth-child(index/even/odd/equation)    匹配其父元素下的第N个子或奇偶元素  ’:eq(index)’ 只匹配一个元素,而这个将为每一个父元素匹配子元素。:nth-child从1开始的,而:eq()是从0算起的!

  可以使用:

  nth-child(even)

  :nth-child(odd)

  :nth-child(3n)

  :nth-child(2)

  :nth-child(3n+1)

  :nth-child(3n+2)

在每个 ul 查找第 2 个li:   $(“ul li:nth-child(2)”)
:first-child    匹配第一个子元素  ’:first’ 只匹配一个元素,而此选择符将为每个父元素匹配一个子元素 在每个 ul 中查找第一个 li:   $(“ul li:first-child”)
:last-child    匹配最后一个子元素  ’:last’只匹配一个元素,而此选择符将为每个父元素匹配一个子元素 在每个 ul 中查找最后一个 li:   $(“ul li:last-child”)
:o nly-child    如果某个元素是父元素中唯一的子元素,那将会被匹配  如果父元素中含有其他元素,那将不会被匹配。 在 ul 中查找是唯一子元素的 li:   $(“ul li:only-child”)

  8.表单选择器 Forms

名称 说明 解释
:input 匹配所有 input, textarea, select 和 button 元素 查找所有的input元素:   $(“:input”)
:text 匹配所有的文本框 查找所有文本框:   $(“:text”)
:password 匹配所有密码框 查找所有密码框:   $(“:password”)
:radio 匹配所有单选按钮 查找所有单选按钮
:checkbox 匹配所有复选框 查找所有复选框:   $(“:checkbox”)
:submit 匹配所有提交按钮 查找所有提交按钮:   $(“:submit”)
:image    匹配所有图像域 匹配所有图像域:   $(“:image”)
:reset 匹配所有重置按钮 查找所有重置按钮:   $(“:reset”)
:button 匹配所有按钮 查找所有按钮:   $(“:button”)
:file 匹配所有文件域 查找所有文件域:   $(“:file”)

  9.表单过滤器 Form Filters

名称 说明 解释
:enabled    匹配所有可用元素 查找所有可用的input元素:   $(“input:enabled”)
:disabled 匹配所有不可用元素 查找所有不可用的input元素:   $(“input:disabled”)
:checked 匹配所有选中的被选中元素(复选框、单选框等,不包括select中的option) 查找所有选中的复选框元素:   $(“input:checked”)
:selected 匹配所有选中的option元素 查找所有选中的选项元素:   $(“select option:selected”)

  六 jQuery选择器实验室

  jQuery选择器实验室使用的是”jQuery实战”一书中的代码, 感觉对于学习选择器很有帮助.

  我们的实验对象是一个拥有很多元素的页面:

  在实验室页面的”Selector”输入框中输入jQuery选择器表达式,  所有匹配表达式的元素会显示红框:

  如上图所示,  在输入”.myList”后点击”Apply”, 下面的输出框会显示运行结果, 右侧会将选中的元素用红框显示.

  七.API文档

  jQuery官方API: http://docs.jquery.com/

  中文在线API: http://jquery.org.cn/visual/cn/index.xml

  中文jQuery手册下载: http://files.cnblogs.com/zhangziqiu/jquery_api.rar

  八.总结

  本章节讲解的jQuery依然属于基础支持, 所以没有太多的应用实例.  虽然基础但是很难一次全部记住, jQuery选择器可以说是最考验一个人jQuery功力的地方. 下一章我们讲解如何操作jQuery包装集以及动态创建新元素.

本文所用的到资源打包jQuery入门2.zip