Posts Tagged ‘jQuery’

滚动条触发的内容动态加载效果

星期一, 07月 26th, 2010

    效果介绍文章:分页加载数据效果的新颖改进:
    http://blog.why100000.com/?p=823

    技术细节:jQuery 的 Div 标签滚动条属性及判断垂直滚动条是否到达底部:
    http://blog.why100000.com/?p=843

    开发环境:jQuery1.4.2,Ajax,PHP5.2.5。
    测试环境:IE7、IE8、FF3.6.2

    效果:
    页面打开时,加载了一些初始内容。
    下拉滚动条,到底部时触发事件,从 Web 服务器后台实时下载内容,添加到页面的底部。

    效果演示:http://www.why100000.com/test/scrolldown/scrolldown.htm
    需要代码及资料的,发邮件到:9365822@QQ.com

jQuery 的 Div 标签滚动条属性及判断垂直滚动条是否到达底部

星期五, 07月 9th, 2010

    关于 jQuery 的 Div 标签的滚动条的概念,没有几个人能够完全、正确搞明白的。

    我知道很多人不同意我的观点。但是如果去百度上搜素,与 jQuery 滚动条有关的信息,都是关于滚动条外观和滚动条插件的。我最近在制作一个滚动条相关的页面效果,去 CSDN 论坛里提问,得到了一段代码,还是错误的。

    jQuery 里和滚动条有关的概念很多,但是有三个属性和滚动条的拖动有关,就是:scrollTop、scrollLeft、scrollHeight。其中 scrollHeight 属性,互联网上几乎搜素不到关于它的应用技巧,而我正好需要用到它。

    我们现在只探讨和垂直滚动有关的 scrollTop、scrollHeight 属性。

    一、滚动条有关属性的正确理解:

    假设有以下Html代码:

    <div id="div1" style="overflow-y:auto; overflow-x:hidden; height:500px;">
      <div style="height:750px;">
      </div>
    </div>

    由于内部的div标签高度比外部的长,并且外部的div允许自动出现垂直滚动条,所以用浏览器打开后,可以看到垂直滚动条。滚动条向下拖动一段距离,看到的页面效果如下(右部的a、b是我抓图后,用PS标出来的):

jQuery 的 Div 标签滚动条属性及判断垂直滚动条是否到达底部

    那么,这里的外部div 的scrollTop、scrollHeight 属性到底是什么呢?
    有人说,scrollTop等于图中标出的a。scrollHeight 等于外部div的高度500px。其实,都不对。
    其实,图中标出的a、b,对我们编程写js代码没有任何具体意义,它仅仅具有象征意义。
    实际上,在js代码里,滚动条是被抽象为一个“点”来对待的。scrollHeight其实不是“滚动条的高度”(b),而是表示滚动条需要滚动的高度,即内部div的高度750px。而scrollTop表示滚动条(一个点)当前的位置在750px里占了多少,不是图中标出的a。
    这时,我们很叹服Windows的设计者,滚动条设计的如此形象美妙,欺骗了多少头脑简单的鼠标操作员。a和b的距离分别标识滚动条滚动了和需要滚动的距离,它们之间分别有一个对应的关系,但这些不是我们这些开发应用程序的程序员考虑的,是设计操作系统GUI图形接口的程序员考虑的。

    二、判断垂直滚动条是否到达底部
    廓清了以上的概念,编码其实就比较简单了, 以下是示例代码:
    <!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>
      <meta http-equiv="content-type" content="text/html;charset=utf-8">
      <title>下拉滚动条滚到底部了吗?</title>
      <script language="javascript" src="jquery-1.4.2.min.js" mce_src="jquery-1.4.2.min.js"></script>
      <script language="javascript">
      $(document).ready(function (){
        var nScrollHight = 0; //滚动距离总长(注意不是滚动条的长度)
        var nScrollTop = 0;   //滚动到的当前位置
        var nDivHight = $("#div1").height();

        $("#div1").scroll(function(){
          nScrollHight = $(this)[0].scrollHeight;
          nScrollTop = $(this)[0].scrollTop;
          if(nScrollTop + nDivHight >= nScrollHight)
            alert("滚动条到底部了");
          });
      });
      </script>
    <body>
    <div id="div1" style="overflow-y:auto; overflow-x:hidden; height:500px;">
      <div style="background-color:#ccc; height:750px;">IE 和 FF 下测试通过</div>
    </div>
    </body>
    </html>
    代码解说:
    内部div高度为750,外部div高度为500,所以垂直滚动条需要滚动750-500=250的距离,就会到达底部,参见语句nScrollTop + nDivHight >= nScrollHight。
    程序中,在外部div的scroll(滚动)事件中侦测和执行if判断语句,是非常消耗CPU资源的。用鼠标拖拉滚动条,只要有一个像素的变动就会触发该事件。但点击滚动条两头的箭头,事件触发的频率会低得多。所以滚动条的scroll事件要谨慎使用。
    本示例判断的是没有水平滚动条的情况,在有水平滚动条时,情况会有细小的变化,所以nScrollTop + nDivHight >= nScrollHight语句中,需要用“>=”比较运算符,而没有水平滚动条的时候,等号“=”就足够了。大家可以实际测试一下。还可以判断水平滚动条是否滚动到头了。

    三、题外话
    判断垂直滚动条是否拖动到头了,是为了实现滚动条拖动时实时动态的从Web服务器获取内容的效果,这个我在文章《分页加载数据效果的新颖改进》中提到过,网址:
    http://blog.why100000.com/?p=823
    有了以上的前端jQuery代码实现,再结合Ajax技术,是很容易达到目的的。测试代码地址:
    http://www.why100000.com/test/scrolldown/scrolldown.htm

    作者:张庆(网眼) 西安 PHP 教育培训中心 2010-7-9
    来自“网眼视界”:http://blog.why100000.com
    作者微博:http://t.qq.com/zhangking
    “十万个为什么”电脑学习网:http://www.why100000.com

