On Github jmjweb / web-dev-share
Created by jmj
JS里变量没有使用范围,任何变量,函数,数组,对象,只要不在函数内部,都被认为是全局的
为防止变量的污染,解决办法:
根据js的作用域规则,函数外部无法访问内部的变量。所以把变量放在一个匿名函数内部,定义完之后立即调用它
例如:
下面的写法将会产生三个全局变量和两个全局函数:
var name = 'jmj';
var age = '23';
var status = 'single';
function createGirl(){
// your code
}
function getGirlDetails(){
// your code
}
解决:
;(function(){
var name = 'jmj';
var age = '23';
var status = 'single';
function createGirl(){
// your code
}
function getGirlDetails(){
// your code
}
})();
如果你想在函数外面也能使用里面的东西,那就要做些修改:
var myApplication = function(){
var name = 'jmj';
var age = '23';
var status = 'single';
return{
createGirl: function(){
// your code
},
getGirlDetails: function(){
// your code
}
}
}();
//使用:
myApplication.createGirl();
myApplication.getGirlDetails();
定义全局函数:
window.FUN = {};
var FUN = {
search: function(){},
currency: function(){},
cart: function(){}
//some....
}
//使用:
FUN.search();
FUN.currency();
FUN.cart();
或者:
FUN.cart = {
addCart: function(){},
miniCart: function(){}
//some...
}
FUN.cart.addCart();
FUN.cart.miniCart();
在同一个函数内部,局部变量的声明建议置于顶端
// 孬
var clear = function(el) {
var id = el.id;
//your code
var name = el.getAttribute("data-name");
//your code
return true;
}
便于其他人查阅代码时,一眼看出此函数所使用的所有变量
// 好
var clear = function(el) {
var id = el.id,
name = el.getAttribute("data-name");
//your code
return true;
}
使用变量前,要判断它是否存在/定义
FUN.methodName = function(a){
var a = a || 1;
//或
var a = arguments.length >= 1 ? a : 1;
//或
var a = typeof a==='undefined' ? 1 : a;
//总结:使用变量名得有个备胎,防止报错
}
缓存变量
// 孬
var
a = $('#container'),
b = $('#container li'),
c = $('#container li span');
// 好
var
a = $('#container '),
b = a.find('li'),
c = b.find('span');
缓存变量
//孬
var h = $('#element').height();
$('#element').css('height',h-20);
//好
var e = $('#element');
var h = $element.height();
e.css('height',h-20);
// some code 下面可能又有用到变量e的地方
尤其函数内部使用this或者$(this)时:
var that = $(this); //或者 var _self = $(this);
//孬
$('.select-item').on('click', '.tit', function() {
if(!$(this).hasClass('on')){
$(this).siblings('ul').show();
}else{
$(this).siblings('ul').hide();
}
});
//好
$('.select-item').on('click', '.tit', function() {
var that = $(this);
if(!that.hasClass('on')){
that.siblings('ul').show();
}else{
that.siblings('ul').hide();
}
});
/* 孬的: */
.s-scr {
overflow: auto;
}
.cb {
background: #000;
}
/* 好的:*/
.is-scrollable {
overflow: auto;
}
.column-body {
background: #000;
}
//孬的:
function unit(){
//your code
}
//好的:
function getUnitList(){
//your code
}
/* 孬的: */
.hotelTitle {
font-weight: bold;
}
/* 好的:*/
.hotel-title {
font-weight: bold;
}
原因:
用js代替jQuery举例:
//jQuery:
$('#myElement');
//js:
// IE 5.5+
document.getElementById('myElement');
// IE 8+
document.querySelector('#myElement');
用js代替jQuery举例:
//jQuery:
$('.myElement');
//js:
// IE 9+
document.getElementsByClassName('myElement');
// IE 8+
document.querySelectorAll('.myElement');
此DOM API还有以下用法(就像css选择器一样):
document.querySelectorAll('div');
document.querySelectorAll('[data-name="hello"]');
document.querySelectorAll('#mainWrap > div')
//感兴趣搜索其它语法
利用这些特性简单的封装一下:
window.$ = function(selector) {
var selectorType = 'querySelectorAll';
return document[selectorType](selector);
};
$('#mainWrap')
$('div')
$('[data-name="hello"]')
$('#mainWrap > div')
//jQuery内部就是通过这个DOM API封装的选择器,不过有作其它兼容性处理,在此不多讨论
网速慢怎么办? 异步表单提交的时候 onsubmit="return false"
提交事件绑定在form标签上的submit,而不是click
异步操作的时候,需要有loading状态 按钮加上disabled、cursor (例如:加入购物车方法,按下按钮后,需要禁用按钮,有一个等待状态,此时按钮无事件)
使用dom前,判断是否存在
if($('element').length){
//your code
}
表现与结构分离,避免代码耦合
减少使用$(ele).css('property', 'value'),使用addClass()代替
异步加载js,css也可以异步加载
//定义函数
FUN.loadCSS = function(url ,callback){
var linkLabel = document.createElement('link');
linkLabel.rel = 'stylesheet';
linkLabel.href = url;
document.body.appendChild(linkLabel);
}
//使用
FUN.loadCSS(DIST_URL+'js.plug/swiper.min.css');
//选择性使用
element.value ? FUN.loadCSS(DIST_URL+'js.plug/swiper.min.css') : '';
丢弃HTML5淘汰的标签及属性,如,align, cellspacing, font等;
与后端约定好json格式
以对象的形式返回回来,而不是字符串
如果是字符串,请使用$.parseJSON而不是eval
{
"status":0,
"msg":"success",
"data": {
"off_price": "999"
}
}
内容部分或者重要的内容放在html前面优先加载,再采用float、position等方法布局
因为我们的模板使用的是smarty,所以html不要使用html注释< !-- -->,而使用smarty注释{* *} 推荐安装sublime插件smarty
公用函数必须写注释 (参数、数据类型、返回值) 推荐sublime插件DocBlockr
/*
* @desc 加入商品到收藏夹
* @param {object||string} obj 点击那个按钮到收藏夹 该按钮需要有属性 gid
* @param {function} callback 加入成功后,还需要何操作?
* @author jiangminjing
* @date 2015/05
* @return
*/
公用函数:
GLOBAL.currency.change_houbi(); GLOBAL.cart.addCart(); GLOBAL.sign.login();
等等....
各位同事也可以扩展我们的公用函数写在common.min.js里
js/jq插件:
jQuery很方便、可以提高开发效率,这无可否认。但是我们还可以让它更方便一些 ———— jQuery插件
优秀的jQuery插件:
等等.....
使用插件的注意事项:
if(element.length){
FUN.loadCSS('/path/js.pulg/file.css');
$.LAB.script('/path/js.pulg/file.js')
.script(function(){
//使用插件
})
}
一个钉子,用于固定页面元素
jquery.nail.js
评分星星
jquery.voteStar.js
Created by 江大侠