第4章 jQuery与JavaScript的区别

jQuery是使用JavaScript写成的程序库,因此由jQuery实现的功能,单独使用JavaScript也一定能实现。

从实现同一功能所需要的代码来看,使用jQuery具有绝对的优势。代码不仅简短,而且非常直观。

编写JavaScript代码的方式有多种,本书采用的是相对标准的实现方式。

4.1 简单的DOM操作

在操作Web页面的DOM时,一般在JavaScript中使用document.getElementsByID或document.getElementsByTagName等DOM的标准方法;另外,还有处理不同浏览器的兼容问题。

这样的操作非常耗费精力,并且需要很高的编程能力,可以说是使用JavaScript时需要跨越的一大障碍。

使用jQuery时,只需要使用DOM元素检索使用的CSS选择器即可方便地实现DOM操作功能,并且其中已包含最新的浏览器兼容处理。

下面比较在相同的HTML文本中使用不同方法实现同一功能的代码,实现的功能是将DIV标签中类名为“testClass”的标签中的文字颜色变为红色。

HTML代码

              <!DOCTYPE  html  PUBLIC  "-//W3C//DTD  XHTML  1.0  Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
            <html xmlns="http://www.w3.org/1999/xhtml">
            <head>
              <meta  http-equiv="content-type"  content="text/html;
    charset=utf-8" />
            <title>test</title>
            </head>
            <body>
            <!-- 操作对象的DOM -->
            <div class="testClass">类名为testClass</div>
            <div class="testClass">类名为testClass</div>
            <div class="testClass">类名为testClass</div>
            <div>母DIV
              <div class="testClass">类名为testClass</div>
            </div>
            <div class="noTestClass">类名为noTestClass</div>
            <p class="testClass">类名为testClass的P标签</p>
            </body>
            </html>

JavaScript代码

            <script type="text/javascript">
            //检索DIV元素
            var divs = document.getElementsByTagName("div");
            //循环检索出的DIV元素
            for(var i=0;i<divs.length;i++){
              //因为在IE环境中有不同的属性值(className),所以追加相关判断
              //类名为“testClass”,进行颜色变换
              if((
                  divs[i].getAttribute("className") ||
                  divs[i].getAttribute("class")
              )=="testClass"){
                    //将颜色属性变为红色
                    divs[i].style.color = "red";
              }
            }
            </script>

jQuery代码

            <script src="jquery.js" type="text/javascript"></script>
            <script type="text/javascript">
            //将类名为“testClass”的DIV元素的文字颜色变为红色
            $("div.testClass").css("color","red");
            </script>

一般JavaScript的实现方法中首先需要使用document.getElementsByTagName方法检索所有的DIV元素,然后循环判断class属性,这时要使用DOM的getAttribute方法取得class名属性。由于IE与其他的浏览器的不同,因此必须考虑浏览器兼容处理问题。

这样的浏览器兼容问题随着浏览器或者版本的不同,在编程时必须兼顾。可想而知,不经过一定的经验积累无法编写出兼容性好的代码。

使用jQuery后只需要一行代码就可以实现所有的功能,在jQuery程序库中已经考虑浏览器兼容问题,不需要开发人员考虑。

$("div.testClass")部分与通常使用的CSS选择器的书写方法非常相似,颜色设定方法css("color","red")也非常直观。一行代码即可实现普通JavaScript需要十几行代码才能实现的功能,这正是jQuery的神奇之处。

4.2 Ajax的简单应用

jQuery曾被称为促进Ajax普及的一个主要JavaScript程序库,即Ajax库。Ajax是通过在JavaScript中使用浏览器中包含的HTTP通信功能来实现不用跳转页面即可实现页面局部内容更新的技术。实际上,在不同的浏览器间还存在微妙的差别,在JavaScript中从零开始实现Ajax功能需要花费一些时间。

