zoukankan      html  css  js  c++  java
  • pc端项目问题总结

    一、相对路径

    1、css文件中所出现的相对路径,以css文件所在位置为准

    2、js文件中所出现的相对路径,以导入此js文件所在的动态网页所在的位置为准

    二、javascript浮点运算bug

    如:119.01 + 0.01 === ??  //  119.02000000000001

    原因:js数字类型以64位的IEEE 754格式存储的

    办法:最后结果采用 Number.toFixed(2)  保留两位小数

    三、异步处理

    1、js异步处理原理

    1)异步调用过程:

      1、主线程发起异步请求  

      2、工作线程收到请求并执行异步任务  

      3、异步任务完成,通知主线程开始调用回调函数 (通知机制:消息队列和事件循环)

      4、主线程收到通知,完成当前的任务后开始执行回调函数

    2)通知机制实现原理:

      工作线程将消息放到消息队列,主线程通过事件循环过程去取消息

      消息队列:消息队列是一个先进先出的队列,它里面存放着各种消息

      事件循环:事件循环是指主线程重复从消息队列中取消息、执行的过程

    3) 图示:

      

    4)所用之处:

      1、所有的定时器都是异步

      2、所有的事件绑定都是异步

      3、异步ajax

    2、异步解决方案

    1)回调函数法:代码易冗余

    2) promise法:

      1、promise 有三种状态:"成功" 、"失败"、"等待" ,分别为Fulfilled 、 Rejected 、 Pending ; Promise函数中有两个参数,分别对应着 resolve 及 reject 状态

      2、初始化一个Promise对象后,其then方法第一个参数为成功的回调、第二个参数为失败的回调、第三个为捕捉的错误信息

      3、then方法中可以继续返回一个Promise对象、或者返回一个正常值;如果没有返回,默认返回为undefined

      

    var promise = new Promise(function(resolve, reject) {
        var value = '大于30s',
          error = '小于30s';
    
        setTimeout(function() {
          console.log(new Date().getSeconds())
          if (new Date().getSeconds() > 30) {
            resolve(value)
          } else {
            reject(error)
          }
        }, 1000)
      })
    
    
    promise
        .then(
          function(value) {
            alert('我是成功执行的函数---' + value)
            return value + '成功执行后的返回值'
          },
          function(error) {
            alert('我是失败执行的函数---' + error)
            return error + '失败执行后的返回值'
          })
        .then(function(lastData) {
          alert(lastData)
        })
        .then(function(value){
          throw new Error('I got undefined')
        })
        .catch(function(error){
          alert('我捕获到了错误 ' + error)
        })
    

      优点:1、异步代码同步化写法、避免回调地域

         2、异步函数中能够返回值,并在then中成功获取返回后的结果

          

    四、列表字数过长显示效果

    1)单行宽度固定,当字数超过固定宽度时,强制显示在一行并将溢出部分隐藏

    .test{
        display: block;
        50px;
        overflow: hidden;
        white-space: nowrap;            
    }    

     2)单行宽度固定,当字数超过固定宽度时,强制显示在一行并将溢出部分...

    1 .ellipsis-1{
    2     display: block;
    3     width:50px;
    4     white-space: nowrap;
    5     text-overflow: ellipsis;            
    6 }  

    五、金额计算方法

    1)针对两数和为100%的百分比计算法,统一为:

      第二个数值  =  1 - 第一个数值

    2)针对多个数值依次递增计算时,统一为:

      第一个值 = 第一个值 * ( 1 + 百分比一:即0 )

      第二个值 = 第一个值 * ( 1 + 百分比二)

      第三个值 = 第一个值 * ( 1 + 百分比二) * ( 1 + 百分比三) 

      第四个值 = 第一个值 * ( 1 + 百分比二) * ( 1 + 百分比三)* ( 1 + 百分比四)

    六、函数声明和函数表达式的区别

    1、函数声明会将整个函数提升,为规范代码风格,不建议使用函数声明法,禁止在if语句中使用函数声明;其函数名在自身作用域和其父作用域中均可获取

    2、函数表达式是表达式的一种,如果函数表达式有名字的话,在外围作用域是无法获取

     1 function a1(){
     2     function b(){
     3       return '我是函数声明b'
     4     }
     5 
     6     return b()
     7 
     8     function b(){
     9       return '我也是函数声明b'
    10     }
    11   }
    12 
    13   console.log(a1())
    14 
    15   function a2(){
    16     var b = function(){
    17       return '我是函数表达式b'
    18     }
    19 
    20     return b()
    21 
    22     var b = function(){
    23       return '我也是函数表达式b'
    24     }
    25 
    26   }
    27 
    28   console.log(a2())
    29 
    30   function a3(){
    31     return b
    32     var b = function(){
    33       return '我是函数表达式b'
    34     }
    35 
    36     var b = function(){
    37       return '我也是函数表达式b'
    38     }
    39 
    40   }
    41 
    42   console.log(a3())
    43 
    44   function a4(){
    45     return b()
    46     var b = function(){
    47       return '我是函数表达式b'
    48     }
    49 
    50     var b = function(){
    51       return '我也是函数表达式b'
    52     }
    53 
    54   }
    55 
    56   console.log(a4())
      var a5 = function fnExpress(){ return '我是函数表达式'}
      console.log(a5())   // '我是函数表达式'
      console.log(fnExpress())  // ReferenceError: fnExpress is not defined
    View Code

    七、类型转换及取值小技巧

    1、去除掉数字后面的单位

    1 var a = '1000元' ;
    2 parseInt(a)   // 1000  number 

    2、number 去除小数点使用 Math.ceil 、Math.floor 、Math.round ,不要使用 parseInt

    1 var a = 1000.456;
    2 console.log(Math.round(a))     // 1000

    3、判断是否为undefined 

    1)函数是否传参及赋予默认值使用广泛

    正确写法:

    1 function addCount(a,b) {
    2   if(typeof a === 'undefined') a = 5;
    3   if(typeof b === 'undefined') b = 10;
    4   return a + b
    5 }
    6 
    7 addCount()    // 15

    错误写法:

    1 function addCount(a,b) {
    2   a = a || 5 ;
    3   b = b || 10 ;
    4   return a + b
    5 }
    6 
    7 addCount(0,0)    // 15        计算错误

    八、字符串模版处理

      因在本次项目中采用的是原始的手动拼接字符串,过程繁琐而且容易出错。

      常用模版引擎:

    • artTemplate: 体积较小,在所有环境下性能高,语法灵活。
    • dot.js: 体积小,在现代浏览器下性能高,语法灵活。
    • etpl: 体积较小,在所有环境下性能高,模板复用性高,语法灵活。
    • handlebars: 体积大,在所有环境下性能高,扩展性高。
    • hogon: 体积小,在现代浏览器下性能高。
    • nunjucks: 体积较大,性能一般,模板复用性高

    九、for...in... 遍历属性技巧

      for...in... 会遍历整个原型链,使用时先用 Object.hasOwnProperty() 来过滤掉父类的属性

    1 Object.prototype.bar = 1;
    2 
    3 var foo = {moo: 2};
    4 for(var i in foo) {
    5  if (foo.hasOwnProperty(i)) {
    6    console.log(i);      // moo
    7  } 
    8 }

     十、highcharts 实用技巧

      1、为轴标签添加文字过长显示'...',鼠标移上显示全名效果

     1 xAxis: {
     2             categories: ['highcharts.com.cn/', 'America', 'Asia', 'Europe', 'Oceania'],
     3             title: {
     4                 text: null
     5             },
     6             labels: {
     7                 useHTML: true,
     8                 formatter: function() {
     9                     if(this.value.length> 10) {
    10                         return '<span title="'+ this.value+'">' + this.value.substring(0, 10) + '...</span>';
    11                     }
    12                     return this.value;
    13                 },
    14                 overflow: 'justify'
    15             }
    16         },

      参考:https://code.hcharts.cn/demos/hhhhDy/3

      2、柱形图设定项目条数过多可以滑动、项目条数少于设定值时隐藏效果

      判断项目条数,控制dom显示。当条数不够设定值时,自动将数据名字设定为空字符,值设为null,以避免出现数字

     1 var arr = [
     2             '',
     3             ' ',
     4             '  ',
     5             '   ',
     6             '    ',
     7             '     ',
     8             '      ',
     9             '       ',
    10             '        ',
    11           ];
    12           var len = 10 - dealData.length;
    13           for (var i = 0; i < len; i++) {
    14             dealData.push([arr[i], null])
    15           }
    View Code

      3、设定饼图中绘制的图形所占总容器的比例,以避免图项名字过长时将图压缩至很小

      plotOptions -->> pie -->> size -->> 80%

      4、更改数据标签的显示内容

      通过格式化函数 format 或者 formatter 进行处理;

    dataLabels: {
                  enabled: true,
                  formatter: function () {
                    console.log(this)
                    // 当为车位时需要显示多少个车位
                    if (this.key == '停车场') {
                      return '<span>' + this.key + ':</span>' + hl.dataDeal.formatNum(this.y) + 'm²(' + ytParkingNum + '个)'
                    }
                    return '<span>' + this.key + ':</span>' + hl.dataDeal.formatNum(this.y) + 'm²'
                  }
                }
    

      十一、高度不固定的垂直居中布局

      1、采用table布局(表格中的等高布局)

       1)  给父元素设置display:table ; 要垂直居中的子元素设置display:table-cell ; vertical-align:middle ;

         2) 设置了display:table-cell 的元素不要与浮动和定位混用;其元素对高度及宽度敏感,设定margin值无效,能响应padding值

         3) 该属性只支持IE8+ 以上浏览器

       参考:table-cell 详述

        

     

      

     

     

      

       

    对内贵有志气,对外贵得人心
  • 相关阅读:
    数据库范式
    数据存储——SQLite数据库存储——SQL语句
    学生表(Student)、课程表(Course)、成绩表(Score)以及教师信息表(Teacher)
    数据存储——SQLite数据库存储——SQLite数据库
    数据存储——手机外部文件存储
    数据存储——手机内部文件存储2
    数据存储——手机内部文件存储
    制作一个登录界面,以SP方式存储用户名。用户下次登录时自动显示上次填写的用户名
    数据存储——SP存储 SP读取
    View(视图)——消息
  • 原文地址:https://www.cnblogs.com/worldly1013/p/7403463.html
Copyright © 2011-2022 走看看