模仿QQ空间留言板异步加载编辑器

星期二, 02月 16th, 2010

    <textarea id="depict" name="depict"></textarea>
    <script language="javascript" type="text/javascript" src="__PUBLIC__/Js/jquery.js" mce_src="__PUBLIC__/Js/jquery.js"></script>
    <script language="javascript" type="text/javascript">

    // 初始化编辑器路径
    var fckpath = '__PUBLIC__/fckeditor/';

    // 监听文本域点击事件, 响应后加载编辑器。
    $('textarea').bind("click", function(){
        $.getScript("__PUBLIC__/fckeditor/fckeditor.js");
        $.getScript("__PUBLIC__/Js/Common.js", function(){
          fckObj('depict', 150, 400, 'Basic'); //初始化编辑器
         });
    });
    </script>

Tab页界面之二,jQuery技术实现

星期一, 09月 21st, 2009

    这个tab页是把数据全部取回来再显示,所以没有数据缓存的特点。但是因为数据全部是显示的html代码,所以对搜索引擎是友好的,也许对seo有好处。

    代码特点:
    1,完全实现Tab逻辑功能,Tab的样式完全交由前端代码控制,很灵活。
    2,tab页触发事件是click。
    3,界面以table布局,只需要配置关键对象的class和id 即可工作。

<!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>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>我的Tabs选项卡</title>
<style type="text/css">
  body {font-size:12px; }
  .tab {background:url(images/gray.png); cursor:hand;}
</style>
<script type="text/javascript" src="jquery/jquery-1.2.6.min.js" mce_src="jquery/jquery-1.2.6.min.js"></script>
<script type="text/javascript">
  $(document).ready(function()
  {
  //-------------------------
    var tabclass = ".tab"; //tab 数组 id
    var tabs = ["#tab1", "#tab2", "#tab3"]; //tab 数组 id
    var datas = ["#data1", "#data2", "#data3"];

    var tab_selected_bgimg = "images/green.png";
    var tab_unselected_bgimg = "images/gray.png";

    var tab_selected_txtcolor = "#ff6600";
    var tab_unselected_txtcolor = "#666666";

    var curr_index;
    $(tabclass).click(function()
    {
      for(var i=0;i<tabs.length;i++)
      {
        if($(tabs[i]).attr("id")==$(this).attr("id"))
        {
          curr_index = parseInt(i)+1;
        }
        $(tabs[i]).css("background-image", "url("+ tab_unselected_bgimg +")");
        $(tabs[i]).css("color", tab_unselected_txtcolor);
        $(datas[i]).hide();
      }
      $(this).css("background-image", "url("+ tab_selected_bgimg +")");
      $(this).css("color", tab_selected_txtcolor);
      $("#data"+curr_index).show();
    });
    $("#tab1").click();
  //-----------------
  });

</script>

</head>

<body>