下面以在文本文件test.txt中读取信息后显示在页面上的应用为例,文本文件中只有一些简单的信息,如“欢迎您”。读入的信息将显示在DIV元素中。

HTML代码

            <html xmlns="http://www.w3.org/1999/xhtml">
            <head>
              <meta  http-equiv="content-type"  content="text/html;
    charset=utf-8" />
            <title>test</title>
            </head>
            <body>
            <!--操作对象的DOM-->
            <div class="testClass">显示文字内容</div>
            </body>
            </html>

JavaScript代码

            <script type="text/javascript">
            //XHR对象生成函数
            function createHttpRequest(){
                return
                    window.ActiveXObject?
                    //Win IE用
                    new ActiveXObject("Msxml2.XMLHTTP")||
                    new ActiveXObject("Microsoft.XMLHTTP") :
                    //Win Mac Linux fireFox,opera,safari等用
                    new XMLHttpRequest();
            }
            function sendRequest(id,url){
              //生成XHR对象
              var obj = createHttpRequest();
              //接受callback方法
              obj.onreadystatechange = function(){
                    if(obj.readyState == 4){
                          //接受时(obj.readyState == 4)
                          //将结果显示在对应的元素中
                            document.getElementById(id).innerHTML=obj.
    responseText;
                    }
              }
              //open方法
              obj.open("GET",url);
              //send方法
              obj.send("");
            }
            //使用Ajax显示文件的内容
            sendRequest("testDiv","test.txt");
            </script>

jQuery代码

            <script src="jquery.js" type="text/javascript"></script>
            <script type="text/javascript">
            //将从文件test.txt中读取的信息放在ID名为“testDiv”的元素中
            $("#testDiv").load("test.txt");
            </script>

生成XMLHttpRequest对象的浏览器兼容处理的编写方式有多种,这里采用jQuery中的如下方式:

          Window.ActiveXObject ? new ActiveXObject(“Microsoft.XMLHTTP”) :
    new XMLHttpRequest();

其中在浏览器中安装ActiveXObject时,使用Microsoft.XMLHTTP来生成XHR对象;否则使用XMLHttpRequest。

使用一般的JavaScript来完成同样的功能首先要生成XHR对象,然后用其按顺序执行open、send及onreadystatechange等命令。如果省略这段代码,则向服务器送出Form数据时,还必须由开发人员来设定URLEncode和HTTP头等满足Web标准的信息;另外,在生成XHR对象的部分因浏览器的不同实现方法的差异,所以必须考虑如同createHttpRequest函数中所做的浏览器兼容处理。

jQuery的相关代码简洁很多,指定了输出对象元素的ID后使用load方法读入test.txt文件即可。

自从Ajax流行以来,在JavaScipt的程序中经常会用到它,而使用jQuery后代码变得更加简洁。

实现结果如图4-1和图4-2所示。

图4-1 实现结果(1)

图4-2 实现结果(2)

4.3 实现简单的渐入/渐出效果

在JavaScript中操作CSS的opacity属性可以实现DOM元素的渐入/渐出效果,需要注意的是因为在IE中相关属性的处理与其他浏览器有细微不同,所以要区分不同浏览器的处理逻辑。

渐入/渐出的编码方式有多种,下面的代码对ID为test的DIV元素实现渐入后执行渐出。

HTML代码

            <html xmlns="http://www.w3.org/1999/xhtml">
            <head>
              <meta  http-equiv="content-type"  content="text/html;
    charset=utf-8" />
            <title>test</title>
            <style type="text/css">
          #test{width:100px;height:100px;background-
    color:yellow;display:none}
            </style>
            </head>
            <body>
            <!--操作对象的DOM-->
            <div id="test"></div>
            </body>
            </html>

