3.2 JQuery的基本功能

3.2.1 引用JQuery类库

JQuery提供了很多Javascript类库,这些类库中包含大量的应用程序编程接口(ApplicationProgrammingInterface, API)。要使用类库中的API,就必须在页面文件中添加对JQuery文件及类库文件的引用。引用步骤如下:

(1)新建一个名为“JQuery练习”的ASP.NetWeb应用程序MVC项目。

(2)右击该项目,依次选择“添加(D)”→“新建项(W)...”,在弹出的对话框中依次选择Web→HTML页,并将其命名为“引用JQuery.html”文件。

(3)单击“添加(A)”按钮,VisualStudio2013将在“JQuery练习”项目中生成一个新的名为“引用JQuery.html”的文件。

(4)打开“引用JQuery.html”文件,在<title></title>标签后添加下面的代码即可。

        <script src="Scripts/jquery-1.10.2.min.js"type="text/javascript"></script>

3.2.2 选择器

当要操作页面上的元素时,需快速定位到页面上的目标元素,在JavaScript中一般使用document.getElementById获得。在JQuery中,有多种方法可以快速获取元素,元素选择器和属性选择器允许开发者通过标签名、属性名或内容对HTML元素进行选择,选择后可对HTML元素组或单个元素进行操作。

1.使用CSS选择器来选取HTML元素

$("#txtName"):选取id="txtName"的元素。

$("p"):选取页面中所有的<p>元素。

$("p.intro"):选取所有class="intro"的<p>元素。

$("p#demo"):选取所有id="demo"的<p>元素。

2.使用XPath表达式来选择带有给定属性的元素

$("[href]"):选取所有带有href属性的元素。

$("[href='#']"):选取所有带有href值且等于“#”的元素。

$("[href! ='#']"):选取所有带有href值且不等于“#”的元素。

$("[href$='.jpg']"):选取所有href值以“.jpg”结尾的元素。

【实例】 获取页面中id为txtAge的元素并显示其属性id的值,获取页面上所有的段落标签并显示总数。

HTML代码如下:

        <body>
            <input type="text" id="txtAge" />
            <p>这是第一段</p>
            <p>这是第二段</p>
            <p>这是第三段</p>
        </body>

实现步骤:

(1)打开“引用JQuery.html”页面。

(2)用上述HTML代码覆盖“<body></body>”代码。

(3)在<header></header>标签中添加JavaScript方法的代码,如下所示。

        <script type="text/javascript">
            function count()
            {
                //alert()用于弹出提示框;
                //$("#txtAge"):获取id为txtAge的控件
                //attr()为JQuery内置函数,获取id的值
                alert($("#txtAge").attr("id"));
                alert($("p").length);  //$("p")用于获取所有元素,返回一个数组,length用
                                      于得到数组的长度
            }
        </script>

(4)在<body>标签中为onload事件添加执行函数,该函数将在页面加载完成后执行,代码如下:

        <body onload="count()">

(5)右击,选择“在浏览器中查看”命令,程序的运行效果如图3-1所示。

图3-1 JQuery选择器的运行结果

3.2.3 将DOM对象转换成JQuery对象

文档对象模型(DocumentObject Model, DOM)是万维网联盟(The World Wide WebConsortium, W3C)组织推荐的处理可扩展标志语言的标准编程接口,它是以面向对象方式描述的文档模型。使用JQuery获得的MOM对象既包含了DOM对象的基本特性又进行了扩展,所以要使用JQeury操作DOM对象前需要对其进行转换,在JQuery中可以使用关键字“$()”将普通HTML DOM对象转换为JQuery DOM对象。如:$(document.getElementById("msg"))为JQuery对象,转换后可以使用JQuery方法。

3.2.4 操作DOM元素的集合

1.获取集合中的元素

对于获取的元素集合,获取其中的某一项(通过索引指定)可以使用eq、get(n)方法或索引号获取。要注意,eq返回的是JQuery对象,而get(n)和索引返回的是DOM元素对象。对于JQuery对象只能使用JQuery的方法,而DOM对象只能使用DOM的方法,如要获取第三个<div>元素的内容。有如下两种方法:

        $("div").eq(2).html();              //调用JQuery对象的方法
        $("div").get(2).innerHTML;          //调用DOM中方法的属性

2.用同一函数实现set和get方法

