Web 前端最佳实践
前端
选择器
- 尽量使用ID选择器
- 基于Id的选择器:先使用ID选择器定位,然后再使用find方法精确查找
// Fast:$( "#container div.robotarm" );// Super-fast:$( "#container" ).find( "div.robotarm" );
- 指定选择的上下文
// 劣质的代码:因为需要遍历整个DOM来找到.class$('.class');// 高品代码:因为只需在指定容器范围内进行查找$('.class', '#class-container');
这一条是否有上一条等同?
- 多级查找:右边尽量指定得详细点而左边则尽量简单点
// Unoptimized:$( "div.data .gonzalez" );// Optimized:$( ".data td.gonzalez" );
- 避免冗余
$( ".data table.attendees td.gonzalez" );// Better: Drop the middle if possible.$( ".data td.gonzalez" );
- 不要ID与其它选择器混搭
ID已经表示唯一了,再加上其它选择符只会加重选择器的负担
$('#outer #inner'); // 脏$('div#inner'); // 乱$('.outer-container #inner'); // 差$('#inner'); // 干净利落,后台只需调用document.getElementById()
- 不要使用万能选择器
$( ".buttons > *" ); // Extremely expensive.$( ".buttons" ).children(); // Much better.$( ".category :radio" ); // Implied universal selection.$( ".category *:radio" ); // Same thing, explicit now.$( ".category input:radio" ); // Much better.
Dom 操作
避免DOM节点频繁流化
样本代码
$.each( myArray, function( i, item ) {var newListItem = "<li>" + item + "</li>";$( "#ballers" ).append( newListItem );});
方法一: 临时detach
var ballers = $("#ballers");var parent = ballers.parent();ballers.detach();$.each(myArray, function(i, item) {var newListItem = "<li>" + item + "</li>";ballers.append(newListItem);});parent.append(ballers);var table = $( "#myTable" );var parent = table.parent();table.detach();// ... add lots and lots of rows to tableparent.append( table );
方法二:创建临时DOM节点
var frag = document.createDocumentFragment();$.each( myArray, function( i, item ) {var newListItem = document.createElement( "li" );var itemText = document.createTextNode( item );newListItem.appendChild( itemText );frag.appendChild( newListItem );});$( "#ballers" )[ 0 ].appendChild( frag );
方法三:append html
var myHtml = "";$.each( myArray, function( i, item ) {myHtml += "<li>" + item + "</li>";});$( "#ballers" ).html( myHtml );
临时改变多个节点样式
// Fine for up to 20 elements, slow after that:$( "a.swedberg" ).css( "color", "#0769ad" );// Much faster:$( "<style type=\"text/css\">a.swedberg { color: #0769ad }</style>").appendTo( "head" );//预定义css类会更好// .swedberg_color{color:#0769ad}$( "a.swedberg" ).addClass("swedberg_color" );
CSS
JS 编码
代码组织
链式写法要换行
$("#myLink").addClass("bold").on("click", myClickHandler).on("mouseover", myMouseOverHandler).show();
链式写法中避免使用匿名函数,否则会严重影响代码易读性
使用变量保存选择器结果方便重用
//bad$("#myLink").addClass("bold");//stuff$("#myLink").on("click", myClickHandler)//bettervar myLink=$("#myLink").addClass("bold");//stuffmyLink.on("click", myClickHandler)
利用闭包保持代码整洁
//badvar privateThing = "secret";var publicThing = "not secret";var changePrivateThing = function() {privateThing = "super secret";};var sayPrivateThing = function() {console.log( privateThing );changePrivateThing();};sayPrivateThing();//bettervar feature = (function() {// Private variables and functionsvar privateThing = "secret";var publicThing = "not secret";var changePrivateThing = function() {privateThing = "super secret";};var sayPrivateThing = function() {console.log( privateThing );changePrivateThing();};// Public APIreturn {publicThing: publicThing,sayPrivateThing: sayPrivateThing};})();feature.sayPrivateThing();
- 利用“事件冒泡”机制进行事件绑定
//bad$('ul>li').on('click',clientHandler);//better$('ul').on('click','li',clientHandler);
- 数组循环中不要每次循环都访问数组的长度,应该先缓存长度
//好的写法var myLength = myArray.length;for ( var i = 0; i < myLength; i++ ) {// do stuff}//好的写法for ( var i = 0,myLength=myArray.length; i < myLength; i++ ) {// do stuff}//差的写法for ( var i = 0; i < myArray.length; i++ ) {// do stuff}
- 其它
//bad// 糟糕:调用了三次attr$myLink.attr("href", "#").attr("title", "my link").attr("rel", "external");//better// 不错,只调用了一次attr,css函数与此类似$myLink.attr({href: "#",title: "my link",rel: "external"});
参考
Web 前端最佳实践的更多相关文章
- ASP.NET Core Web API 最佳实践指南
原文地址: ASP.NET-Core-Web-API-Best-Practices-Guide 介绍 当我们编写一个项目的时候,我们的主要目标是使它能如期运行,并尽可能地满足所有用户需求. 但是,你难 ...
- JavaScript Web 应用最佳实践分析
[编者按]本文作者为 Mathias Schäfer,旨在回顾在客户端大量使用JavaScript 的最佳 Web应用实践.文章系国内 ITOM 管理平台 OneAPM 编译呈现. 对笔者来说,Jav ...
- 8102 年的现代 Web 开发最佳实践(笑)
简评:8102 年了,现在 web 开发的最佳实践是什么,让本文来告诉你.原文只提到一部分,可以查看 reddit 上对此文的评论查看补充的最佳实践 https://old.reddit.com/r/ ...
- [转]ASP.NET Core Web API 最佳实践指南
原文地址: ASP.NET-Core-Web-API-Best-Practices-Guide 转自 介绍# 当我们编写一个项目的时候,我们的主要目标是使它能如期运行,并尽可能地满足所有用户需求. 但 ...
- 前端最佳实践——DOM操作
1.浏览器渲染原理 在讲DOM操作的最佳性能实践之前,先介绍下浏览器的基本渲染原理. 分为以下四个步骤: 解析HTML(HTML Parser) 构建DOM树(DOM Tree) 渲染树构建(Rend ...
- 基于springboot的web项目最佳实践
springboot 可以说是现在做javaweb开发最火的技术,我在基于springboot搭建项目的过程中,踩过不少坑,发现整合框架时并非仅仅引入starter 那么简单. 要做到简单,易用,扩展 ...
- WEB开发最佳实践
linux命令 man ls:显示ls的命令详情,man命令可以查具体的命令详情
- WEB前端工程师(实践)制作天气预报难度:简单
需要准备:jQuery Bootstrap 天气预报API(本文中使用API可能会失效请灵活运用) CSS样式可以你自己去写这里只提出jQuery 请求数据和解析JSON数据 { "resu ...
- web前端开发最佳实践笔记
一.文章开篇 由于最近也比较忙,一方面是忙着公司的事情,另外一方面也是忙着看书和学习,所以没有时间来和大家一起分享知识,现在好了,终于回归博客园的大家庭了,今天我打算来分享一下关于<web前端开 ...
随机推荐
- MyBatis学习总结4--解决字段名与实体类属性名不相同的冲突
在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定是完全相同的,如果直接在xml映射文件中使用sql进行映射,会造成返回值为空的情况,下面阐述解决方案: 测试所用表和数据 create t ...
- hdu 4901 The Romantic Hero (dp)
题目链接 题意:给一个数组a,从中选择一些元素,构成两个数组s, t,使s数组里的所有元素异或 等于 t数组里的所有元素 位于,求有多少种构成方式.要求s数组里 的所有的元素的下标 小于 t数组里的所 ...
- UVa 11859 (Nim) Division Game
把每一行m个数所有的素因子看做一堆,就把问题转化为n堆的Nim游戏. 然后预处理一下10000以内每个数素因数的个数,再根据书上的Bouton定理,计算一下n行素因数个数的异或和. 为0是先手必败局面 ...
- <pages validateRequest="false"/>在.net4.0中无效的问题
再web.config中设置<pages validateRequest="false"/>在.net4.0中无效的问题 解决方案: <system.web> ...
- hdu 4691 Front compression
暴力水过,剪一下枝= =果断是数据水了 #include<cstdio> #include<cstring> #include<algorithm> #define ...
- TS数据结构分析
1.TS包得数据结构 2. // Transport packet headertypedef struct TS_packet_header{ unsigned sync_byte ...
- 【jQuery】jQuery筛选器规则
转载自:http://blog.csdn.net/lijinwei112/article/details/6938134 筛选器中加入变量 var ac = "select_" + ...
- ECshop 二次开发模板教程4
今天我们学习一下如何在首页调取某个分类的商品:注意了,这里的修改有一些麻烦了哦:首先你需要下载一套新的模板,比如blueksy 上传到模板目录 /themes/ 也就是 /themes/bluesky ...
- 阿里云容器服务--配置自定义路由服务应对DDOS攻击
阿里云容器服务--配置自定义路由服务应对DDOS攻击 摘要: 容器服务中,除了slb之外,自定义路由服务(基于HAProxy)也可以作为DDOS攻击的一道防线,本文阐述了几种方法来应对普通规模的DDO ...
- MySQL索引与优化策略
1. MySQL索引实现 在MySQL中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的,下面主要讨论MyISAM和InnoDB两个存储引擎的索引实现方式. MyISAM索引实现 M ...