jQuery基础(转)

JQuery基础

 

部署jQuery

  使用如下语句将jQuery添加到工作文档中

<head>
  <title>Example</title>
  <script src="jquery-1.7.js" type="text/javascript"></script>
  <link rel="stylesheet" type="text/css" href="styles.css"/>
</head>

  可以从网上下载到两个版本,jquery-1.7.js常常用在网站的开发阶段,有230KB,代码未经过压缩,你可以直接打开阅读里面的代码,学习jQuery里面的特性,而且在遇到问题的时候可以进入进行调试。jquery-1.7.min.js是经过压缩的版本,常常用在网站的部署阶段,里面的所有空白被删除,变量的名字采用了单个字母来代替,经过压缩的版本几乎不可能阅读的,但是只有31KB,可以大大的节省流量,也就意味着节省金钱。

  还有一种部署的方式是使用public content distribution networks CDNs来存储jQuery。一个CDN是一个分布式的网络服务器,可以使用距离客户机最近的服务器向用户提供jQuery。这样的好处一是速度快,第二个是节省了网站服务器大量的流量。Google和Microsoft都提供了jQuery的CDN服务,而且是免费的。可以分别去网站www.asp.net/ajaxlibrary/cdn.ashxhttp://code.google.com/apis/libraries/devguide.html来了解他们的CDN服务。但是这种方式不适合内网的网站,因为这样会需要客户机到外网获取jQuery,而其实距离他们最近的就是他们网站的服务器。

理解jQuery的$函数

  你可以通过$(...)函数来进入jQuery,$符号是jQuery函数的缩写,你也可以使用jQuery来进入jQuery,如下:

复制代码
<script type="text/javascript">
  jQuery(document).ready(function () {
    jQuery("img:odd").mouseenter(function(e) {
      jQuery(this).css("opacity", 0.5);
    }).mouseout(function(e) {
      jQuery(this).css("opacity", 1.0);
    });
  });
</script>
复制代码

  jQuery不是唯一使用$的javascript库,因此如果你引用了多个库的话就有可能发生冲突,你可以使用jQuery.noConflict方来来放弃jQuery的控制权,如下:

复制代码
<script type="text/javascript">
  jQuery.noConflict();
  jQuery(document).ready(function () {
    jQuery("img:odd").mouseenter(function(e) {
      jQuery(this).css("opacity", 0.5);
    }).mouseout(function(e) {
      jQuery(this).css("opacity", 1.0);
    });
  });
</script>
复制代码

  你也可以通过将noConflict方法的结果赋给一个变量来更改自己的jQuery函数的简写版本,如下:

复制代码
<script type="text/javascript">
  var jq = jQuery.noConflict();
  jq(document).ready(function () {
    jq("img:odd").mouseenter(function(e) {
      jq(this).css("opacity", 0.5);
    }).mouseout(function(e) {
      jq(this).css("opacity", 1.0);
    });
  });
</script>
复制代码

  不管你如何表示jQuery函数,他们可以接受的参数和类型是不会变的,jQuery可以调用的函数形式如下

参数 描述
$(function) DOM准备好之后执行的函数
$(selector) 从文档中选择元素
$(selector,context) 从文档中选择元素
$(HTMLElement) 从HTMLElement或HTMLElement对象数组中创建jQuery对象
$(HTMLElement[]) 从HTMLElement或HTMLElement对象数组中创建jQuery对象
$() 创佳一个空的选择
$(HTML) 从HTML片段中创建新的元素

等待Document Object Model

  一般在书写javascript代码的时候,为了让代码在整个文档加载完毕之后再执行,通常将代码写在文档的底部,使用jQuery函数可以设定让函数等待文档加载完毕再开始执行,如下:

<script type="text/javascript">
  $(document).ready(function () {
    // ...code to execute...
  });
</script>

这里对于新手经常会犯的错误是忽略了function,结果就是ready里面的语句会立刻执行,并不是等到文档加载完毕再去执行,观察下面两个语句的不同:

复制代码
<script type="text/javascript">
  function countImgElements() {
    return $('img').length;
  }
  $(document).ready(function() {
    console.log("Ready function invoked. IMG count: " + countImgElements());
  });
  $(document).ready(
    console.log("Ready statement invoked. IMG count: " + countImgElements())
  );
</script>
复制代码

为了实现同样的效果,你可以克制直接将函数作为参数传递给jQuery$函数,同样也是等到文档加载完毕后开始执行,如下:

