项目:手机网民监测网站的收获与总结

总结:这个项目算是我做过的最大的一次项目了,果然是项目一大考虑的东西就不一样了,而且因为公司来了CTO,也算是终于有规范了,体验了一次后端接口规范的重要性。

URL到底要怎么写,参数要怎么写,后端返回的数据格式怎样才好,都是以前所没有考虑过的问题。

而且CTO也给了一些指导都是很实用的,比如每个页面的JS要独立开来写啊,解耦性什么的,而且还有可阅读性什么的,参数什么不怕长就怕不明白。真正的项目有测试、有产品经理、有技术主管、有后端、还有我前端,也是第一次这么规范地做一次项目,我想这项目对于我来说,进步是很大的。


总结的经验

①把所有JS都写一个文件上,想把很复杂的东西都写成一个公用函数,花销是很大,有些东西确实是很难公用那就不要用同一个了

②年轻人年轻气盛是正常的,但不要没有礼貌,其实每一个比你资历老的人都会比你有经验,会懂你不会的东西,所以不要小看每一个人

③和别人有意见分歧的时候,先不要根据自己的观念急着反对,语言不要那么绝对,毕竟你还只是个新手

④很多时候别人根本就不用知道你是怎么写的,用没用工具,就是想看效果好不好而已,所以也不要固执地认为插件都是不好的。

当然,我个人认为前期还是应该自己写的,在难度并不是很大的时候,因为对自己的提升是很大的

⑤以后处理数据的时候,一定要考虑没有数据的情况下是怎样的

⑥你的职称有时候和你的技术能力并不挂钩,更多的是办事能力和沟通能力。(只不过有时候这头衔到底有没有用咯)

⑦真正能被别人学走的是窍门,学不走的是学识。所以别吝啬教别人,因为窍门别人迟早学会,但学识得到一定的高度才能学会

⑧注释真的很重要,不光是别人,对自己也很重要,因为大一点的项目如果过一段时间再来维护就知道了

⑨以后写函数时,最好不好只写一种情况的,最好通过参数来传递




遇到的问题

①对于form表单的elements属性,用for(name in elements),输出name,大部分浏览器都会返回0,1,2...,但不一定会返回表单字段上的name值


②各个浏览器对于小数的处理是不一样的

比如我设置一个div的宽高为100.1px

chrome:100.094px(一般是接近你的值这样子的) firefox:100px(四舍五入,100.8px时为101px)

IE8+:100.1px(是符合预期的)IE7-:100px(不过设置100.1还是100.8都是100px)

在这方面我吃过一次亏,当时上头交给我一个嵌入在邮件的页面,因为看这页面比较简单,就让设置把文字都扣掉发给我一张底图,但由于不同浏览器的元素默认高度是不一样,所以就调来调取发现了这个问题


③怎么实现0.5px的细线

这个问题和②是有关联的,也恰好是我遇到的一个面试题

如果是1px的话当然很好实现,用border(不同浏览器对于border-width为小数点处理不同,chrome为floor,chrome为ceil)、hr、br、div都可以实现高度为1px的细线

那如果是0.5px呢,IE下可以用zoom:0.5来实现缩小一倍,那主流浏览器就可以用transform:scale(.5)来缩小一倍

还有其他办法欢迎提出


④:focus伪元素并不是可以应用到所有元素,兼容到IE8+:指示当前拥有输入焦点的元素,也就是说可以接受键盘输入或者以某种方式激活的元素


⑤table设置了border-collapse属性的话,对table应用border-raduis无效


⑥为什么块级元素设置line-height等于块级元素高度会让子元素垂直居中呢?


⑦怎么向表插入一次性插入HTML?

如果是其他元素的话,我们很容易就用innerHTML来一次性插入HTML,但MS上的MSDN有说明“The innerHTML property is read-only on the col, colGroup, frameSet, html, head, style, table, tBody, tFoot, tHead, title, and tr objects.” 说明在IE下,这些 的innerHTML属性是只读的。 仔细看这说明,其实table中也就td可以使用了innerHTML来插入HTML了,因此我们也不借助其他JS库的话,也就只能这样写了