JavaScript代码

            <script type="text/javascript">
            fadeOpacity(“test”,-1);//渐入
            fadeOpacity(“test”,1);//渐出
            //渐入/渐出函数
            function fadeOpacity(id,swt,callback){
              //计数初始化
              if(!window.fadeOpacity[id]) fadeOpacity[id]= 0;
              //参数swt为-1时,向透明变化;为1时,向非透明变化
              var f = (swt==1)?"0123456789":"9876543210";
              //渐入/渐出处理
              if(fadeOpacity[id] < f.length-1){
                    var opa = f.charAt(fadeOpacity[id])/10;
                    if( opa*10 == 10 ) return;
                    SetOpacity(id,opa);//改变不透明度
                    //200/1000秒后执行fadeOpacity
                    setTimeout('fadeOpacity("'+id+'","'+swt+'")',200);
              }else{//结束
                    SetOpacity(id,(swt==1)?10:0);
                    fadeOpacity[id]= null;
              }
              //计数增加
                fadeOpacity[id]++;
            }
            //不透明度设置函数
            function SetOpacity(id,arg){
                if(document.all){
                    document.all(id).style.filter = "alpha(opacity="+(arg * 100)+")";
                }else if(document.getElementById) document.getElementById(id).
    style.opacity =arg
            }
            </script>

jQuery代码

            <script src="jquery.js" type="text/javascript"></script>
            <script type="text/javascript">
            $("#test")
                .fadeIn(2000)//渐入
                .fadeOut(2000)//渐出
            </script>

在上面的代码中通过每次改变不透明度1的同时,使用setTimeout函数每隔200/1000秒执行前后10次的画面更新来实现对象元素的渐入/渐出效果,其中包括IE中使用的style.filter与其他浏览器中使用的style.opacity的不同处理。

与此对照的是jQuery中使用$("#test")选中DOM元素,然后使用fadeIn()与fadeOut()方法直接实现了渐入/渐出效果,其中参数2000指定每隔2000微秒(2秒)变化一次。

4.4 事件处理

在一般的JavaScript编程中,因为事件处理涉及浏览器兼容,所以这是最让开发人员头痛的问题。这主要是因为IE中的事件处理的重要部分未遵循W3C标准,但其占据了很大的市场份额,所以不能忽视。

使用jQuery完全不用考虑浏览器的不同,而且可比普通方法更简单地实现事件处理。

下面是一个非常简单的实例,即当单击testClick元素时,在其下方的test元素中显示不同的文字。

HTML代码

            <html xmlns="http://www.w3.org/1999/xhtml">
            <head>
                  <meta  http-equiv="content-type"  content="text/html;
    charset=utf-8" />
            <title>test</title>
            </head>
            <body>
            <!--操作对象的DOM-->
            <div id="testClick">单击此处</div>
            <div id="test">在此显示新内容</div>
            </body>
            </html>

JavaScript代码

            <script type="text/javascript">
            //向ID为test的元素设定值函数
            function outputHTML(){
              var test = document.getElementById("test");
              test.innerHTML = "欢迎您!";
            }
            //向ID为testClick元素中追加事件处理函数
            function setEvent(){
              //取得testClick元素
              var el = document.getElementById("testClick");
              if(el.addEventListener){
                    //IE以外用
                    el.addEventListener('click',outputHTML,false);
              }else if(el.attachEvent){
                    //IE用
                    el.attachEvent('onclick',outputHTML);
              }
            }
            //页面导入时执行
            window.onload=function(){
              setEvent();
            }
            </script>

jQuery代码

            <script src="jquery.js" type="text/javascript"></script>
            <script type="text/javascript">
            //准备DOM后执行function中的内容
            jQuery(function($){
              //ID为testClick的元素被单击后执行的函数
              $("#testClick").click(function(){
                    //在ID为test的元素中显示“欢迎您!”
                    $("#test").html("欢迎您!");
              });
            });
            </script>

提示

jQuery代码中实现click事件的语法$("选择").click(function(){代码})中的[click]部分可以替换为事件名,包括blur、focus、load、resize、scroll、unload、click、dbclick、mousedown、mouseup、mousemove、mouseover、mouseout、mouseenter、mouseleave、change、select、submit、keydown、keypress、keyup,以及error。