<table border="0" width="500" height="25" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
  <td width="97" class="tab" id="tab1">tab1</td>
  <td width="30"></td>
  <td width="97" class="tab" id="tab2">tab2</td>
  <td width="30"></td>
  <td width="97" class="tab" id="tab3">tab3</td>
  <td width="149"></td>
</tr>
</table>

<table border="1" width="500" height="60" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
  <td>
    <div id="data1">
      this is data1
    </div>
    <div id="data2">
      this is data2
    </div>
    <div id="data3">
      this is data3
    </div>
  </td>
</tr>
</table>

</body>

张庆(网眼) 2009-9-20
来自“网眼视界”:http://blog.why100000.com
“十万个为什么”电脑学习网:http://www.why100000.com

Tab页界面,用jQuery及Ajax技术实现

星期六, 09月 19th, 2009

    从桌面开发的时代开始,Tab页就是一个优异的界面布局形式,兼有菜单的样式和充分复用有限的界面的优点。
    到了B/S开发时代,网页前端布局也把Tab页的布局形式吸收了过来。特别是和Ajax技术结合起来,可以更充分发挥Tab页的良好表现力和数据缓存的优势,是一种良好的网页布局形式。
    网上的Tab页代码很多,实现也大同小异 ,但代码都显得凌乱,若要真的用的话,必须费劲的吃透它,才能进行二次定制开发,为我所用。实际上实现这个Tab页界面非常简单,仅仅是通过Ajax技术偷偷的获取信息,然后在一块区域轮流显示而已(通过显示和隐藏层,或复用一个层,轮流向里边填充Html数据)。
    自己的开发的代码自己最清楚,用起来也应该最顺手,要扩展的话脑子也不犯晕。代码如下,还在不断修改中。

    代码特点:
    1,完全实现Tab逻辑功能,Tab的样式完全交由前端代码控制,十分灵活。
    2,使用Ajax技术,数据从服务器端按需取用,改善了前端的界面观感,提高了页面的性能。在重新浏览器窗口前,所有已经加载的tab页的数据被缓存在浏览器端,不再从服务器端调取,大大节约了网络带宽,改善了界面的性能。
    3,tab页触发可以根据需要选用click或mouseover等事件。
    4,可以配置tab加载后默认触发的页。
    5,界面以table布局,只需要配置关键对象的 id 即可工作。

<!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>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>我的Tabs选项卡(Ajax版本)</title>
<style type="text/css">
  body {font-size:12px; }
  #tab0,#tab1,#tab2 {background:url(images/gray.png); cursor:hand;}
</style>
<script type="text/javascript" src="jquery/jquery.js"></script>
<script type="text/javascript">
  $(document).ready(function()
  {
  //-------------------------
    //tabs 配置信息
    var tabs = ["#tab0", "#tab1", "#tab2"]; //tab 数组 id
    var datas = "#div_data"; //显示区对象的id号
    var event_type = "mouseover"; //触发事件(click/dblclick/mouseover/focus/...)
    var default_tab = "#tab0";
    //切换图片
    var tab_selected_bgimg = "images/green.png";
    var tab_unselected_bgimg = "images/gray.png";
    //切换文本颜色
    var tab_selected_txtcolor = "#ff6600";
    var tab_unselected_txtcolor = "#666666";
    //
    urls = [
          "my_ajax_server.php?app=tab0",
          "my_ajax_server.php?app=tab1",
          "my_ajax_server.php?app=tab2",
         ]

    //**Begin:固定代码*********************************
    for (var i=0; i<tabs.length; i++)
    {
      $(tabs[i]).bind(event_type, handler);
    }
    $(default_tab).trigger(event_type);
    //
    function handler()
    {
      //初始化缓存数组
      var localdatas = new Array(); //缓存浏览器本次数据
      for (var i=0; i<tabs.length; i++)
      {
        localdatas[i]='';
      }

      //重置所有tabs
      for (var i=0; i<tabs.length; i++)
      {
        $(tabs[i]).css("background-image", "url("+ tab_unselected_bgimg +")");
        $(tabs[i]).css("color", tab_unselected_txtcolor);
      }

      var curr_index;
      for(var i=0;i<tabs.length;i++)
      {
        if($(tabs[i]).attr("id")==$(this).attr("id"))
        {
          curr_index = parseInt(i);
        }
      }
      //
      $(this).css("background-image", "url("+ tab_selected_bgimg +")");
      $(this).css("color", tab_selected_txtcolor);

      if(localdatas[curr_index]=='')
      {
        //ajax获取数据(默认method=get)
        $.ajax
        ({
          url: urls[curr_index], //后台处理程序
          cache: false,
          timeout: 20000,
          error:function()
          {
            alert("error while submitting");
          },
          success:function(data)
          {
            localdatas[curr_index] = data; //缓存浏览器本次数据
            $(datas).html(data);
          }
        });
      }
      else
      { //显示缓存数据
        $(datas).html(datas[curr_index]);
      }
    }
    //**End:固定代码*********************************
  //-----------------
  });