//更新表格数据
  var row, c, k;
  for(i=0; i<j; i++){
    row = otbody.insertRow();
    for(k=0; k<6; k++){
      c = row.insertCell();
      c.innerHTML = data[i][k];
    }
  }

一个一个的插入呗

修改:距离上次写的时候有段时间了,其实这个问题可以简化的,不是有documentFragment吗?


⑧onchange可以冒泡吗?不行 (当时口误,其实是可以的)

onkeydown可以冒泡


⑨怎么冻结对象

我倒是觉得不用冻结。做一下压缩混淆其实就可以了,一般人也不会去看的东西


⑩前端可以获取后端的session吗?

不能。前端的session和后端的session是不一样的,保存位置不同


11.要是图片返回的是JPEG的图片字节流,XHR怎么去解析?

不懂,不过其实可以不用XHR去处理,<img>的src属性可以处理的,都不用XHR


12.背景颜色的透明度background:rgba()是可以应用到border的。但如果border有颜色会覆盖背景色


13.当设置一个弹出窗口为position:fixed时,弹出窗口的子元素的高度大于屏幕高度怎么办?只要设置弹出窗口为overflow:auto就行了。别以为这里很简单,一旦卡住就难想出来这办法

<!DOCTYPE html>
<html lang="ch-zn">
    <head>
        <meta charset="utf-8">
        <title>测试test</title>
        <style>
            html, body {
                width: 100%;
                height: 100%;
                overflow-x: hidden;
                margin: 0;
                padding: 0;
            }
            #test {
                position: fixed;
                top: 0;
                left: 0;
                right: 0;
                bottom: 0;
                z-index: 3;
                background: no-repeat center center rgba(0,0,0,1);
                overflow: auto;
            }
            #test>div {
                /*position: absolute;
                left: 0;
                right: 0;*/
                background-color: rgb(221,221,221);
                height: 1000px;
            }
        </style>
    </head>
    <body>
    <p>hello, guys</p>
    <div id="test">
       <div>
        i'm a good boy
       </div>
    </div>
    </body>
</html>


14.并不是所有<img>元素都要设置宽高,虽然对于页面渲染的速度会有加快,但banner就不用设置宽高了


15.text-align:justify用在汉字没效果


16.IE9图像不显示

我本来想做的效果是transform:scale(0)->tansform:scale(1)的,但IE9上图片不显示

设置成transform:scale(.1)->tansform:scale(1)就可以了,好怪的IE


17.在IE9-中,XHR的readyStateChange的readystate不等于4时,访问status会报错。这和我们本来认为的访问不存在的属性为undefined的观念不一样


18.IE8下半透明图片img如果要实现淡入淡出效果使用fliter:alpha(opacity=100)会出现黑边(注意两个半透明会冲突)

详情看这篇文章 IE8下图片出现黑边

最终解决办法:不使用filter:alpha(opacity=0)就好了,反正也没有效果


19.IE8-下a标签若是只包含图片,把图片设置为float不为none,position不为static,那么a标签没有宽高的。

这个问题很常见,必须引起关注啊


20.var a = [1,2,]; a.length = ?你猜猜是多少。

一般情况下确实如我们所想为2,但IE8不是,别以为只是一个小细节,但这个小细节引起的问题造成大问题呢?我当时确实因为这引起了大问题,影响到了百度插件Echarts的使用,所以平时JS基础就必须要好才能不出错,但JS基础不好像我这样的呢?你就要学会调试了,必须的必须


21.生成随机颜色

color: function (value){ 
   return "#"+("00000"+((Math.random()*16777215+8777215.5)>>0).toString(16)).slice(-6); 
}

我也不知道原理,就这样吧