在JavaScript代码中编写了注册单击testClick元素时的Click事件处理函数setEvent,以及输出文本内容的函数outputHTML。在函数setEvent中注册事件处理时分别使用了Web标准的addEventListener及IE独有的attachEvent方法,事先应判断这两种方法是否存在。

为了在页面中能响应事件,必须在页面导入时注册事件处理,本例在window.load事件处理中执行setEvent函数。

与此对照的是使用jQuery后,如下3步实现相同的功能。

(1)准备DOM后执行相关处理注册。

(2)注册ID为testClick元素的click事件处理。

(3)编写ID为test的元素的处理过程。

以上过程几乎是定型化处理,非常简洁明了。

实现结果如图4-3和图4-4所示。

图4-3 实现结果(3)

图4-4 实现结果(4)

4.5 实现复杂的动画效果

可以通过操控DOM对象元素的CSS属性来控制DOM元素的移动、扩大、缩小及透明、非透明等效果,本节演示如何利用jQuery实现一系列连续的动画效果动作。

如果利用一般的JavaScript来实现这些效果,因为要保证效果的平滑显示,必须不仅要执行计算复杂的代码并不断改变的步长(step),而且还要兼顾不同浏览器的兼容性,所以要编写一段长而复杂的代码。因为代码长而复杂,所以此处略去JavaScript代码。

HTML代码

            <html xmlns="http://www.w3.org/1999/xhtml">
            <head>
            <meta http-equiv="content-type" content="text/html; charset=utf-8" />
            <title>test</title>
            <style type="text/css">
              #test{  width:100px;height:100px;background-color:yellow;
    display:none }
            </style>
            </head>
            <body>
            <!--操作对象的DOM-->
            <input type="button" id="btn1" value="GO!"/>
            <div id="test"></div>
            </body>
            </html>

一般的JavaScript代码选择要实现动画演示的DOM对象,依次计算指定的width、height、left、top和opacity步长,并借助timer反复设置这些属性值,最后在windows.onload事件处理中注册事件处理过程。

jQuery代码

            <script src="jquery.js" type="text/javascript"></script>
            <script type="text/javascript">
            //准备DOM后执行function内的内容
            jQuery(function($){
                //按钮被单击后执行的函数
                $("#btn1").click(function(){
                    //test元素的系列动作
                    $("#test")
                          .empty()                      //清空元素
                          .animate({width:30})          //宽增加30 px
                          .animate({height:30},1000)    //在1秒之内将高增加30px
                          .animate({left:300})          //向右移动300 px
                          .animate({top:200})           //向下移动200 px
                          .animate({left:"-=300"})      //向左移动-300 px
                          .animate({top:"-=200"})       //向上移动-200 px
                          .animate({opacity:0.5})       //将不透明度变为0.5
                          .animate({width:300},2000)    //在2秒内将宽度增加300px
                          .fadeOut()                    //渐出
                          .slideDown()                  //幻灯点灭效果
                          .slideUp()                    //幻灯点亮效果
                          .fadeIn("slow")               //渐入(缓慢的)
                          .animate({height:30},         //高度增加300 px
                                function(){
                                                        //动作结束后显示文字
                                      $(this).html("动画结束");
                                }
                          )
                });
            });
            </script>

单击按钮后演示一系列设定的动画动作。在$("#test")后从empty()开始设定了一系列的方法,通常称为“方法链”(method chain),这是jQuery的特征之一。

这样使用jQuery很方便地实现了对同一DOM元素实现一系列动画效果的演示,简洁而易懂。以为方法传递的参数,如width、height、left、top和opacity等为例,只要稍有关于CSS的基本知识即可很直观地理解。

如果需要制作更高级的效果或功能,可以利用不断丰富的jQuery插件(Plugin),以及jQuery UI等扩展程序库。

实现结果如图4-5所示。

图4-5 实现结果