[TOC]
jade
文档
http://www.nodeclass.com/api/jade.html
https://segmentfault.com/a/1190000000357534
模板继承
关键语法:extends block append prepend
Jade 支持通过 block 和 extends 关键字来实现模板继承。即在一个文件中定义页面结构模板,可在另一文件中继承该结构,也可通过append,prepend进行前后追加。
Mixins
关键语法:mixin +(define)
在一个文件中可定义多个被页面重复使用的代码块,然后通过调用使用,当有页面元素有变动时,可实现全部页面的修改。
具体语法:
无变量
basic.jade1
2
3
4
5
6
7
8
9
10mixin link
  ...
mixin head
  ...
mixin sidebar
  ...
mixin mask
  ...
mixin paging
  ...
backPC.jade1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19include ./basic.jade
body.page-body
    include ./basic.jade
    +head
    div.main-content
      +sidebar
      div.content.col-lg-10(style="width:81.5%!important;")
        table.table.table-bordered.table-striped(style="width:100%!important")
          thead
            tr
              th 序号
              th 状态
              th 来信人
              th 手机号
              th 时间
              th 问题简介
              th 身份
          tbody.dataBody
        +paging
有变量(暂无使用,但重构时可能会用到)
basic.jade1
2
3
4mixin pets(pets)
  ul.pets
    - each pet in pets
      li= pet
