jQuery最佳实践

来源:互联网 发布:北京奥运会 知乎 编辑:程序博客网 时间:2024/06/11 14:42

  选择器

  1.尽可能的使用ID选择器,因为它是通过 document.getElementById()处理的。

  2.当使用class选择器的时候不(需)要使用元素类型

  var $products = $("div.products"); // SLOWvar $products = $(".products"); // FAST

  3.对于ID->child这种嵌套结构,使用find()方法,因为它不通过Sizzle选择器引擎处理。

  // 糟糕的,一个使用Sizzle引擎的嵌套选择 $productIds = $("#products div.id");//好的,#products已经通过 document.getElementById()选择,所以只有div.id需要通过Sizzle引擎选择一下就可以了$productIds = $("#products").find("div.id");

  4.选择器右侧的内容要尽量详细,左侧则不需要

  // 糟糕的$("div.data .gonzalez");//好的$(".data td.gonzalez");

  5.避免过度的描述

  // 糟糕的$(".data table.attendees td.gonzalez");// 好的,尽可能的去掉中间的不必要的部分 $(".data td.gonzalez");

  6.给选择器指定上下文

  $('.class');//慢的,需要遍历整个dom去查找.class$('.class', '#class-container');//快的,因为它仅在class-container元素下查找

  7.不使用全局选择器(*)

  $('div.container > *'); // 糟糕的$('div.container').children(); // 好的

  8.避免隐式的使用*

  9.不要嵌套ID,因为它通过document.getElementById()查找,不需要也不应该跟其他的选择器混在一起。

  DOM操作

  1.在操作前始终把存在的元素分离出来并且在操作后恢复它。

  var $myList = $("#list-container > ul").detach();//很多复杂的东西在$myList$myList.appendTo("#list-container");

  2.使用字符串或者array.join()而不是.append()

  性能对照:http://jsperf.com/jquery-append-vs-string-concat

  // 糟糕的var $myList = $("#list");for(var i = 0; i < 10000; i++){

  $myList.append("

  "+i+"

  ");

  }// 好的var $myList = $("#list");var list = "";for(var i = 0; i < 10000; i++){

  list += "

  "+i+"

  ";

  }

  $myList.html(list);// 更好的var array = [];for(var i = 0; i < 10000; i++){

  array[i] = "

  "+i+"

  ";

  }

  $myList.html(array.join(''));

  3.不要操作不存在的元素,

  // 糟糕的,在这个操作实现之前先运行了3个方法$("#nosuchthing").slideUp();// GOODvar $mySelection = $("#nosuchthing");if ($mySelection.length) {

  $mySelection.slideUp();

  }

  事件

  1.每个页面仅使用一个Document Ready handler,方便快速的调试和跟踪

  2.不要使用匿名方法,调试,维护,测试或重用很困难。

  $("#myLink").on("click", function(){...}); // BAD// GOODfunction myLinkClickHandler(){...}

  $("#myLink").on("click", myLinkClickHandler);

  1.

  Document ready事件处理器不应该作为一个匿名方法,再说一次,匿名方法不利于调试和跟踪。

  $(function(){ ... }); // BAD: 你永远无法重用或者测试这个方法// GOOD$(initPage); // or $(document).ready(initPage);function initPage(){

  // 页面初始化和调用其他函数的处理器 }

  1.

  Document ready处理器应该从外部文件加载并且内联的脚本可以用来初始化处理器和设置

  5.不要在HTML内使用行为标记(内联脚本),这些是调试的噩梦,始终使用JQuery绑定事件保持一致性,这样也容易添加或移除事件。bjbzj.codeplex.com;

  shbjz.codeplex.com;

  tjbjz.codeplex.com;

  cqbjz.codeplex.com;

  hebbjz.codeplex.com;

  jlbjz.codeplex.com;

  sybjz.codeplex.com;

  dlbjz.codeplex.com;

  asbjz.codeplex.com;

  jnbjz.codeplex.com;

  qdbjz.codeplex.com;

  zbbjz.codeplex.com;

  dybjz.codeplex.com;

  ytbjz.codeplex.com;

  wfbjz.codeplex.com;

  tybjz.codeplex.com;

  xamjz.codeplex.com;

  sjzmt.codeplex.com;

  tsmt.codeplex.com;

  qhdmt.codeplex.com;

  lybjz.codeplex.com;

  zzmt.codeplex.com;

  whmt.codeplex.com;

  csbjz.codeplex.com;

  wxbjz.codeplex.com;

  njbjz.codeplex.com;

  szbjz.codeplex.com;

  nbbjz.codeplex.com;

  hzbjz.codeplex.com;

  fzbjz.codeplex.com;

  xmbjz.codeplex.com;

  kmbjz.codeplex.com;

  cdbjz.codeplex.com;

  hfbjz.codeplex.com;

  gybjz.codeplex.com;

  xzbjz.codeplex.com;

  ntbjz.codeplex.com;

  jsbjz.codeplex.com;

  zjbjz.codeplex.com;

  yzbjz.codeplex.com;

  ncbjz.codeplex.com;

  gzbjz.codeplex.com;

  szjzb.codeplex.com;

  zsbjz.codeplex.com;

  stbjz.codeplex.com;

  fsbjz.codeplex.com;

  lzbjz.codeplex.com;

  zhbjz.codeplex.com;

  hzmt.codeplex.com;

  ycbjz.codeplex.com;

  xnbjz.codeplex.com;

  whjz.codeplex.com;

  czmt.codeplex.com;

  bjbjz.codeplex.com;

  shmt.codeplex.com;

  tjjz.codeplex.com;

  cqjz.codeplex.com;

  hebjz.codeplex.com;

  jljz.codeplex.com;

  syjz.codeplex.com;

  dljz.codeplex.com;

  asjz.codeplex.com;

  jnjz.codeplex.com;

  qdjz.codeplex.com;

  zbjz.codeplex.com;

  dyjz.codeplex.com;

  ytjz.codeplex.com;

  wfjz.codeplex.com;

  tyjz.codeplex.com;

  xajz.codeplex.com;

  sjbjz.codeplex.com;

  tsjz.codeplex.com;

  qhbjz.codeplex.com;

  lyjz.codeplex.com;

  zzjz.codeplex.com;

  whbz.codeplex.com;

  csjz.codeplex.com;

  wxjz.codeplex.com;

  njjz.codeplex.com;

  szjz.codeplex.com;

  nbjz.codeplex.com;

  hzjz.codeplex.com;

  fzjz.codeplex.com;

  xmjz.codeplex.com;

  kmjz.codeplex.com;

  cdjz.codeplex.com;

  hfjz.codeplex.com;

  gyjz.codeplex.com;

  xzjz.codeplex.com;

  ntjz.codeplex.com;

  jhjz.codeplex.com;

  zjjz.codeplex.com;

  yzjz.codeplex.com;

  ncjz.codeplex.com;

  gzjz.codeplex.com;

  szgjz.codeplex.com;

  zsjz.codeplex.com;

  stjz.codeplex.com;

  fsjz.codeplex.com;

  lzjz.codeplex.com;

  zhjz.codeplex.com;

  fzmjz.codeplex.com;

  ycjz.codeplex.com;

  xnjz.codeplex.com;

  whmjz.codeplex.com;

  czjz.codeplex.com;

  my link $("#myLink").on("click", myEventHandler); // GOOD

  6.如果可能,对于事件使用自定义的命名空间,这样更容易移除指定的事件

  AJAX

  1.避免使用.getJson() 或 .get(),而是直接使用$.ajax()方法

  2.不要使用http或https请求,宁愿选择无模式的URLs,从url中去掉http或https

  3.不要在url中加参数,用data对象传递它们。

  // Less readable...$.ajax({

  url: "something.php?param1=test1¶m2=test2",

  ....

  });// More readable...$.ajax({

  url: "something.php",

  data: { param1: test1, param2: test2 }

  });

  4.指定数据格式,它能更快速的知道你正在使用哪种数据。(Ajax Template example部分)

  5.Ajax加载的内容使用委派的事件处理程序,委派事件的优点是可以处理后加载到文档里的事件。

  $("#parent-container").on("click", "a", delegatedClickHandlerForAjax);

  6.使用约定的接口

  $.ajax({ ... }).then(successHandler, failureHandler);// ORvar jqxhr = $.ajax({ ... });

  jqxhr.done(successHandler);

  jqxhr.fail(failureHandler);

  7.一个简单完整的ajax模板

  var jqxhr = $.ajax({

  url: url,

  type: "GET", // 默认是GET,可以换成你需要的方式

  cache: true, // 默认是true,但是对于dataType 为'script' 和 'jsonp'类型默认是false,所以按需调整。

  data: {}, // 把需要提交的参数写在这里

  dataType: "json", // 指定数据类型

  jsonp: "callback", // only specify this to match the name of callback parameter your API is expecting for JSONP requests.

  statusCode: { // 如果想处理具体的错误代码,使用的状态代码映射设置

  404: handler404, 500: handler500

  }

  });

  jqxhr.done(successHandler);

  jqxhr.fail(failureHandler);

  效果和动画

  1. 采取严谨和一致的方法来实现动画功能。

  2. 直到被UX需求驱动否则不要过度做动画效果。

  尝试使用简单的show/hide, toggle and slideUp/slideDown功能切换元素。

  使用预定的参数"slow", "fast" 或者400 (中等速度).

  插件

  1.始终使用有良好支持,文档,测试和社区支持的插件

  2.检查插件与你所使用的jQuery版本是否兼容

  3.任何常见的可重用组件应该实现为一个jQuery插件,点击这里查看jQuery插件样板代码。

  链式操作

  1.使用链式操作代替变量缓存和多次操作

  2.每当链长超过3个链接或得到,因为活动任务的复杂,使用适当的换行和缩进使代码的可读性。

  $("#myLink")

  .addClass("bold")

  .on("click", myClickHandler)

  .on("mouseover", myMouseOverHandler)

  .show();

  3.对于较长的链式操作可以把对象缓存到一个变量里。

  杂项

  1.为参数使用对象字面量。

  $myLink.attr("href", "#").attr("title", "my link").attr("rel", "external"); // BAD, 3 calls to attr()// GOOD, only 1 call to attr()$myLink.attr({

  href: "#",

  title: "my link",

  rel: "external"});

  2.不要混合使用CSS与jQuery。

  $("#mydiv").css({'color':red, 'font-weight':'bold'}); // BAD.error { color: red; font-weight: bold; } /* GOOD */$("#mydiv").addClass("error"); // GOOD

  3.不要使用过时的方法,始终要注意新版本中一些摒弃的方法并且试着不要使用它们,点击这里查看过时方法的列表

  4.必要时结合使用jQuery的原生JavaScript。参见下面给出的例子的性能差异:http://jsperf.com/document-getelementbyid-vs-jquery/3

  $("#myId"); // 它始终比下边的慢一点document.getElementById("myId");

0 0
原创粉丝点击