热门:网页模板.net视频教程JQueryMVCjsonExtJs源码示例三级联动JQuery菜单
您现在的位置:.Net中文社区>> AJAX编程>>正文内容

豆瓣网jQuery的使用

发布时间:2010年04月14日点击数: 佚名

Douban是2.0 社区里面比较成功的一个产品, 里面ajax技术也做得不错, 把它的源码拿来研究了一下, 它在页面上使用了jquery, 我比较喜欢它的一体式的事件处理机制,不用写很多的事件绑定代码,只需要通过一定的命名规则就可以自动给页面元素加上一些功能, 它上面几乎所有的功能都通过这个实现, 配合jquery强大的选择器,代码看起来比较简洁清晰. 下面我们就来看看它的一些核心部分. 我使用的是jquery 1.2.3,压缩之后29kb大小, 速度感觉上比以前有比较大的改善.废话不多说了,直接看看代码吧. 另外推荐一下blueprint 这个css框架,还挺好用的.

先看看效果图:

实现JS代码:

  1. //定义命名空间 
  2. var Bowtech=new Object(); 
  3.  
  4. //注册全局的事件监视器. 
  5. Bowtech.EventMonitor = function(){ 
  6.     this.listeners = new Object(); 
  7. //广播事件 
  8. Bowtech.EventMonitor.prototype.broadcast=function(widgetObj, msg, data){ 
  9.     var lst = this.listeners[msg]; 
  10.  
  11.     if(lst != null){ 
  12.         for(var o in lst){ 
  13.             lst[o](widgetObj, data); 
  14.         } 
  15.     } 
  16. //绑定所有的事件.  
  17. Bowtech.EventMonitor.prototype.subscribe=function(msg, callback){ 
  18.     var lst = this.listeners[msg]; 
  19.     if (lst) { 
  20.         lst.push(callback); 
  21.     } else { 
  22.         this.listeners[msg] = [callback]; 
  23.     } 
  24. //取消事件绑定. 
  25. Bowtech.EventMonitor.prototype.unsubscribe=function(msg, callback){ 
  26.     var lst = this.listener[msg]; 
  27.     if (lst != null){ 
  28.         lst = lst.filter(function(ele, index, arr){return ele!=callback;}); 
  29.     } 
  30.  
  31. // Page scope event-monitor obj. 
  32. var event_monitor = new Bowtech.EventMonitor(); 
  33. //对于所有 class="j a_xxx yyy" id="xxx-123"的元素执行事件绑定, xxx-123部分用来获取元素的ID,比如一个帖子的ID, 
  34. // a_xxx  后面的部 
  35. //分用来标识应用如 vote / review / blog 等. 
  36. //绑定的事件就是 :  Bowtech.init_vote / Bowtech.init_blog 等. 
  37. function load_event_monitor(root) { 
  38.     var re = /a_(\w+)/; //正则表达式获取ID. 
  39.     var fns = {}; 
  40.     $(".j", root).each(function(i) { 
  41.         var m = re.exec(this.className); 
  42.         if (m) { 
  43.             var f = fns[m[1]]; 
  44.             if (!f) { //如果事件处理函数不存在则创建函数对象. 
  45.                 f = eval("Bowtech.init_"+m[1]);  
  46.                 fns[m[1]] = f;//调用绑定函数. 
  47.             } 
  48.             f && f(this); 
  49.         } 
  50.     }); 
  51. //在文档加载完毕后将执行的方法(参见jquery文档) 
  52. //一般来说文档加载的时候应该绑定所有的事件, 但是有一种情况例外. 
  53. //比如 通过Ajax方法取回来的内容里面还含有动作按钮的,这时需要针对这部分功能执行绑定. 
  54. //需要手动调用 load_event_monitor(element);  方法. 
  55. $(function() { 
  56.     load_event_monitor(document); 
  57. }); 
  58. //注意这里的o对象是一个html 元素而非是一个jquery对象,所以在调用它的方法时应该使用$(o)函数 
  59. //把它转化为jquery对象. 
  60. Bowtech.init_forder = function(o) { 
  61.     var eid = $(o).attr("id").split("-")[1]; 
  62.     var fo = $("#f-"+eid); 
  63.     var unfo = $("#unf-"+eid); 
  64.      
  65.     fo.click(function() { 
  66.        $(o).hide(); 
  67.        unfo.show(); 
  68.        fo.hide(); 
  69.     }); 
  70.     unfo.click(function() { 
  71.         $(o).show(); 
  72.         fo.show(); 
  73.         unfo.hide(); 
  74.     }); 
  75.  
  76.  
  77. jQuery.fn.extend({ 
  78.     set_caret: function(){ 
  79.         if(!$.browser.msie) return
  80.         var initSetCaret = function(){this.caretPos = document.selection.createRange().duplicate()}; 
  81.         this.click(initSetCaret).select(initSetCaret).keyup(initSetCaret); 
  82.     },  
  83.     insert_caret:function(textFeildValue){ 
  84.         var textObj = this[0]; 
  85.         if(document.all && textObj.createTextRange && textObj.caretPos){ 
  86.             var caretPos=textObj.caretPos; 
  87.             caretPos.text = caretPos.text.charAt(caretPos.text.length-1) == '' ? textFeildValue+'' : textFeildValue; 
  88.         } else if(textObj.setSelectionRange){ 
  89.             var rangeStart=textObj.selectionStart; 
  90.             var rangeEnd=textObj.selectionEnd; 
  91.             var tempStr1=textObj.value.substring(0,rangeStart); 
  92.             var tempStr2=textObj.value.substring(rangeEnd); 
  93.             textObj.value=tempStr1+textFeildValue+tempStr2; 
  94.             textObj.focus(); 
  95.             var len=textFeildValue.length; 
  96.             textObj.setSelectionRange(rangeStart+len,rangeStart+len); 
  97.             textObj.blur(); 
  98.         } else { 
  99.             textObj.value+=textFeildValue; 
  100.         } 
  101.     } 
  102. }) 

前台要用就比较简单了, 只需要这样写:

  1. <div id="test2" class="mod"> 
  2.                 <h3> 
  3.                     这里可以放标题 
  4.                 h3> 
  5.                 <div class="j modb a_forder" id="modb-1002"> 
  6.                     这里是一些主要的内容 
  7.                     <dl> 
  8.                         <dt>Hello worlddt> 
  9.                         <dd> 
  10.                             hahahadd> 
  11.                     dl> 
  12.                     这个实验在沙加的神舟本上完成 
  13.                 div> 
  14.                 <div class="edit"> 
  15.                     <a id="f-1002" class="forder" href="javascript:void(0);">[收起]a> <a id="unf-1002" 
  16.                         class="unforder" href="javascript:void(0);">[展开]a> 
  17.                 div> 
  18.             div> 

本站热点业务

更多模板/案例展示

关于我们 | 联系我们 | 团队日志 | 网站地图 | 网站合作