index.jade1
2
3include ./basic.jade
...
+pets(mouse)
变量引用
关键语法:#{}
略
点击穿透问题
问题描述:给某元素绑定touch事件时,会同时触发该元素之下的元素的一些事件。
解决方案:在事件内添加代码1
e.preventDefault();
该方法将通知Web浏览器不要执行与事件关联的默认动作(如果存在这样的动作)。
iphone点击延迟问题
问题描述:由于iphone手机需要一定时间判断是否使用手势,所以上触发点击事件时会有大约300ms的延迟。
解决方案:
1. zepto中加入[touch模块](https://github.com/madrobby/zepto/blob/master/src/touch.js#files)<br>
2.将click改成touchstart
<br>
多选框全选/取消全选问题
问题描述:全选事件只能触发一次
解决方案:将attr换成prop1
2
3
4
5
6
7
8
9
10
11// 功能:全选
$(document).on('click','.check-btn',function(){
    // console.log($('input[id^="cbtest"]').attr())
    $('input[id^="cbtest"]').prop('checked',true)
});
// 功能:全不选
$(document).on('click','.cancel-check',function(){
    // console.log($('input[id^="cbtest"]').attr())
    $('input[id^="cbtest"]').prop('checked',false)
});
attr与prop区别:属性可自定义时使用attr,反之使用prop。
上拉刷新问题
问题描述:文档上拉时触发事件
解决方案:
1.引入dropload.js
2.js中引入代码1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27$('body').dropload({
        scrollArea : window,
        domUp : {
                domClass   : 'dropload-up',
                domRefresh : '<div class="dropload-refresh">↓下拉刷新-订单状态</div>',
                domUpdate  : '<div class="dropload-update">↑释放更新-订单状态</div>',
                domLoad    : '<div class="dropload-load"><span class="loading"></span>加载中-订单状态...</div>'
            },
        domDown : {
                domClass   : 'dropload-down',
                domRefresh : '<div class="dropload-refresh"></div>',
                domLoad    : '<div class="dropload-load"><span class="loading"></span></div>',
                domNoData  : '<div class="dropload-noData"></div>'
            },
        loadUpFn : function(me){
              curPage = 1;
              tasksQuery();
              me.resetload();
        },
        loadDownFn : function(me){
            me.resetload();
            $('.dropload-down').hide();//隐藏下拉,保留上拉
        },
        threshold : 50,
        distance:20
    });
聊天框自动变化问题
预期效果:文本增加时,textarea的高度也随之增加,增加到一定值内滚动显示;聊天内容发出后内容清空,文本框还原大小。
解决方案:
html:1
<textarea id="textarea"></textarea>
js:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28var addHandler = window.addEventListener?
function(elem,event,handler){elem.addEventListener(event,handler);}:
function(elem,event,handler){elem.attachEvent("on"+event,handler);};
var dd = function(id){return document.getElementById(id);}
function autoTextArea(elemid){
    //新建一个textarea用户计算高度
    if(!dd("_textareacopy")){
        var t = document.createElement("textarea");
        t.id="_textareacopy";
        t.style.position="absolute";
        t.style.left="-9999px";
        document.body.appendChild(t);
    }
    function change(){
        dd("_textareacopy").value= dd(elemid).value;
        dd(elemid).style.height= dd("_textareacopy").scrollHeight+dd("_textareacopy").style.height+"px";
    }
    addHandler(dd("textarea"),"propertychange",change);//for IE
    addHandler(dd("textarea"),"input",change);// for !IE
    dd(elemid).style.overflow="hidden";//一处隐藏,必须的。
    dd(elemid).style.resize="none";//去掉textarea能拖拽放大/缩小高度/宽度功能
}
addHandler(window,"load",function(){
    autoTextArea("textarea");
});
自动定位至聊天窗口底部
预期效果:打开聊天窗口或发送消息后,自动定位至最后一条消息,即聊天窗口底部。
解决方案:1
$('.chat-cell').scrollTop($('.chat-cell')[0].scrollHeight);
点击查看大图问题
预期效果:
- 当图片高度小于设备高度时垂直居中显示图片,背景黑色;
- 当图片高度大于设备高度时滚动显示。
解决方案:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29    let imgUrl = $(this).attr('src');
    $('.full-img').attr('src',imgUrl);
    $('.rDialog-mask3').show();
    $('.full-img').show();
    // alert($('.full-img').height());
     // alert(window.innerHeight);
    if($('.full-img').height()>window.innerHeight){
        $('.full-img').css('position','static');
        $('.full-img').css('overflow','scroll');
        $('.full-img').css('top','0');
        // alert('over')
    }else{
        $('.full-img').css('position','fixed');
        $('.full-img').css('overflow','hidden');
        var x=$('.full-img').offset();
        // alert(x.height);
        var top = (window.innerHeight - x.height)/2;
        // alert(top);
        $('.full-img').css('top',top + 'px');
        // alert($('.full-img').height());
        // alert(window.innerHeight);
    }
});
<!--退出全屏-->
$(document).on('touchstart','.full-img-div,.full-img,.rDialog-mask3',function(){
    $('.rDialog-mask3').hide();
    $('.full-img').hide();
});
提示框规范
预期效果:
- 当弹出框时间未定义时默认1000ms;
- 当弹出框时间有定义时使用定义时间。
解决方案1
2
3
4
5
6
7
8
9
10function setAlert(str,timeAlert){
    if(typeof(timeAlert) == 'undefined'){
        timeAlert = 1000;
    }
    $('.alert-modal').html(str);
    $('.alert-modal').fadeIn();
    setTimeout(function(){
         $('.alert-modal').fadeOut();
    },timeAlert);
}
验证特殊字符输入
预期效果:当输入特殊字符时提示;
解决方案:1
2
3
4
5
6
7
8function stripscript(s) {
    var pattern = new RegExp("[特殊字符]")
        var rs = "";
    for (var i = 0; i < s.length; i++) {
        rs = rs + s.substr(i, 1).replace(pattern, '');
    }
    return rs;
}
数据搜索
预期效果:
- 输入时进行检索;
- 支持模糊查找;
- 搜索速度尽量快。
解决方案:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46// 功能:搜索
var createLi = function(index){
    $('.schoolUlSelect').append('<li class="querySchool">'+schoolSearch[index].school+'</li>')
}
  var removeLi = function(index){
    $('.schoolUlSelect').eq(i).remove();
  }
  var emptyLi = function(){
    $('.schoolUlSelect').empty();
  }
  
  var preVal = $('.search-input')[0].value;
  $('.search-input')[0].oninput = function(){
    var nextVal = $('.search-input')[0].value;
    if(preVal.length == 0){//判断是否为首次输入
      emptyLi();
      if(schoolSearch.length == 0){
        $.post('/school/getSchool', function (data) {
          schoolSearch = data;
          $.each(schoolSearch,function(i,item){
            if(item.school.indexOf(nextVal) > -1){
              createLi(i);
            }
          });
        });
      }else{
        $.each(schoolSearch,function(i,item){
          if(item.school.indexOf(nextVal) > -1){
            createLi(i);
          }
        });
      }
    }else{
      if(nextVal.length > preVal.length){ //键盘继续输入
        $.each($('.querySchool'),function(i,item){
          if(item.html().indexOf(nextVal) == -1){
            $('.querySchool').eq(i).remove();
          }
        });  
      }
    }
    
  }