复制代码
<script type="text/javascript">
  $(function() {
    $("img:odd").mouseenter(function(e) {
      $(this).css("opacity", 0.5);
    }).mouseout(function(e) {
      $(this).css("opacity", 1.0);
    })
  });
</script>
复制代码

  还可以控制ready时间执行的延迟时间,如下使用holdReay方法,必须在ready事件触发之前首先调用holdReay,当你准备好之后再次调用holdReady,如下:

复制代码
<script type="text/javascript">
  $.holdReady(true);
  $(document).ready(function() {
    console.log("Ready event triggered");
    $("img:odd").mouseenter(function(e) {
      $(this).css("opacity", 0.5);
    }).mouseout(function(e) {
      $(this).css("opacity", 1.0);
    })
  });
  setTimeout(function() {
    console.log("Releasing hold");
    $.holdReady(false);
  }, 5000);
</script>
复制代码

元素选择

  选择器是jQuery最常用的功能之一,如下选择所有基数位置的图片

复制代码
<script type="text/javascript">
  $(document).ready(function() {
    $("img:odd").mouseenter(function(e) {
      $(this).css("opacity", 0.5);
    }).mouseout(function(e) {
      $(this).css("opacity", 1.0);
    })
  });
</script>
复制代码

但是因为odd是从下标0开始的,所以这里的第一个元素实际上是偶数。

  jQuery支持所有的CSS选择器,同时还有一些自己的选择器扩展,例如:animated :contains(text) :eq(n) :even :first :gt(n) :has(selector) :last :lt(n) :odd :text,这些扩展选择很难用CSS表示,他们可以单独使用如$(':even')也可以与CSS选择器一起使用$('img:even')。此外jQuery还定义了一些类型选择器,如:button :checkbox :file :header :hidden :image :input :last :parent :password :radio :reset :selected :submit :visible 

使用上下文缩小选择范围

  默认情况下jQuery会搜索整个DOM文档来查找符合条件的元素,我们可以通过指定第二个参数来限制jQuery的搜索范围,如下

复制代码
<script type="text/javascript">
  $(document).ready(function() {
    $("img:odd", $('.drow')).mouseenter(function(e) {
      $(this).css("opacity", 0.5);
    }).mouseout(function(e) {
      $(this).css("opacity", 1.0);
    })
  });
</script>
复制代码

在这里当你提供了包含多个元素的上下文的时候,上下文的选择结果被集合到一起然后再进行逐查询,也就是同样一个元素在DOM和你设定的上下文中的序号可能是不一样的。

理解选择器结果

  当你使用jQuery选择器的时候,结果是jQuery对象,jQuery对象有可能是0个或者多个DOM元素。当使用jQuery对一个或多个元素进行操作的时候,其返回键诶过也是jQuery对象。jQuery对象中定义的属性和方法有如下:context;each(function);get(index) ;index(HTMLElement); index(jQuery); index(selector); length; selector; size(); toArray()。

  如可以使用selector来显示用来操作的选择符:

<script type="text/javascript">
  $(document).ready(function() {
    var selector = $("img:odd").selector
    console.log("Selector: " + selector);
  });
</script>

  context属性返回创建jQuery对象的时候的上下文,如果上下文是HTMLElement对象,那么就返回这个HTMLElemtn,如果没有上下文对象或者使用了多个元素作为上下文,那么返回的结果是undefined

复制代码
<script type="text/javascript">
  $(document).ready(function() {
    var jq1 = $("img:odd");
    console.log("No context: " + jq1.context.tagName);
    var jq2 = $("img:odd", $('.drow'));
    console.log("Multiple context elements: " + jq2.context.tagName);
    var jq3 = $("img:odd", document.getElementById("oblock"));
    console.log("Single context element: " + jq3.context.tagName);
  });
</script>
复制代码

从DOM对象创建jQuery对象

  可以通过将HTMLElement对象或者HTMLElement数组传入$函数来获得jQuery对象,从而方便操作,这在操作JavaScript代码的时候非常有用,如下:

复制代码
<script type="text/javascript">
  $(document).ready(function() {
    var elems = document.getElementsByTagName("img");
    $(elems).mouseenter(function(e) {
      $(this).css("opacity", 0.5);
    }).mouseout(function(e) {
      $(this).css("opacity", 1.0);
    })
  });
</script>
复制代码

将jQuery对象当成数组

  可以将jQuery对象当成HTMLElement对象数组来看待,也就是你可以通过length属性和数组风格的方式来操作jQuery对象内部的数据,你可以通过调用toArray方法来转换成HTMLElement对象的数组,这通常在不使用jQuery操作HTMLElement元素的时候非常有用:

复制代码
<script type="text/javascript">
    $(document).ready(function() {
        var elems = $('img:odd');
        for (var i = 0; i < elems.length; i++) {
            console.log("Element: " + elems[i].tagName + " " + elems[i].src);
        }
    });
</script>                        
复制代码

历遍DOM对象函数

  each方法允许你对每个jQuery对象中的DOM元素执行方法:

复制代码
<script type="text/javascript">
  $(document).ready(function() {
    $('img:odd').each(function(index, elem) {
      console.log("Element: " + elem.tagName + " " + elem.src);
    });
  });
</script>
复制代码

查找索引和特定元素

  index方法返回jQuery对象中HTMLElement元素的索引。你也可以传递一个HTMLElemtn或jQuery对象作为参数,当使用jQuery对象作为参数的时候,将会返回第一个匹配的元素的索引,如下:

复制代码
<script type="text/javascript">
  $(document).ready(function() {
    var elems = $('body *');
    // find an index using the basic DOM API
    var index = elems.index(document.getElementById("oblock"));
    console.log("Index using DOM element is: " + index);
    // find an index using another jQuery object
    index = elems.index($('#oblock'));
    console.log("Index using jQuery object is: " + index);
  });
</script>
复制代码

   你也可以传递一个字符串给index方法,字符串将会用来作为选择器,但是这样会使得index这个方法有不同的行为,jQuery使用这个选择器进行匹配元素,然后返回第一个匹配的元素在你调用这个方法的元素内的索引。

复制代码
<script type="text/javascript">
  $(document).ready(function() {
    var imgElems = $('img:odd');
    // find an index using a selector
    index = imgElems.index("body *");
    console.log("Index using selector is: " + index);
    // perform the same task using a jQuery object
    index = $("body *").index(imgElems);
    console.log("Index using jQuery object is: " + index);
  });
</script>
复制代码

  get方式是index方法的补充,通过传递元素的索引来获得索引,与使用数组的索引是一样的效果:

<script type="text/javascript">
  $(document).ready(function() {
    var elem = $('img:odd').get(1);
    console.log("Element: " + elem.tagName + " " + elem.src);
  });
</script>

更改多个元素和调用方法链

  jQuery的一个特点就是当一个jQuery调用一个方法的时候通常会对jQuery对象内所有的元素其作用,但是也有特殊的情况,因为并不是任何时候这样做都合理。如下面的代码中分别使用了两种不同的方法达到同样的效果:

复制代码
<script type="text/javascript">
  $(document).ready(function() {
    $('label').css("color", "blue");
    var labelElems = document.getElementsByTagName("label");
    for (var i = 0; i < labelElems.length; i++) {
      labelElems[i].style.color = "blue";
    }
  });
</script>
复制代码

  jQuery的另外一个特点是实现了流式API,这意味着不管你什么时候调用方法更改对象的内容,返回的结果总是另外一个jQuery对象,这个特点看起来简单,但是却能够让你实现方法的链条调用:

复制代码
<script type="text/javascript">
  $(document).ready(function() {
    $('label').css("color", "blue").css("font-size", ".75em");
    var labelElems = document.getElementsByTagName("label");
    for (var i = 0; i < labelElems.length; i++) {
      labelElems[i].style.color = "blue";
      labelElems[i].style.fontSize = ".75em";
    }
  });
</script>
复制代码

下面是一个更加复杂的例子

复制代码
<script type="text/javascript">
  $(document).ready(function() {
    $('label').css("color", "blue").add("input[name!='rose']")
          .filter(
"[for!='snowdrop']").css("font-size", ".75em");     var elems = document.getElementsByTagName("label");     for (var i = 0; i < elems.length; i++) {       elems[i].style.color = "blue";       if (elems[i].getAttribute("for") != "snowdrop") {         elems[i].style.fontSize= ".75em";       }     }     elems = document.getElementsByTagName("input");     for (var i = 0; i < elems.length; i++) {       if (elems[i].getAttribute("name") != "rose") {         elems[i].style.fontSize= ".75em";       }     }   }); </script>
复制代码

响应事件

  jQuery使用类似于方法的方式来调用事件,如下:

复制代码
<script type="text/javascript">
  $(document).ready(function() {
    $("img:odd").mouseenter(function(e) {
      $(this).css("opacity", 0.5);
    }).mouseout(function(e) {
      $(this).css("opacity", 1.0);
    })
  });
</script>
复制代码
posted @ 2012-09-28 20:23  尼姑哪里跑  阅读(160)  评论(0编辑  收藏  举报