22.document.querySelectorAll和JQuery的find在有些时候是不一样的
就比如$(#myid).find("div div")和document.querySelector("#myid").querySelectorAll("div div")的意思是不一样的
find方法的意思是找到id为myid的子孙div的元素下的子孙元素div,
而querySelctorAll的意思是查询id为myid的子元素,同时满足整个页面下div div选择器条件的DOM元素


23.word-wrap:break-word和word-break:break-all在对待长字符串有什么区别?

区别是一个会在新行重新断行,另一个在旧行断行


24.font的简写属性说明

font的简写属性中,font-style、font-weight、font-variant这三个属性值可以按任何顺序来写。此外,如果其中某个属性的值为normal,则可以忽略。但是font-size和font-family不仅要以此先后顺序作为声明中的最后两个值,而且必须要有这两个值


25.img和设置为display:inline-block的元素下会多出一段空隙
图片底部的空隙实际上涉及行内元素的布局模型,图片的默认垂直对齐方式是基线,而基线的位置是和字体相关的。所以在某些时候,图片底部的空隙可能是2px,而可能是4px或者更多,不同的font-size应该也会影响到这个空隙的大小。
解决办法:①设置为块状
②设置vertical-align为top或bottom(建议使用)
③设置font-size为0

引用:点击打开链接


26.异步是什么意思?

看了一些资料,我就用自己的话说吧。JavaScript虽然是单线程,但浏览器不是单线程啊,假设JavaScript使用的是主线程,但我们使用Ajax()方法和后端交互时,浏览器会再开一个线程给HTTP请求使用,一直等待后端返回数据。拿到后端响应时,再通过事件队列去通知浏览器它取到数据了,然后浏览器再通知主线程去取。


27.dom.getBoundingClientRect()获得元素在视口中的位置top、bottom、left、right,兼容性很好,不过IE7-的默认坐标是(2,2),其他主流浏览器是(0,0)


28.异步加载JS时最好是把新创建的<script>标签添加到<head>标签里比添加到<body>更保险,尤其是在页面加载过程中执行代码时更是如此


29.关于touch事件

touchmove要用preventDefault(可以解决Andoird上的一个bug:只有触发一次touchstart,一次touchmove,touchend不触发,但会导致默认行为不发生,如scroll页面不滚动)
注意touchend的touches和targetTouches为空,只有changeTouches获取上一次的touchList
还有touchcancel事件:当系统停止跟踪触发时触发

判断是移动端还是PC断可以看是否支持touch事件,用if("ontouchstart" in window)来判断


30.怎么取消AJAX方法

在接收到响应之前还可以调用abort()方法来取消异步请求xhr.abort();

调用这个方法,XHR对象会停止触发事件,而且也不再允许访问任何与响应有关的对象属性。在终止请求之后,还应该对XHR对象进行解引用操作。由于内存原因,不建议重用XHR对象


31.HTTP状态码301:永久移动,请求的网页已永久移动到新位置。服务器返回此响应(对GET或head请求的响应)时,会自动将请求者转到新位置。您应使用此代码告诉GoogleBot某个网页已永久移动到新位置


32.伪元素在非闭合元素上无效,比如img


33.闭包结束后释放掉不再引用的变量
比如闭包返回了一个函数,该变量保留了对于这个闭包中所有变量的引用,虽然只用了一个变量,因此没用到的变量也会一直驻留在内存空间中,尤其是对于dom元素的引用对内存的消耗会很大,因此在闭包返回前我们可以将没用到的其他变量释放,设置为null


34.使元素不能点击可以用CSS属性解决.disabled {pointer-events: none},JS也不能触发


35.怎么使用HTTP的head方法,就拿下面的获取服务器时间来说吧

//获取服务器时间
function getSevertime(){
var xmlHttp = new XMLHttpRequest();
if( !xmlHttp ){
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlHttp.open("HEAD",location.href,false);
xmlHttp.send();
var severtime=new Date(xmlHttp.getResponseHeader("Date"));
return severtime;
}
head返回的响应式没有请求主体的








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值