JQuery主要包括如下几个语句:

        $("#msg").html();             //返回id为msg的元素节点的HTML内容。
        $("#msg").html("<b>new content</b>");
        //将“<b>new content</b>”作为HTML串写入id为msg的元素节点内容中,页面显示粗体
        的“new content”

        $("#msg").text();             //返回id为msg的元素节点的文本内容。
        $("#msg").text("<b>new content</b>");
        //将“<b>new content</b>”作为普通文本串写入id为msg的元素节点内容中,页面显示
        “<b>new content</b> ”

        $("#msg").height();           //返回id为msg的元素的高度
        $("#msg").height("300");    //将id为msg的元素的高度设为300
        $("#msg").width();            //返回id为msg的元素的宽度
        $("#msg").width("300");     //将id为msg的元素的宽度设为300

        $("input").val(");           //返回表单输入框的value值
        $("input").val("test");     //将表单输入框的value值设为test

        $("#msg").click();            //触发id为msg的元素的单击事件
        $("#msg").click(fn);          //为id为msg的元素单击事件添加函数

同样,blur、focus、select、submit事件都可以有两种调用方法。

3.集合处理功能

对于JQuery返回的集合内容无须手工循环遍历并对每个对象分别做处理,JQuery已经提供了很方便的方法进行集合的处理。主要包括两种形式:

        //为索引为0、1、2的p元素分别设定不同的字体颜色
        $("p").each(function(i){this.style.color=['#f00', '#0f0', '#00f'][ i ]});
        //实现表格的隔行换色效果
        $("tr").each(function(i){this.style.backgroundColor=['#ccc', '#fff'][i% 2]});
        //为每个p元素增加了click事件,单击某个p元素则弹出其内容
        $("p").click(function(){alert($(this).html())});

4.扩展需要的功能

        $.extend({
        min: function(a, b){return a <b? a:b; },
        max: function(a, b){return a >b? a:b; }
        });       //为JQuery扩展了min、max两个方法
        alert("a=10, b=20, max="+$.max(10,20)+", min="+$.min(10,20));
                                                    //使用扩展的方法(通过“$.方法名”调用)

5.方法连写

所谓连写,就是可以对一个JQuery对象连续调用各种不同的方法。例如:

        $("p").click(function(){alert($(this).html())})
        .mouseover(function(){alert('mouse over event')})
        .each(function(i){this.style.color=['#f00', '#0f0', '#00f'][ i ]});

6.操作元素的样式

主要包括以下几种方式。

        $("#msg").css("background");           //返回元素的背景颜色
        $("#msg").css("background", "#ccc"); //设定元素背景为灰色
        $("#msg").height(300); //设定元素的高度
        $("#msg").width("200"); //设定元素的宽度
        $("#msg").css({color: "red", background: "blue"}); //以名值对的形式设定样式
        $("#msg").addClass("select");         //为元素增加名称为select的类
        $("#msg").removeClass("select");      //删除元素名称为select的类
        $("#msg").toggleClass("select");      //如果存在(不存在),就删除(添加)名称为select的类

7.事件处理功能

JQuery提供了各种事件处理方法,开发者可以直接为通过JQuery获取的对象添加事件。如:

        $("#msg").click(function(){alert("good")});  //为元素添加了单击事件

8.JQuery的自定义事件

(1)hover(fn1, fn2)事件。一个模仿悬停事件(鼠标光标移动到一个对象上面及移出这个对象)的方法。当鼠标光标移动到一个匹配的元素上面时,会触发指定的第一个函数。当鼠标光标移出这个元素时,会触发指定的第二个函数。

        //当鼠标光标放在表格的某行上时将类置为over,离开时将类置为out
        $("tr").hover(function(){
        $(this).addClass("over");
        },
        function(){
        $(this).addClass("out");
        });

(2)ready(fn)事件。当DOM载入后可以查询及操纵时可以绑定一个要执行的函数。

        $(document).ready(function(){alert("Load Success")});
        //页面加载完毕提示“Load Success”,相当于onload事件。与$(fn)等价

(3)toggle(evenFn, oddFn)事件。每次单击时切换要调用的函数。如果单击了一个匹配的元素,则触发指定的第一个函数。当再次单击同一元素时,则触发指定的第二个函数。随后的每次单击都重复对这两个函数进行轮番调用。

        //每次单击时轮换添加和删除名为selected的类
        $("p").toggle(function(){
          $(this).addClass("selected");
        },
        function(){
          $(this).removeClass("selected");
        });

(4)trigger(eventtype)事件。在每一个匹配的元素上触发某类事件。例如:

        $ ("p").trigger("click");    //触发所有p元素的click事件

(5)bind(eventtype, fn), unbind(eventtype)事件。用于事件的绑定与反绑定,从每一个匹配的元素中(添加)删除绑定的事件。例如:

        $("p").bind("click", function(){alert($(this).text()); });
                                                          //为每个p元素添加单击事件
        $("p").unbind();                                //删除所有p元素上的所有事件
        $("p").unbind("click");                       //删除所有p元素上的单击事件

9.特效功能

(1)toggle()和slidetoggle()方法提供了状态切换功能。

(2)如toggle()方法包括了hide()和show()方法,即将对象在显示和隐藏之间切换。

(3)slideToggle()方法包括了slideDown()和slideUp方法,可以实现将动画向上、向下的功能。

10.其他实用功能

(1)浏览器类型。“$.browser.浏览器类型”语句用于检测浏览器的类型,有效参数可以为safari、opera、msie、mozilla。如检测是否是IE浏览器可用如下代码,是ie浏览器则返回true:$.browser.isie。

(2)$.each(obj, fn)是通用的迭代函数,可用于近似地迭代对象和数组(代替循环)。如:

        $.each( [0,1,2], function(i, n){ alert( "Item #" +i +": " +n ); });

等价于

        var tempArr=[0,1,2];
        for(var i=0; i<tempArr.length; i++){
            alert("Item #"+i+": "+tempArr[ i ]);
        }

(3)使用$each也可以处理json数据。如:

        $.each( { name: "John", lang: "JS" }, function(i, n){ alert( "Name: " +i +",
        Value: " +n ); });

结果为:

        Name:name, Value:John
        Name:lang, Value:JS

11.解决冲突

JQuery可以解决自定义方法或其他类库与JQuery之间的冲突,很多时候自定义$(id)方法来获取一个元素,或者其他的一些JavaScript类库。如prototype也都定义了$方法,如果同时把这些内容放在一起就会引起变量方法定义的冲突,JQuery对此专门提供了方法用于解决此问题。使用JQuery中的JQuery.noConflict()方法即可把变量$的控制权让给第一个实现它的那个库或之前自定义的$方法。之后应用JQuery的时候,只要将所有的$换成JQuery即可,比如可将原来引用对象的方法$("#msg")改为JQuery("#msg")。如:

        //开始使用JQuery
        JQuery.noConflict();
        JQuery("div p").hide();
        //使用其他库的 $()
        $("content").style.display ='none';

12.编写插件

编写插件的目的是给已经有的一系列方法或函数做一个封装,以便在其他地方重复使用,方便后期的维护。JQuery除了提供一个简单、有效的方式进行元素以及脚本管理,它还提供了一种例外机制:即给核心模块增加自己的方法和额外的功能。通过这种机制,Jquery允许创建属于我们自己的插件,以便提高在开发过程中的效率。编写插件时应注意:

(1)插件的推荐命名方法为:

        jquery.[插件名].js

(2)所有的对象方法都应当附加到JQuery.fn对象上面,而所有的全局函数都应当附加到JQuery对象本身上。

(3)在插件内部,this指向的是当前通过选择器获取的JQuery对象,而不像一般方法那样,内部的this指向的是DOM元素。

(4)可以通过this.each来遍历所有的元素。

(5)所有方法或函数插件都应当以分号结尾,否则压缩的时候可能会出现问题。为了更加保险,可以在插件头部添加一个分号(;),以免它们的不规范代码给插件带来影响。

(6)插件应该返回一个JQuery对象,以便保证插件的可链式操作。

(7)避免在插件内部使用$作为JQuery对象的别名,而应当使用完整的JQuery来表示,这样可以避免冲突。

JQuery的插件分为封装对象方法、封装全局函数等两种类型。

(1)封装对象方法的插件,也就是对象级别的开发。

(2)封装全局函数的插件(类级别的开发),指可以把独立的函数添加到JQuery命名空间之下,与调用函数的方法一样。

【实例】 添加一个JQuery插件,使其显示消息提示框。

实现步骤:

(1)创建一个名为“JQuery练习”的解决方案和ASP.NetWeb项目。

(2)在Scripts文件夹下新建一个名为“jquery.JQueryPlugIntest.js”的JavaScript文件,并添加下面的代码:

        jQuery.testPlugIn =function () {
            alert("This is a test. This is only a test.");
        };

(3)在“JQuery练习”项目下新建一个名为“testPlugIn.html”的HTML页面。

(4)打开testPlugIn.html页面,添加对JQuery文件和“jquery.JQueryPlugIntest. js”文件的引用,并添加调用新插件的函数,代码如下:

        <script src="Scripts/jquery-1.10.2.min.js"></script>
        <script src="Scripts/jquery.plugIntest.js"></script>
        <script type="text/javascript">
            function test() {
                $.testPlugIn();    //调用插件"jquery.JQueryPlugIntest.js"中的函数
            }
        </script>

(5)在<body></body>标签中添加测试按钮,代码如下:

        <input type="button" onclick="test()" value="测试JQuery插件" />

(6)单击“测试JQuery插件”按钮,界面如图3-2所示。

图3-2 JQuery运行示例