没错!我正在写bug呢!不管你是小白还是大牛,写bug无可避免,遇到bug怎么办?别慌!毛主席教导我们“战略上藐视BUG,战术上重视BUG”!
前端遇到的bug无非就三个方面结构层(HTML),表现层(CSS),行为层(JavaScript)。

一、结构层(HTML)

HTML出错的主要原因是对规范不够理解,没有按照规范来布局。网上搜到很多常见的HTNML错误都是如此:

错误1. 标签嵌套混乱

例1:比如常见的p标签里嵌套div标签

<p>我是一个段落<div>我是一个块级元素</div>我是一个段落</p>

浏览器解析后就变成这样了

例2:缺少结束标签,或结束标签时机不对。
有时候往往是一个标签没有闭合导致整个布局错乱。

/*错误代码*/
<div><a href="">1111<p>2222</p></div><p>3333</p>aaa</a> /*正确代码*/
<div><a href="">1111<p>2222</p></div><p>3333</p>aaa</a>

错误原因:DTD中规定了块级元素是不能放在P里;P标签内包含块元素时,它会先结束自己。另外提一下,内联元素不可以包含块元素。
解决思路:如上图,就是谷歌浏览器按F12(command+option)打开控制台看元素。

错误2.滥使用br标签

br标签作用在于换行的,而被用来增加行间距和内联元素之间的换行。

/*错误代码*/
<p>
我是一句话
<br />
<br />
我是一句话
<br />
<br />
我是一句话
</p>
<br />
<br />
<br />
<p>
<a href="">我是一个链接</a> <br />
<a href="">我是一个链接</a> <br />
<a href="">我是一个链接</a> <br />
</p> /*正确代码*/
<p>
我是一句话<br />
我是一句话<br />
我是一句话
</p>
<ul>
<li><a href="">我是一个链接</a></li>
<li><a href="">我是一个链接</a></li>
<li><a href="">我是一个链接</a></li>
</ul>

错误原因: br标签目的在于换行,作为增加间距不能准确的给出具体的间距大小,作为列表不能明确的表示这是一个列表。
解决思路:,通常是用line-height来调整行间距,用padding来解决段落之间的间距。这样也能很好的做到结构样式分离。

错误3.使用内联的样式

为了代码结构清晰,结构样式分离,我们不推荐使用内联样式。另外当有行为层的时候我们大多通过js来改变的是内联样式。在结构使用内联样式会带来很多麻烦。

/*错误代码*/
<img src="" border="0" alt="">
<div style="width: 200px; height: 40px;line-height: 40px;..."></div> /*正确代码*/
<img src="" alt="">
<div class="box"></div>//使用样式表定义样式。

不在此一一列举,若你遇到代表性问题欢迎留言!参考:10种常见的HTML标签错误写法

小结:结构层(HTML)问题的解决方案就是谷歌浏览器按F12(command+option)打开控制台看元素结构是不是你设想的一样。

二、表现层(CSS)

少数原因由于粗心大意少写了分号或者结尾的花括号}导致后面的样式都不起作用了。或者单词拼写错误引起的样式无效。在开发过程中建议使用代码提示,自动补全功能的编辑器(比如:WebStorm)。学习练习的时候使用手写的编辑器。
css错误大多来自对css权重的不理解。排除粗心因素通常遇到到设置的样式不起作用就是这类原因。

错误1:z-index不起作用,或者是负的margin值会影响z-index?

p{background-color: red; width: 200px; height: 100px ; position: relative; z-index: 1}
div{background-color: green;width: 200px; height: 100px; margin-top: -50px ;z-index: 999}
<p> 我是一个段落</p>
<div> 我是一个块 </div>

错误原因,定位影响层级,定位元素层级高。z-index无效。另外浮动元素也影响层级。
解决思路:查找CSS错误的完整步骤
小结:表现层(CSS)解决方案还是利用浏览器的元素审查功能,查看你的元素,给元素添加行内样式测试是否有效。如果你的css样式经常不起作用。请认真阅读下面两篇文章css权重Css常用的排序方式权重分配