| 类名 | 释义 | 
|---|---|
| schoolUlSelect | 搜索结果面板 | 
| querySchool | 每条数据 | 
| search-input | 输入框 | 
原生JS轮播图
预期效果:使用原生JS进行图片轮播
解决方案:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
// 轮播
var box=document.getElementById('box');
var uls=document.getElementsByTagName('ul');
var imgs=uls[0].getElementsByTagName('li');
var btn=uls[1].getElementsByTagName('li');
var i=0; //中间量,统一声明;
var index = 0;
var play=null;
// console.log(box,uls,imgs,btn);//获取正确
//图片切换, 淡入淡出效果我是用(transition: opacity 0.8s linear)做的,不纠结、简单 在css里面
function show(a){        //方法定义的是当传入一个下标时,按钮和图片做出对的反应
  for(i=0;i<btn.length;i++ ){
    btn[i].className='';    //很容易看懂吧?每个按钮都先设置成看不见,然后把当前按钮设置成可见。
    btn[a].className='current';
  }
  for(i=0;i<imgs.length;i++){ //把图片的效果设置和按钮相同
    imgs[i].style.opacity=0;
    imgs[a].style.opacity=1;
  }
}
//切换按钮功能,响应对应图片
for(i=0;i<btn.length;i++){
  btn[i].index=i;  //不知道你有没有发现,循环里的方法去调用循环里的变量体i,会出现调到的不是i的变动值的问题。所以我先在循环外保存住
  btn[i].onmouseover=function(){
    show(this.index);
    clearInterval(play); //这就是最后那句话追加的功能
  }
}
//自动轮播方法
function autoPlay(){
    play=setInterval(function(){ //这个paly是为了保存定时器的,变量必须在全局声明 不然其他方法调不到 或者你可以调用auto.play 也许可以但是没时间试了
    index++;
    index>=imgs.length&&(index=0);//可能有优先级问题,所以用了括号,没时间测试了。
    show(index);
  },4500)
}
autoPlay();//马上调用,我试过用window.onload调用这个方法,但是调用之后影响到了其他方法,使用autoPlay所以只能这样调用了
//div的鼠标移入移出事件
box.onmouseover=function(){
  clearInterval(play);
};
box.onmouseout=function(){
  autoPlay();
};
//按钮下标也要加上相同的鼠标事件,不然图片停止了,定时器没停,会突然闪到很大的数字上。 貌似我可以直接追加到之前定义事件中。
滚动至特定位置固定
预期效果:菜单栏滚动至页面上方时固定住,向下滚动时自动释放。
解决方案:
| 1 | // 滚动监听 | 
|  类名  |  释义  |
| – | – |
|  list  |  菜单栏上方元素  |
|  tab  |  菜单栏  |
|  task-list  |  二级菜单栏  |
|  money-list  |  二级菜单栏  |
iphone无法触发点击事件问题
问题描述:JS绑定点击事件时,iphone无法触发
解决方案:
给绑定的元素添加css属性1
cursor:pointer;
点击出现蓝框问题
问题描述:点击元素时出现蓝框
解决方案:
给绑定元素添加css属性1
2outline:none;
-webkit-tap-highlight-color: rgba(255, 255, 255, 0);
隐藏滚动条
预期效果:内容超出时滚动,滚动条隐藏
解决方案1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19element::-webkit-scrollbar{  
    width: 5px;  
    height: 5px;  
    background-color: #fff;  
}  
  
/*定义滚动条轨道 内阴影+圆角*/  
element::-webkit-scrollbar-track{  
    // -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.3);  
    border-radius: 10px;  
    background-color: #fff;  
}  
  
/*定义滑块 内阴影+圆角*/  
element::-webkit-scrollbar-thumb{  
    border-radius: 10px;  
    -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,.3);  
    background-color: #fff;  
}
头像
问题描述:使头像正常显示完全,不水平或竖直压缩
解决方案:
jade1
2div.head-picture-t
	div.head-picture-div(style="background-image: url('#{msgRecord[i].fromUserHeadimgurl}')")
css1
2
3
4
5
6
7
8
9
10
11
12
13
14
15.head-picture-t{
	width: 1.2rem;
    height: 1.2rem;
    overflow: hidden;
}
.head-picture-div{
	width: 100%;
    height: 100%;
    background-position: center;
    background-size: auto 1.2rem;
    background-repeat: no-repeat;
    border-radius:0.2rem; 
    margin: auto;
	// background-image: url('1.jpg');
}
快捷键设置
预期效果:使用键盘快捷键触发事件
解决方案
下载依赖1
$ npm install hotkeys-js
引入文件1
import hotkeys from 'hotkeys-js';
引用1
2
3
4
5
6hotkeys('enter',function(event,handler){
    event.preventDefault();
    event.stopPropagation();
	//触发函数
});
详情见文档
