博客 - 标签:JQuery

写高质量的jQuery

2011-08-5 下午 - JS/Ajax/AS - -

看了一篇关于jQuery性能提升的文章,十分认同,总结一下(原文一共是十点,我省略了一部分):

1.尽量只用id选择器和标签选择器,比如jQuery(“#selector”)、jQuery(“TagName”),减少class选择器的使用,避免伪类选择器和属性选择器。

2.查找子节点时推荐使用find,比如jQuery(“body”).find(“p”)。

3.利用delegate将事件委托,例如给一个长列表逐个绑定事件,就可以使用delegate。delegata方法请参看jQuery API。

4.尽量减少DOM结构的改动(如.append()、.insertBefore()和.insetAfter()),避免不了也要记得先合并再一次性插入,大范围的DOM结构改动,可以利用detach方法先取出,操作好之后再插入。detach方法请参看jQuery API。

5.循环,尽量使用js原生的for或while,减少使用jQuery的each方法。

原文比较详细的并以数据说明了造成性能问题的原因,有兴趣就马上猛击过去了解。

4 Comments »

imglazyload图片延迟加载(jQuery)

2011-06-20 下午 - JS/Ajax/AS - -

这个小效果还是3个月前写的,太忙,一直没空更新blog,刚好有点空闲,抽出来简单弄弄了~

container容器,attr属性,timeout延时。这些都可以有自己灵活控制的!原理简单不过了,图片先不设置src属性,浏览器就不会产生请求,监听起滚动条和窗口大小的事件,通过判断图片是否处于当前可视区域(offset的left和top方向分别小于scrollTop+clientHeight和scrollLeft+clientWidth)来控制图片是否显示,显示则设置img对象的src属性为标签中自定义属性的值!

主要代码

this.container = $(this.options.container);
this.imgNum = this.container.find('img['+ this.options.attr +']');
var _this = this;
if(this.imgNum.length){
    
this.timer&&clearTimeout(this.timer);
    
this.timer = setTimeout(function(){
        
var arr = [],gc = _this.getClient();
        $.
each(_this.imgNum,function(i,o){
            
if($(o).offset().top <= gc.top && $(o).offset().left <= gc.left){
                
var attrval = $(o).attr('lazysrc');attrval&&$(o).attr('src',attrval).removeAttr('lazysrc').hide().fadeIn();
            
}else{
                
arr.push(o);
            
}
        
});
        
_this.imgNum = arr;
    
},this.options.timeout);
}else{
    $
(window).unbind('scroll',this.check);
    $
(window).unbind('resize',this.check);
}

返回当前屏幕显示范围

return{'top':document.documentElement.clientHeight+Math.max(document.documentElement.scrollTop,document.body.scrollTop),'left':document.documentElement.clientWidth+Math.max(document.documentElement.scrollLeft,document.body.scrollLeft)};

demo展示:http://www.11gz.com/demo/js-ajax/imglazyload.html

No Comments »

jQuery+easing缓动的动画

2011-03-5 下午 - JS/Ajax/AS - -

jQuery实现动画再简单不过了,只是要实现更酷的效果还需要插件来帮忙,easing就是一款帮助jQuery实现缓动动画的插件,经过试用,效果很不错,记录一下使用方法吧!

下载该插件:jquery.easing.1.3.js jquery.easing.compatibility.js

演示地址:http://www.11gz.com/demo/js-ajax/easing/index.html

方法介绍:

  • def:默认方式设置
  • swing:默认方式加载
  • Quad:二次方缓动(t)
  • Cubic:三次方缓动
  • Quart:四次方缓动
  • Quint:五次方缓动
  • Sine:正弦曲线缓动
  • Expo:指数曲线缓动
  • Circ:圆形曲线的缓动
  • Elastic:指数衰减的正弦曲线缓动
  • Back:超过范围的三次方缓动
  • Bounce:指数衰减的反弹缓动

关于In、Out、Inout的说明:

  • easeIn:加速度缓动;
  • easeOut:减速度缓动;
  • easeInOut:先加速度至50%,再减速度完成动画。

缓动方式的翻译来自:JavaScript Tween算法及缓动效果

如何应用:

slideUp|slideDown|slideToggle|fadeIn|fadeOut|fadeToggle

$(element).slideUp(duration,easing,[callback]);

fadeTo

$(element).fadeTo(duration,opacity,easing,[callback]);

animate

$(element).animate({properties},duration,easing,callback);

jQuery1.4+版本更可以:

$(element).animate({left:[100,'swing'],top:[100,'easeOutBounce']});

或者

jQuery(myElement).animate({left:100,top:100},{specialEasing:{left: 'swing',top:'easeOutBounce'}});

具体可参阅jquery1.4+的API。

4 Comments »

jQuery实现dialog(对话框)

2011-03-1 上午 - JS/Ajax/AS - -

话说系统默认的对话框使用方便,但是功能单一且比较的难看(不能自定义样式),那么自己来写代码扩展一些更复杂的功能并美化一下。本代码采用面向对象思想对一些属性和方法进行了封装,性能有待测试,欠妥之处,欢迎指正!

dialog

演示地址:http://www.11gz.com/demo/js-ajax/dialog/index.html

设置参数object说明:

  • width:显示宽度,默认为400px
  • title:标题,默认为“小提示”
  • show:是否显示dialog,如果要做到延迟显示,设置此属性为false,默认为true
  • modal:是否显示半透明遮罩背景,默认为不显示 false
  • closeDelay:自动关闭的延时时间,单位:毫秒 默认为0,不延时关闭

会自动关闭的小提示

dc_dialog.popTip("自动关闭的小提示","这是个会自己关闭的气泡小提示","2000",{'modal':true});

参数1:提示窗口的标题; 参数2:提示的内容文本; 参数3:停留时间(毫秒) 参数4:object

弹一个小提示

dc_dialog.popTip("小提示2","这仅仅是一个小提示2","0",{'modal':false});

参数1:提示窗口的标题; 参数2:提示的内容文本; 参数3:停留时间(0为不自动关闭) 参数4:object
ps:如果不需要显示遮罩层,可省略后两个参数
dc_dialog.popTip("小提示2","这仅仅是一个小提示2");

弹一个确认框,confirm

dc_dialog.confirm("你支持这个决定吗?",['是','否'] , function(val) {alert("你选择了: " + val);}, {title:"一个确认否定的框",'modal':true});

参数1:问题; 参数2:选项; 参数3:成功后的回调函数 参数4:object

异步加载数据

dc_dialog.load("load.html",{'title':'异步加载的信息','width':'600px','modal':true});

参数1:加载页面的url地址; 参数2:object

iframe

dc_dialog.frame("frame0","iframe.html",{'title':'一个iframe','width':'600px','modal':true});

参数1:iframe的id和name; 参数2:加载页面的url地址; 参数3:object

本代码有参考【jQuery插件】一个简易弹出层效果之处,感谢 愚人码头

1 Comment »

利用jQuery实现跨域的Ajax

2011-02-19 上午 - JS/Ajax/AS - - - -

说到Ajax的跨域,还真是个让人头痛的问题,实现的方法有多种,这里仅记录使用jQuery的getJSON实现跨域,需要用到json数据。

简单json格式如下:

[{"a":"1","b":"2"},{"a":"3","b":"4"}]

主体代码:

$.getJSON('http://您的域名/文件名?jsoncallback=?',function(dt){
    $.
each(dt,function(i,item){
        
alert(item.a);
    
});
});

jsoncallback=?,这个必不可少,后端程序会get这个参数,这里就不做解释了,具体请参看jQuery API里的说明。

后端PHP:

<?php
header('Content-Type: application/json; charset=utf-8');
$callback = $_GET['jsoncallback'];
echo $callback.'([{"a":"1","b":"2"},{"a":"3","b":"4"}])';
?>

这里仅仅只是一个简单的json示范,可以动态生成更复杂的json以适应项目需求。

说明一下:由于jQuery的getJSON使用的是get方式请求数据,因此数据量不能太大,否则导致接收失败。

既然说到Ajax跨域了,再记录一个PHP中简单的方法吧,利用file_get_content()把整个文件读入一个字符串中,性能可能略低。

<?php
@
header("Content-Type: text/html; charset=utf-8");
@
header("Expires: -1");
@
header("Cache-Control: no-store, private, post-check=0, pre-check=0, max-age=0", FALSE);
@
header("Pragma: no-cache");
$vcontent=file_get_contents("http://您的域名/文件名");
echo $vcontent;
?>

关于js跨域跨域还可参看:支付宝前端开发组:也来谈谈”完美”跨域

1 Comment »

基于jQuery实现自动轮换的选项卡

2009-10-26 上午 - JS/Ajax/AS -

想写个这样的东西很久了,恰巧项目中要用到,就下了点功夫。利用模拟鼠标事件来做轮换…

模拟鼠标事件的函数:trigger(type,[data]) 在每一个匹配的元素上触发某类事件。

点击图片预览效果

点击预览效果

点击下载代码

4 Comments »

基于jQuery实现星级评分效果

2009-10-13 下午 - JS/Ajax/AS -

仿照『口碑』的评星级效果做的一点小东西,测试下自己这段时间的学习成果···

看图知效果:

星级评分

预览效果:星级评分

下载文件:star-Level.rar

口碑的代码:starLevel-koubei.rar[提取自口碑网]

html

  1. <div class="selectStar">
  2. <ul class="clearfix">
  3.     <li>
  4.         <span class="red">*</span>
  5.         <span class="zi">服务  </span>
  6.         <span id="dpCont1" class="dpCont"></span>
  7.         <em id="dpStar1" class="">
  8.             <a href="#" id="1">1</a>
  9.             <a href="#" id="2">2</a>
  10.             <a href="#" id="3">3</a>
  11.             <a href="#" id="4">4</a>
  12.             <a href="#" id="5">5</a>
  13.         </em>
  14.     </li>
  15. </ul>
  16. </div>

javascript:

  1. $(function(){
  2.     var className;
  3.     var classID;
  4.     var dpText="";
  5.     var dpTextC="";
  6.    
  7.     $(".selectStar em a").bind("click",function(){
  8.         className = "selectS" + $(this).attr("id");
  9.         classID = $(this).parent().attr("id");
  10.         $(this).parent().removeClass().addClass(className);
  11.        
  12.         if($(this).attr("id") == 1 || $(this).attr("id") == 2) {dpTextC = "差评";}
  13.         if($(this).attr("id") == 3 || $(this).attr("id") == 4) {dpTextC = "中评";}
  14.         if($(this).attr("id") == 5) {dpTextC = "好评";}
  15.         $(this).parent().prev(".dpCont").text(dpTextC);
  16.        
  17.         return false;
  18.     })   
  19.     .bind("mouseover",function(){
  20.         if($(this).attr("id") == 1 || $(this).attr("id") == 2) {dpText = "差评";}
  21.         if($(this).attr("id") == 3 || $(this).attr("id") == 4) {dpText = "中评";}
  22.         if($(this).attr("id") == 5) {dpText = "好评";}
  23.         $(this).parent().removeClass().addClass("selectS" + $(this).attr("id"));
  24.         $(this).parent().prev(".dpCont").text(dpText);
  25.     })   
  26.     .bind("mouseout",function(){
  27.         $(this).parent().removeClass("selectS" + $(this).attr("id"));
  28.         if($(this).parent().attr("id") == classID){
  29.             $(this).parent().addClass(className);
  30.         }
  31.        
  32.         $(this).parent().prev(".dpCont").text(dpTextC);
  33.     });
  34. });

10 Comments »

妙招解决jquery中$和其他库的冲突

2009-10-13 下午 - JS/Ajax/AS -

方法一:

  1. jQuery.noConflict()//将变量$的控制权让渡给其他js库
  2. jQuery(function($){  //使用jQuery设定页面加载是执行的函数
  3.     $("p").click(function(){  //函数内部使用$()方法
  4.         alert($(this).text());
  5.     });
  6. });
  7.  
  8. $("p").style.display = "none"//使用其他js库

————————- 分界 ————————

方法二:

  1. jQuery.noConflict();              //将变量$的控制权让渡给其他js库
  2. (function($){                     //定义匿名函数并设置形参为$
  3.     $(function(){                 //匿名函数内部的$均为jQuery
  4.         $("p").click(function(){  //继续使用$()方法
  5.         alert($(this).text());
  6.         });
  7.     });
  8. })(jQuery);                       //执行匿名函数且传递实参jQuery
  9.  
  10. $("p").style.display = "none";    //使用其他js库

1 Comment »