错误2:在用background-image设置渐变背景的时候,在hover的时候设置background:none无效,还是有渐变背景。

解决方案:在hover的时候设置background-image:none才能清除渐变背景。

错误3:有的浏览器正常有的浏览器不正常

这里主要针对css3的兼容性,关于低版本的ie不做考虑。抵制垃圾浏览器从我做起!
例如

display:flex
display:-webkit-flex

错误原因:没有做兼容性处理;
解决方案:CSS3新特性,兼容性,兼容方法总结

三、行为层(JavaScript)

错误1:找不到对象

例如:

 <div id="div1">
<!--<div class="div3"></div>-->
</div>
<script type="text/javascript">
document.querySelector("#div1 > div").innerHTML = "first div";
alert("111111111111");
</script>

当我们运行这段代码的时候报出了一个错误

"Uncaught TypeError: Cannot set property 'innerHTML' of null"    /AJAX_TEST/selector_test.html (43)

这个时候我们只要根据错误提示找到出错的地方(43)行,这个时候我们会发现这段代码

document.querySelector("#div1 > div").innerHTML = "first div";

出错的原因就是document.querySelector("#div1 > div")该选择器找不到该元素节点,然后我们根据选择器找到节点

 <div id="div1">
<!--<div class="div3"></div>-->
</div>

发现该元素节点被注释掉了,我们将该注释取消就OK了
解决思路:在谷歌浏览器控制台查看有没有报错。有报错的,根据报错提示,直接找到报错的那行代码。
用注释法或者alert输出法查找原因。

错误2:方法/变量未定义