</script>
</head>

<body>
<table border="0" width="500" height="25" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
  <td width="97" id="tab0">tab0</td>
  <td width="30"></td>
  <td width="97" id="tab1">tab1</td>
  <td width="30"></td>
  <td width="97" id="tab2">tab2</td>
  <td width="149"></td>
</tr>
</table>

<table border="1" width="500" height="60" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
  <td>
    <div id="div_data"></div>
  </td>
</tr>
</table>

</body>
</html>

my_ajax_server.php文件:

<?php
  /*******************************************
  * File: my_ajax_server.php
  ********************************************/

  error_reporting(7);
  set_magic_quotes_runtime(0);

  $app = $_GET['app'];

  switch ($app)
  {
    case "tab0":  //
?>
from TAB0
<?php
      break;

    case "tab1":  //
?>
from TAB1
<?php
      break;

    case "tab2":  //
?>
from TAB2
<?php
      break;

    default:
      echo 'my_ajax_server.php error.';
      break;
  }
?>

张庆(网眼) 2009-9-18
来自“网眼视界”:http://blog.why100000.com
“十万个为什么”电脑学习网:http://www.why100000.com

jQuery 对象与网页 DOM 对象

星期五, 06月 5th, 2009

    1、关于页面元素的引用
    通过jquery的$()引用元素包括通过id、class、元素名以及元素的层级关系及dom或者xpath条件等方法,且返回的对象为jquery对象(集合对象),不能直接调用dom定义的方法。

    2、jQuery对象与dom对象的转换
    只有jquery对象才能使用jquery定义的方法。注意dom对象和jquery对象是有区别的,调用方法时要注意操作的是dom对象还是jquery对象。
    普通的dom对象一般可以通过$()转换成jquery对象。
    如:$(document.getElementById("msg"))则为jquery对象,可以使用jquery的方法。
    由于jquery对象本身是一个集合。所以如果jquery对象要转换为dom对象则必须取出其中的某一项,一般可通过索引取出。
    如:$("#msg")[0],$("div").eq(1)[0],$("div").get()[1],$("td")[5]这些都是dom对象,可以使用dom中的方法,但不能再使用Jquery的方法。
    以下几种写法都是正确的:
    $("#msg").html();
    $("#msg")[0].innerHTML;
    $("#msg").eq(0)[0].innerHTML;
    $("#msg").get(0).innerHTML;

    3、如何获取jQuery集合的某一项
    对于获取的元素集合,获取其中的某一项(通过索引指定)可以使用eq或get(n)方法或者索引号获取,要注意,eq返回的是jquery对象,而get(n)和索引返回的是dom元素对象。对于jquery对象只能使用jquery的方法,而dom对象只能使用dom的方法,如要获取第三个<div>元素的内容。有如下两种方法:
    $("div").eq(2).html();      //调用jquery对象的方法
    $("div").get(2).innerHTML;  //调用dom的方法属性

    4、同一函数实现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事件都可以有着两种调用方法

    5、集合处理功能
    对于jquery返回的集合内容无需我们自己循环遍历并对每个对象分别做处理,jquery已经为我们提供的很方便的方法进行集合的处理。
    包括两种形式:
    $("p").each(function(i)
    {
      this.style.color=['#f00','#0f0','#00f']
    }
    )
    //为索引分别为0,1,2的p元素分别设定不同的字体颜色。

    $("tr").each(function(i){this.style.backgroundColor=['#ccc','#fff'][i%2]})
    //实现表格的隔行换色效果

    $("p").click(function(){.html())})
    //为每个p元素增加了click事件,单击某个p元素则弹出其内容

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

    7、支持方法的连写
    所谓连写,即可以对一个jquery对象连续调用各种不同的方法。
    例如:
    $("p").click(function(){.html())})
    .mouseover(function(){})
    .each(function(i){this.style.color=['#f00','#0f0','#00f']});

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

    9、完善的事件处理功能
    Jquery已经为我们提供了各种事件处理方法,我们无需在html元素上直接写事件,而可以直接为通过jquery获取的对象添加事件。
    如:
    $("#msg").click(function(){})       //为元素添加了单击事件
    $("p").click(function(i){this.style.color=['#f00','#0f0','#00f']})
    //为三个不同的p元素单击事件分别设定不同的处理
    jQuery中几个自定义的事件:
    (1)hover(fn1,fn2):一个模仿悬停事件(鼠标移动到一个对象上面及移出这个对象)的方法。当鼠标移动到一个匹配的元素上面时,会触发指定的第一个函数。当鼠标移出这个元素时,会触发指定的第二个函数。
    //当鼠标放在表格的某行上时将class置为over,离开时置为out。
    $("tr").hover(function(){
    $(this).addClass("over");
    },
           function(){
           $(this).addClass("out");
    });
    (2)ready(fn):当DOM载入就绪可以查询及操纵时绑定一个要执行的函数。
    $(document).ready(function(){})
    //页面加载完毕提示“Load Success”,相当于onload事件。与$(fn)等价
    (3)toggle(evenFn,oddFn): 每次点击时切换要调用的函数。如果点击了一个匹配的元素,则触发指定的第一个函数,当再次点击同一元素时,则触发指定的第二个函数。随后的每次点击都重复对这两个函数的轮番调用。
           //每次点击时轮换添加和删除名为selected的class。
           $("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(){.text());});       //为每个p元素添加单击事件
    $("p").unbind();       //删除所有p元素上的所有事件
    $("p").unbind("click")       //删除所有p元素上的单击事件

    10、几个实用特效功能
    其中toggle()和slidetoggle()方法提供了状态切换功能。
    如toggle()方法包括了hide()和show()方法。
    slideToggle()方法包括了slideDown()和slideUp方法。

    11、几个有用的jQuery方法
    $.browser.浏览器类型:检测浏览器类型。有效参数:safari, opera, msie, mozilla。如检测是否ie:$.browser.isie,是ie浏览器则返回true。
    $.each(obj, fn):通用的迭代函数。可用于近似地迭代对象和数组(代替循环)。
    如
    $.each( [0,1,2], function(i, n){ ; });
    等价于:
    var tempArr=[0,1,2];
    for(var i=0;i<tempArr.length;i++){
           ;
    }
    也可以处理json数据,如
    $.each( { name: "John", lang: "JS" }, function(i, n){ ; });
    结果为:
    Name:name, Value:John
    Name:lang, Value:JS
    $.extend(target,prop1,propN):用一个或多个其他对象来扩展一个对象,返回这个被扩展的对象。这是jquery实现的继承方式。
    如:
    $.extend(settings, options);
    //合并settings和options,并将合并结果返回settings中,相当于options继承setting并将继承结果保存在setting中。
    var settings = $.extend({}, defaults, options);
    //合并defaults和options,并将合并结果返回到setting中而不覆盖default内容。
    可以有多个参数(合并多项并返回)
    $.map(array, fn):数组映射。把一个数组中的项目(处理转换后)保存到到另一个新数组中,并返回生成的新数组。
    如:
    var tempArr=$.map( [0,1,2], function(i){ return i + 4; });
    tempArr内容为:[4,5,6]
    var tempArr=$.map( [0,1,2], function(i){ return i > 0 ? i + 1 : null; });
    tempArr内容为:[2,3]
    $.merge(arr1,arr2):合并两个数组并删除其中重复的项目。
    如:$.merge( [0,1,2], [2,3,4] )       //返回[0,1,2,3,4]
    $.trim(str):删除字符串两端的空白字符。
    如:$.trim(" hello, how are you?   ");        //返回"hello,how are you? "

    12、解决自定义方法或其他类库与jQuery的冲突
    很多时候我们自己定义了$(id)方法来获取一个元素,或者其他的一些js类库如prototype也都定义了$方法,如果同时把这些内容放在一起就会引起变量方法定义冲突,Jquery对此专门提供了方法用于解决此问题。
    使用jquery中的jQuery.noConflict();方法即可把变量$的控制权让渡给第一个实现它的那个库或之前自定义的$方法。之后应用 Jquery的时候只要将所有的$换成jQuery即可,如原来引用对象方法$("#msg")改为jQuery("#msg")。
    如:
    jQuery.noConflict();
    // 开始使用jQuery
    jQuery("div   p").hide();
    // 使用其他库的 $()
    $("content").style.display = 'none';

jQuery/Ajax/PHP/Json 的一个综合例子

星期三, 11月 26th, 2008

jQuery/Ajax/PHP/Json 的一个综合例子

    jQuery 是一个优秀的 Javascript 框架,对 js 进行了优秀的包装,提供了许多方便的功能。jQuery 对 ajax 的包装也堪称优秀。

    jQuery 可以以 json 文件传输协议来传输数据(类似 xml,而且大有取代 xml 的趋势),而网站后台代码必须与之配合使用。PHP 是用 json_encode 函数来对返回的数组数据进行编码的,但这个函数只有 PHP5.2版本以上才支持。

    从网上找到一个 json 的操作类,本人在 PHP4.4.7 版本下测试通过。本人还建了个函数 function my_json_encode($phparr),使代码兼容 PHP5.2 以上版本。

    示例代码(包括 json 的类包软件)可以在以下网址下载:http://download.csdn.net/source/810895

    以下是全部代码:

<html>
<head>
<title>jQuery Ajax 实例演示</title>
</head>
<script language="javascript" src="../lib/jquery.js" mce_src="../lib/jquery.js"></script>
<script language="javascript">

$(document).ready(function ()
{
   $('#send_ajax').click(function (){
     var params=$('input').serialize(); //序列化表单的值
     $.ajax({
       url:'ajax_json.php', //后台处理程序
       type:'post',         //数据发送方式
       dataType:'json',     //接受数据格式
       data:params,         //要传递的数据
       success:update_page  //回传函数(这里是函数名)
     });
   });

  //$.post()方式:
  $('#test_post').click(function (){
    $.post(
      'ajax_json.php',
      {
        username:$('#input1').val(),
        age:$('#input2').val(),
        sex:$('#input3').val(),
        job:$('#input4').val()
      },
      function (data) //回传函数
      {
        var myjson='';
        eval('myjson=' + data + ';');
        $('#result').html("姓名:" + myjson.username + "<br/>工作:" + myjson['job']);
      }
    );
   });

  //$.get()方式:
  $('#test_get').click(function ()
  {
    $.get(
      'ajax_json.php',
      {
        username:$("#input1").val(),
        age:$("#input2").val(),
        sex:$("#input3").val(),
        job:$("#input4").val()
      },
      function(data) //回传函数
      {
        var myjson='';
        eval("myjson=" + data + ";");
        $("#result").html(myjson.job);
      }
    );
  });
});

function update_page (json)  //回传函数实体,参数为XMLhttpRequest.responseText
{
  var str="姓名:"+json.username+"<br />";
  str+="年龄:"+json.age+"<br />";
  str+="性别:"+json.sex+"<br />";
  str+="工作:"+json.job+"<br />";
  str+="追加测试:"+json.append;
  $("#result").html(str);
}
</script>
<body>

  <div id="result" style="background:orange;border:1px solid red;width:300px;height:200px;"></div>
  <form id="formtest" action="" method="post">
    <p><span>输入姓名:</span><input type="text" name="username" id="input1" /></p>
    <p><span>输入年龄:</span><input type="text" name="age" id="input2" /></p>
    <p><span>输入性别:</span><input type="text" name="sex" id="input3" /></p>
    <p><span>输入工作:</span><input type="text" name="job" id="input4" /></p>
  </form>
  <button id="send_ajax">提交</button>
  <button id="test_post">POST提交</button>
  <button id="test_get">GET提交</button>

</body>
</html>
PHP 文件 ajax_json.php:

<?php
  //$arr = $_POST; //若以$.get()方式发送数据,则要改成$_GET.或者干脆:$_REQUEST
  $arr = $_REQUEST;
  $arr['append'] = '测试字符串';
  //print_r($arr);
  $myjson = my_json_encode($arr);
  echo $myjson;

  function my_json_encode($phparr)
  {
    if(function_exists("json_encode"))
    {
      return json_encode($phparr);
    }
    else
    {
      require_once 'json/json.class.php';
      $json = new Services_JSON;
      return $json->encode($phparr);
    }
  }
?>

    张庆(网眼) 2008-11-26
    来自“网眼视界”:http://blog.why100000.com
    “十万个为什么”电脑学习网:http://www.why100000.com
    CSDN博客:http://blog.csdn.net/zhangking