【前端】三个bug

目录

一、Array对象的indexOf()

二、使用jquery,clone()下拉框问题

三、jquery获取获取html5的data-*属性

 

一、Array对象的indexOf()      

      1、indexOf()定义:

indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。

      2、bug描述            

var arr = ["1","2"];
console.log(arr.indexOf(1)); // -1 为何是-1?

      3、解释

           indexOf()  会做强类型校验。

 

二、clone下拉框问题

       1、clone()定义

clone() 方法生成被选元素的副本,包含子节点、文本和属性。

       2、bug描述

             如下图片:

             先将select值选为2。点击clone后,新增的select选中项为1; 

             如何才能保证clone的select元素,选中的项也一样?

        

...
<div>
  <select>
    <option>1</option>
    <option>2</option>
  </select>
</div>
<br/><button>clone</button>


<script>
$('button').click(function(){ var select1 = $('select').clone(); $('div').append(select1); }); </script>

       3、解决方法: 

 //对下拉框增加change事件。每次改变下拉框,手动增加selected属性;
$('select').change(function(){
$(this).find('option[selected]').removeAttr('selected');
$(this).find('option:selected').attr('selected','selected');
});

 

三、jquery获取获取html5的data-*属性

       1、html的data-*属性 

 

定义和用法

 

data-* 属性用于存储页面或应用程序的私有自定义数据。

 

data-* 属性赋予我们在所有 HTML 元素上嵌入自定义 data 属性的能力。

 

存储的(自定义)数据能够被页面的 JavaScript 中利用,以创建更好的用户体验(不进行 Ajax 调用或服务器端数据库查询)。

 

data-* 属性包括两部分:

 

  • 属性名不应该包含任何大写字母,并且在前缀 "data-" 之后必须有至少一个字符
  • 属性值可以是任意字符串

 

注释:用户代理会完全忽略前缀为 "data-" 的自定义属性。            

        2、jquery的data()方法

data() 方法向被选元素附加数据,或者从被选元素获取数据。

        3、bug描述       

<select data-test="1">
   <option>1</option>
   <option>2</option>
</select>
<button>change</button>


<script>
//点击button后,会对select的data-test属性赋值为2; 然后进行读取 $('button').click(function(){ $('select').data('test','2'); console.log($('select').data('test')); // 2 console.log($('select').attr('data-test')); // 1 为何两个结果不一致呢?
}); </script>

      

      4、解释

         之前我一直理解的是: 如果一个元素的属性为data-test  ,那么$().data('test')  和 $().attr('data-test')是一个等价的存在。

         正确的解释如下:

         data()的值进行修改并不会影响到DOM元素上的data-*属性的改变。

        data()的本质其实是将一个 “cache” 附加到了对象上,并使用了一个特殊的属性名称。

参考链接:

js,jQuery获取html5的data-*属性

jQuery.data() 的实现方式

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/lanleiming/p/7504206.html

<think>好的,用户想了解如何在前端开发中定位和修复常见bug。首先,我需要回忆一下相关的知识,并结合提供的引用内容来组织回答。 根据引用[5],定位前端bug的方法包括使用浏览器控制台查看JS错误,检查网络请求,以及利用调试工具。这点很重要,应该作为第一步。然后引用[2]提到样式问题和元素重叠,可能需要检查CSS盒模型或使用Flexbox布局。兼容性问题在引用[3]中提到,可能需要处理不同浏览器或设备的适配。 接下来,修复常见bug的方法部分。引用[5]提到JS错误通常可以在控制台中找到,比如变量未定义,这个需要检查作用域和拼写。样式问题方面,引用[2]中的元素重叠可能需要调整布局方式。兼容性问题可能需要添加浏览器前缀或使用Polyfill,如引用[4]中的回退版本也是一种临时解决方案。 另外,调试技巧部分,断点调试和代码审查都是有效的方法,引用[1]强调耐心和经验积累的重要性。最后,预防措施方面,单元测试和代码规范可以引用[3]中提到的开发质量。 需要确保回答结构清晰,分步骤说明,并自然融入引用内容。同时,按照用户要求生成相关问题,可能涉及工具使用、性能优化等。</think>### 如何在前端开发中定位和修复常见 Bug #### **一、定位 Bug 的方法** 1. **浏览器开发者工具** 使用 `F12` 打开浏览器控制台(Console),查看 JS 报错信息。例如,未定义的变量或语法错误会直接显示在控制台中,并标注具体文件和行号[^5]。 - **Sources 面板**:可设置断点调试 JS 代码,逐步执行观察变量值变化。 - **Network 面板**:检查请求是否成功、响应状态码及数据格式,常用于解决接口调用问题。 2. **样式问题定位** - **Elements 面板**:查看 DOM 结构及 CSS 样式规则,实时修改样式验证效果。例如,元素重叠问题可能由 `position` 或 `float` 属性错误导致[^2]。 - **Flexbox/Grid 调试**:使用浏览器可视化工具检查布局是否符合预期。 3. **设备兼容性测试** - 使用浏览器模拟器(如 Chrome 的 Device Mode)测试不同屏幕尺寸下的表现。 - 针对特定浏览器(如 Safari 或旧版 IE)使用 Polyfill 或条件注释处理兼容性[^3]。 --- #### **二、修复常见 Bug 的技巧** 1. **JS 错误修复** - **变量未定义**:检查变量作用域或引入顺序,使用 `let/const` 替代 `var` 避免污染全局作用域。 - **异步问题**:确保异步操作(如 `fetch`)使用 `async/await` 或 `.then()` 正确处理返回值。 2. **CSS 样式调整** - **盒子模型问题**:通过 `box-sizing: border-box` 统一元素尺寸计算。 - **浮动清除**:在父容器添加 `overflow: auto` 或使用伪元素清除浮动。 3. **兼容性处理** - **浏览器前缀**:对 CSS 新特性(如 `transform`)添加 `-webkit-`、`-moz-` 等前缀。 - **回退策略**:例如使用 `@supports` 检测特性支持,或通过 CDN 加载 Polyfill 库(如 `core-js`)[^4]。 --- #### **三、调试工具与技巧** 1. **断点调试** 在关键逻辑处设置断点,结合 `console.log` 输出中间值。例如: ```javascript function calculateTotal(price, tax) { console.log('输入参数:', { price, tax }); // 调试输出 return price * (1 + tax); } ``` 2. **最小化复现** 将问题代码剥离到独立环境(如 CodePen)中测试,排除其他代码干扰。 3. **代码审查与版本回退** 若 Bug 出现在新功能中,可通过 Git 对比改动或回退到稳定版本临时解决。 --- #### **四、预防 Bug 的实践** 1. **单元测试** 使用 Jest 或 Cypress 编写测试用例,覆盖核心功能逻辑。 2. **代码规范** 通过 ESLint 和 Stylelint 强制统一代码风格,减少低级错误。 3. **监控与日志** 前端错误监控工具(如 Sentry)可实时捕获生产环境中的异常[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值