例如:通过类名获取元素在有的浏览器不支持
解决思路:用if判断如果浏览器支持的情况下怎么出来,不支持的情况下怎么处理,兼容性处理如下

   function getClass(n){
if(document.getElementsByClassName){
return document.getElementsByClassName(n);
}else{
var objArr=document.getElementsByTagName('*');
var arrClass=[];
for(var i=0;i<objArr.length;i++){
var nameArr = objArr[i].className.split(' ');
for(var j=0;j<nameArr.length;j++){
if(nameArr[j]==n){
arrClass.push(objArr[i]);
}
}
}
return arrClass;
}

小结:JavaScript错误处理方式
1.通过谷歌或火狐浏览器控制台查看错误提示,定位错误代码,打断点定位错误代码。
2.如果没错误提示的,在源代码中用alert输出,或者逐步注释功能代码块,定位错误代码片段。

前端Bug解决方案的更多相关文章

  1. IE8/9的几个前端bug解决方案

    最近做的东西需要兼容IE……啊真是令人忧伤…… 解决低版本IE的buggy inline-block 低版本的IE只对本身inline的元素能用inline-block,而本身为block的元素需要设 ...

  2. jqueryeasyUI dialog 弹出窗口超出浏览器,导致不能关闭的bug解决方案

    jqueryeasyUI dialog 弹出窗口超出浏览器,导致不能关闭的bug解决方案 2014年8月30日 3233次浏览 相信很多前端朋友都用过jqueryeasyUI,jqueryeasyUI ...

  3. 如何区分前端BUG和后台BUG?

    测试工程师不只是负责发现问题,除了发现问题这种基本功外,定位问题,提出解决方案,提出预防方案也是要掌握的技能.这里先说定位问题的要求,定位问题要向深入,前提当然是对功能.产品的流程.开发方案.开发人员 ...

  4. 构建一个基本的前端自动化开发环境 —— 基于 Gulp 的前端集成解决方案(四)

    通过前面几节的准备工作,对于 npm / node / gulp 应该已经有了基本的认识,本节主要介绍如何构建一个基本的前端自动化开发环境. 下面将逐步构建一个可以自动编译 sass 文件.压缩 ja ...

  5. 常用 Gulp 插件汇总 —— 基于 Gulp 的前端集成解决方案(三)

    前两篇文章讨论了 Gulp 的安装部署及基本概念,借助于 Gulp 强大的 插件生态 可以完成很多常见的和不常见的任务.本文主要汇总常用的 Gulp 插件及其基本使用,需要读者对 Gulp 有一个基本 ...

  6. 在windows下安装gulp —— 基于 Gulp 的前端集成解决方案(一)

    相关连接导航 在windows下安装gulp —— 基于 Gulp 的前端集成解决方案(一) 执行 $Gulp 时发生了什么 —— 基于 Gulp 的前端集成解决方案(二) 常用 Gulp 插件汇总 ...

  7. 执行 $Gulp 时发生了什么 —— 基于 Gulp 的前端集成解决方案(二)

    前言 文章 在windows下安装gulp —— 基于 Gulp 的前端集成解决方案(一) 中,已经完成对 gulp 的安装,由于是window环境,文中特意提到了可以通过安装 gitbash 来代替 ...

  8. Ext1.X的CheckboxSelectionModel默认全选之后不允许编辑的BUG解决方案

    Ext1.X的CheckboxSelectionModel默认全选之后不允许编辑的BUG解决方案,ext 的CheckboxSelectionModel在后台默认选中之后,前台就不允许编辑的bug是存 ...

  9. FIS前端集成解决方案

    FIS前端集成解决方案-文档结构 什么是FIS 部署FIS FIS基本使用 模块定义 加载方式 调用Tangram 2.0 FIS开发实例 --附件下载-- 什么是FIS FIS提供了一套贯穿开发流程 ...

随机推荐

  1. sql表变量,临时表

    @test是表变量,存在于内存中:#是临时表,存在于tempdb数据库空间.

  2. 吴裕雄--天生自然python机器学习:使用K-近邻算法改进约会网站的配对效果

    在约会网站使用K-近邻算法 准备数据:从文本文件中解析数据 海伦收集约会数据巳经有了一段时间,她把这些数据存放在文本文件(1如1^及抓 比加 中,每 个样本数据占据一行,总共有1000行.海伦的样本主 ...

  3. redis中间件

    redis的集群:集群策略:主从复制(从库从主库同步获取数据,本身不提供服务)哨兵(监控主库和从库,当主库挂的时候自动把从库选一个切换为主库,主库存放的是全量数据)集群参考:https://blog. ...

  4. MySQL表查询

    单表查询 表准备 create table emp( id int not null unique auto_increment, name ) not null, sex enum('male',' ...

  5. AngularJs 中ngModel绑定HTML5 date数据同步问题

    以下代码例子中,直接将date类型的input标签与ng-model对应的变量绑定,会出现内存数据和页面数据不一致的问题.虽然AngularJS是双向数据绑定,但是如果用下面的方法,在页面更新date ...

  6. python语法基础-函数-迭代器和生成器-长期维护

    ###############    迭代器    ############## """ 迭代器 这是一个新的知识点 我们学习过的可以迭代的对象有哪些? list str ...

  7. django框架进阶-auth认证系统-长期维护

    ##################    django的认证系统     ####################### 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要 ...

  8. python学习笔记(10)函数(二)

    (函数的参数&递归函数) 一.函数的参数 Python的函数定义非常简单,但灵活度却非常大.除了正常定义的必选参数外,还可以使用默认参数.可变参数和关键字参数,使得函数定义出来的接口,不但能处 ...

  9. Serializable 接口(序列化)

    目录 Serializable 接口(序列化) 前言 用途 如何实现 异常 serialVersionUID transient关键字 Serializable 接口(序列化) 前言 查看API文档时 ...

  10. 自定义servlet重写doGet或doPost方法是如何实现多态的

    我们知道,如果我们自定义一个servlet继承HttpServlet,并且重写HttpServlet中的doGet或doPost方法,那么从浏览器发送过来的request请求将调用HttpServle ...