zoukankan      html  css  js  c++  java
  • jQuery第十一章

    第十一章

    一、jQuery性能优化

    1.使用最新版本的jQuery类库。

    2.使用合适的选择器

    (1)$(“#id”) :使用id来定位DOM元素是最佳提高性能的方式。

    (2)$(“p”) :标签选择器的性能也不错。

    (3)$(“.class”) :这种方法比较复杂

    (4)$(“[attribute = value]”) :利用属性来定位DOM元素会使用DOM搜索的方式来达到效果。

    (5)$(“ : hidden”) :利用伪选择器会带来较大的性能问题。

    3.缓存对象。

    4.循环DOM操作。

    5.数组方式使用jQuery对象。

    6.事件代理

    7.将你的代码转化成jQuery插件

    8.使用join()来拼接字符串

    9.合理利用HTML5的Data属性

    10.尽量使用原生的javascript方法。

    二、jQuery技巧

    1.禁用界面的右键菜单

    $(document).ready(function(){

             $(document).bind("contextmenu",function(e){

                      return false;

             });

    });

    2.新窗口打开页面

    $(document).ready(function(){

             //例子1:herf = "http://"的超链接将会在新窗口打开链接

             $('a[href^="http://"]').attr("target","_blank");

             //例子2:rel = "external"的超链接将会在新窗口打开链接

             $("a[rel$='external']").click(function(){

                      this.target = "_blank";

             });

    });

    //use

    <a href = "http://www.cssrain.cn" rel = "external"> open link </a>

    3.判断浏览器类型

    $(document).ready(function(){

             //Firefox 2 and above

             if($.browser.mozila && $.browser.version >="1.8"){

                      // do something

             }

             //Safari

             if($.browser.safari){

                      // do something

             }

             // Chrome

             if($.browser.Chrome){

                      // do something

             }

             //Opera

             if ($.browser.opera) {

                      // do something

             }

             //IE6 and below

             if($.browser.msie && $.browser.version <= 6 ){

                      // do something

             }

             // anything above IE6

             if($.browser.msie && $.browser.version > 6){

                      // do something

             }

    });

    4.输入框文字获取和失去焦点

             $(document).ready(function(){

                      $("input.text1").val("Enter your search text here");

                      textFill($('input.text1'));

             });

             function textFill(input){ //input focus text function

                      var originalvalue = input.val();

                      input.focus(function(){

                      if($.trim(input.val()) == originalvalue ){

                              input.val('');

                      }

                      }).blur( function(){

                              if($.trim(input.val()) == '' ){

                                       input.val(originalvalue);

                              }

                      });

             }

    5.返回头部滑动动画

             jQuery.fn.scrollTo = function(speed){

                      var targetOffset = $(this).offset().top;

                      $('html.body').stop().animate({scrollTop:targetOffset},speed);

                      return this;

             };

             //use

             $("#goheader").click(function(){

                      $("body").scrollTo(500);

                      return false;

             });

    6.获取鼠标位置

             $(document).ready(function(){

                      $(document).mousemove(function(){

                              $('#XY').html("X : " + e.pageX + "| Y : " + e.pageY);

                      });

             });

    7.判断元素是否存在

             $(document).ready(function(){

                      if($("#id").length){

                              // do something

                      }

             });

    8.点击div也可以跳转

             $("div").click(function(){

                      window.location = $(this).find("a").attr("href");

                      return false;

             });

             //use

             <div><a href = "index.html" >home</a></div>

    9.根据浏览器的大小添加不同的样式

             $(document).ready(function(){

                      function checkWindowSize(){

                              if($(window).width()>1200){

                                       $("body").addClass("large");

                              }else{

                                       $("body").removeClass("large");

                              }

                      }

                      $(window).resize(checkWindowSize);

             });

    10.设置div在屏幕中央

             $(document).ready(function(){

                      jQuery.fn.center = function(){

                              this.css("position","absolute");

                              this.css("top",($(window).height()-this.height())/2+$(window).scrollTop()+"px");

                               this.css("top",($(window).width()-this.width())/2+$(window).scrollLeft()+"px");

                              return this;

                      }

                      //use

                      $("#XY").center();

             });

    11.创建自己的选择器

             $(document).ready(function(){

                      $.extend($.expr[':'],{

                              moreThen500px:function(a){

                                       return $(a).width()>500;

                              }

                      });

                      $('.box:moreThen500px').click(function(){

                              //...

                      });

             });

    12.关闭所有动画效果

             $(document).ready(function(){

                      jQuery.fx.off = true;

             });

    13.检测鼠标的右键和左键

             $(document).ready(function(){

                      $("#XY").mousedown(function(e){

                              alert(e.which)  //1 = 鼠标左键;2 = 鼠标中键;3 = 鼠标右键

                      })

             });

    14.回车提交表单

             $(document).ready(function(){

                      $("input").keyup(function(e){

                              if(e.which == '13'){

                                       alert("回车提交!")

                              }

                      })

             });

    15.设置全局Ajax参数

             $("#load").ajaxStart(function(){

                      showLoading();   //显示loading

                      disableButtons();

             });

             $("#load").ajaxComplete(function(){

                      hideLoading();   //隐藏loading

                      enableButtons();   //启用按钮

             });

    16.获取选中的下拉框

             $('#someElement').find('option : selected');

             $('#someElement option : selected');

    17.切换复选框

             var tog = false;

             $('button').click(function(){

                      $("input[type=checkbox]").attr("checked",!tog);

                      tog = !tog;

             });

    18.使用siblis()来选择同辈元素

             //不这样做

             $("#nav li").click(function(){

                      $("#nav li").removeClass("active");

                      $(this).addClass("active");

             });

             //替代做法是

             $("#nav li").click(function(){

                      $(this).addClass("active").siblings().removeClass("active");

             });

    19.个性化链接

             $(document).ready(function(){

                      $("a[href$='pdf']").addClass('pdf');

                      $("a[href$='zip']").addClass('zip');

                      $("a[href$='psd']").addClass('psd');

             });

    20.在一段时间之后都自动隐藏或关闭元素

             //这是1.3.2中我们使用setTimeout来实现的方式

             setTimeout(function(){

                      $("div").fadeIn(400)

             },3000);

             //而在1.4之后的版本可以使用delay()这一功能来实现的方式

             $("div").slideUp(300).delay(3000).fadeIn(400);

    21.使用Firefox和Firebug来记录事件日志

             // $("$someDiv").log('div');

             jQuery.log = jQuery.fn.log = function(msg){

                      if(console){

                              console.log("%s: %o",msg,this);

                      }

                      return this;

             };

    22.为任何与选择器相匹配的元素绑定事件

             //为table里面的td元素绑定click事件,不管td元素是一直存在还是动态创建的

             //jQuery 1.4.2之前使用的方式

             $("table").each(function(){

                      $("td",this).live("click",function(){

                              $(this).toggleClass("hover");

                      });

             });

             // jQuery 1.4.2使用的方式

             $("table").delegate("td","click",function(){

                      $(this).toggleClass("hover");

             });

             //jQuery1.7.1使用的方式

             $("table").on("click","td",function(){

                      $(this).toggleClass("hover");

             });

    23.使用css钩子

             jQuery.cssHooks是1.4.3新增的方法,当你定义新的CSS Hooks时实际上定义的是getter和setter方法,比如,border-radius这个圆角属性想要成功应用于firefox、webkit等浏览器,需要增加属性前缀,比如-moz-border-radius和-webkit-border-radius。你可以通过定义CSS Hooks将其封装成统一的接口borderRadius,而不是一一设置CSS属性。代码如下:

             $cssHooks['borderRadius'] = {

                      get:function(elem,computed,extra){

                              //Depending on the browser , read the value of

                              //-moz-border-radius, -webkit-border-radius or border-raidus

                      },

                      set:function(elem,value){

                              //set the appropriate CSS3 property

                      }

             };

             //use;

             $("#rect").css("borderRadius",5);

    24.$.(proxy)的使用

             使用回调方法的缺点之一就是当执行类库中的方法后,上下文对象被设置到另外一个元素,比如:

             <div id = "panel" style = "display:none">

                      <button>Close</button>

             </div>

             执行下面的代码:

             $("#panel").fadeIn(function(){

                      $("#panel button").click(function(){

                              $(this).fadeOut();

                      });

             });

             你将遇到问题,button元素会消失,而不是panel元素。可以使用$.proxy方法解决这个问题,代码如下:

             $("#panel").fadeIn(function(){

                      //using $.proxy :

                      $("#panle button").click($.proxy(function(){

                              //this指向#panel

                              $(this).fadeOut();

                      },this));

             });

    25.限制Text-Area域中的字符的个数

             jQuery.fn.maxLength = function(){

                      this.each(function(){

                              var type = this.tagName.toLowerCase();

                              var inputType = this.type?this.type.toLowerCase():null;

                              if(type == "input" && inputType == "text" || inputType == "password"){

                                       //应用标准的maxLength

                                       this.maxLength = max;

                              } else if(type = "textarea"){

                                       this.onkeypress = function(e){

                                                var ob = e||event;

                                                var keyCode = ob.keyCode;

                                                var hasSelection = document.selection?document.selection.createRange().text.length > 0:this.selectionStart != this.selectionEnd;

                                                return !(this.value.length >= max && (keyCode >50 || keyCode ==32 ||keyCode == 0 ||keyCode == 13) && !ob.ctrlKey && !ob.altKey && !ob.altKey && !hasSelection);                       

                                       };

                                       this.onkeyup = function(){

                                                if(this.value.length > max){

                                                         this.value = this.value.substring(0,max);

                                                }

                                       };

                              }

                      });

             };

             //use

             $("#mytextarea").maxLength(10);

    26.本地存储

             本地存储是HTML 5 提供的特性之一。它提供了非常简单的API接口,便于添加你的数据到localStorage全局属性之中,代码如下:

             localStorage.someData = "this is going to be saved";

    27.解析json数据时报parseError错误

             jQuery在1.4版本后,采用了更为严格的json解析方式,即所有内容都必须要有双引号,如果升级jQuery之后,ajax加载json报错,有可能就是这个原因。比如:

             //1.4之前的版本,key 没引号,这样没问题

             {

                      key:"28CATEGORY",

                      status :"0"

             }      

             但升级成jQuery1.4后,都必须加上双引号,格式如下:

             {

                      "key":"28CATEGORY",

                      "status":"0"

             }

    28.从元素中除去HTML

             (function($){

             $.fn.stripHtml = function(){

                      var regexp = /<("[^"]*"|'[^']*'|[^'">])*>/gi;

                      this.each(function(){

                              $(this).html($(this).html().replace(regexp,''));

                      });

                      return $(this);

             }

             })(jQuery);

             //用法:

             $('div').stripHtml();

    29.扩展String对象的方法

             $.extend(String.prototype,{

                      isPositiveInteger:function(){

                              return (new RegExp(/^[1-9]d*$/).test(this));

                      },

                      isInteger:function(){

                              return (new RegExp(/^d+$/).test(this));

                      },

                      isNumber:function(value,element){

                              return (new RegExp(/^-?(?:d+|d{1,3}(?:,d{3})+)(?:.d+)?$/).test(this));

                      },

                      trim:function(){

                              return this.replace(/&lt;/g,'<').replace(/&gt;/g,'>').replace(/&quot;/g,'"');

                      },

                      tran:function(){

                              return this.replace(/&lt;/g,'<').replace(/&gt;/g,'>').replace(/&quot;/g,'"');

                      },

                      replaceAll:function(os,ns){

                              return this.replace(new RegExp(os,"gm"),ns);

                      },

                      skipChar:function(ch){

                              if(!this||this.length===0){return '';}

                              if(this.charAt(0)===ch){return this.substring(1).skipChar(ch);}

                              return this;

                      },

                      isValidMail:function(){

                              return (new RegExp(/^([]|[a-zA-Z0-9]){6,32}$/).test(this));

                      },

                      isValidMail:function(){

                              return(new RegExp(/^w+((-w+)|(.w+))*@[A-Za-z0-9]+((.|-)[A-Za-z0-9]+)*.[A-Za-z0-9]+$/).test(this.trim()));

                      },

                      isSpaces:function(){

                              for(var i=0; i<this.length;i+=1){

                                       var ch = this.charAt(i);

                                       if(ch=!'' && ch!=" " && ch!=" " && ch!=" "){return false;}

                              }

                              return true;

                      },

                      isPhone:function(){

                              return (new RegExp(/(^([0-9]{3,4}[-])?d{3,8}(-d{1,6})?$)|(^([0-9]{3,4})d{3,8}((d{1,6}))?$)|(^d{3,8}$)/).test(this));

                      },

                      isUrl:function(){

                              return (new RegExp(/^[a-zA-z]+://([a-zA-Z0-9-.]+)([-w./?%&=:]*)$/).test(this));

                      },

                      isExternalUrl:function(){

                              return this.isUrl() && this.indexOf("://"+document.domain) == -1;

                      }

             });

             // use

             $("input").val().isInteger();

  • 相关阅读:
    性能测试
    领域驱动设计(DDD)的实际应用
    Js模块模式
    Roslyn and NRefactory
    前端与后端分离的架构实例3
    angular + easyui 做界面验证
    java.lang.OutOfMemoryError: unable to create new native thread(转)
    oracle client server那点事
    一次处理ORA-07445的历险记(转)
    一条执行4秒的sql语句导致的系统问题 (转)
  • 原文地址:https://www.cnblogs.com/koto/p/5182358.html
Copyright © 2011-2022 走看看