JavaScript遇到的坑

本文介绍了JavaScript操作DOM元素的常见问题及解决办法,包括getElementById返回null的原因与解决、循环中的局部变量作用域问题及利用闭包解决方法,还有Canvas绘图时的常见问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、document.getElementById返回为null
今天准备学习下canvas画图,于是呢写了如下代码:
canvas.html

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <script type="text/javascript" src="../js/canvas.js" ></script>
        <title id="test-canvas">Canvas</title>
    </head>
    <body>
        <canvas id="test-canvas" width="400px" height="600px"></canvas>
    </body>
</html>

canvas.js

var cvs = document.getElementById("testcanvas");
if (cvs.getContext) {
   alert('你的浏览器支持Canvas!');
} else {
   alert('你的浏览器不支持Canvas!');
}
var canvas = cvs.getContext("2d");
canvas.fillStyle ="#dd22dd";
canvas.fillRect(30,30,300,300);

刷新界面报如下错误,说明 cvs是null的。我在想啊,Id我是拷贝过来的,不可能是id值的问题。
这里写图片描述
原来是因为,我们习惯于js文件放在head标签中加载的,而HTML文件是从上到下顺序执行的,所以当然就找不到相对应的元素了。
解决方法:1.在<\script>中添加defer=”true” 属性,延迟加载。
2. 把你的js片段或者加载文件放到<\body>标签结束之后

二、循环中的局部变量,每次使用该值时,都是循环结束时的最后的那个值。
下面举个列子:我要实现动态创建表格的功能,并在点击每个表格时,输出每个表格中的数字和颜色信息。
html代码:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <script type="text/javascript" src="js/tab.js" ></script>
        <title>动态表格</title>
    </head>
    <body>
        <h5 style="display:inline;">行数</h5> <input id="rows" style="color: black;width: 100px;height: 20px;"/>
        <h5 style="display:inline;">列数</h5> <input id="cels" style="color: black;width: 100px;height: 20px;"/>
        <input type="button" value="生成表格" onclick="createTable()" style="width: 60px; height: auto;"/>
        <br />
        <h4 id="info"></h4>
        <table id="tab" cellspacing="2" cellpadding="15"></table>
    </body>
</html>

js代码:

function createTable() {
    var rows = document.getElementById("rows");
    var cels = document.getElementById("cels");
    var table = document.getElementById("tab");
    var colors = ["red", "green", "royalblue", "yellow", "pink", "blue", "aqua", "brown"];
    while(table.childElementCount > 0) {
        table.removeChild(table.children[0]);
    }
    if(!checkNumber(rows.value)||!checkNumber(cels.value)||parseInt(rows.value) <= 0 || parseInt(rows.value) > 100 || parseInt(cels.value) <= 0 ||parseInt(cels.value) > 100) {
        alert("请输入1到100之间的数字,谢谢合作!");
        return
    }
    for(var i = 0; i < rows.value; i++) {
        var tr = document.createElement("tr");
        tr.setAttribute("valign", "center");
        for(var j = 0; j < cels.value; j++) {
            var td = document.createElement("td");
            var ran = Math.floor(Math.random() * colors.length);
            td.setAttribute("bgcolor", `${colors[ran]}`);
            td.setAttribute("align", "center");
            td.innerText = (Math.random() * 100 + 1).toFixed(0);
            var num =  td.innerText;
            var color =  td.getAttribute("bgcolor");
                td.onclick = function(){
                var textInfo = document.getElementById("info");
                textInfo.innerHTML = `您选择的区域的数字是: ${num},颜色为 ${color}.`
            }
            tr.appendChild(td);
        }
        table.appendChild(tr);
    }
}
//验证字符串是否是整数
function checkNumber(theObj) {
  var reg = /^[0-9]+$/;
  if (reg.test(theObj)) {
    return true;
  }
  return false;
}

运行结果如下:
这里写图片描述
不管我点击表格中的哪一个,都是显示的最后一个方格,数字都是67,颜色为pink.
原来js中没有块作用域。那如何解决这个坑呢?
这就用到函数的闭包了:

function createTable() {
    var rows = document.getElementById("rows");
    var cels = document.getElementById("cels");
    var table = document.getElementById("tab");
    var colors = ["red", "green", "royalblue", "yellow", "pink", "blue", "aqua", "brown"];
    while(table.childElementCount > 0) {
        table.removeChild(table.children[0]);
    }
    if(!checkNumber(rows.value)||!checkNumber(cels.value)||parseInt(rows.value) <= 0 || parseInt(rows.value) > 100 || parseInt(cels.value) <= 0 ||parseInt(cels.value) > 100) {
        alert("请输入1到100之间的数字,谢谢合作!");
        return
    }
    for(var i = 0; i < rows.value; i++) {
        var tr = document.createElement("tr");
        tr.setAttribute("valign", "center");
        for(var j = 0; j < cels.value; j++) {
            var td = document.createElement("td");
            var ran = Math.floor(Math.random() * colors.length);
            td.setAttribute("bgcolor", `${colors[ran]}`);
            td.setAttribute("align", "center");
            td.innerText = (Math.random() * 100 + 1).toFixed(0);
            var num =  td.innerText;
            var color =  td.getAttribute("bgcolor");
            var fclick = function(num,color){
                td.onclick = function(){
                var textInfo = document.getElementById("info");
                textInfo.innerHTML = `您选择的区域的数字是: ${num},颜色为 ${color}.`
            }
            }
            fclick(num,color);
            tr.appendChild(td);
        }
        table.appendChild(tr);
    }
}
//验证字符串是否是整数
function checkNumber(theObj) {
  var reg = /^[0-9]+$/;
  if (reg.test(theObj)) {
    return true;
  }
  return false;
}

把值传入进函数中,就不会有问题了!
三、canvas.drawImage() 没效果。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>让你的图片变灰白</title>
    <script type="text/javascript" src="../js/canvas.js" defer="true"></script>
    </head>
    <body>
        <img src="..\img\sky.jpeg" width="665px"height="500px"/>
        <canvas id="image_gray" width="665px" height="500px" style="background: ghostwhite;"></canvas>
    </body>

</html>

究其原因就是图片还没加载出来就调用了此方法,拿不到数据,所以也就画不出来,可是编译器不报错。。。
解决方法是:

image.onload =function(){
    canvas.drawImage(image,0,0,665,500);
}

在图片加载完成后,再去画。

### UniApp 小程序开发常见问题及解决方法 #### 1. 编译报错:`Module not found` 当项目中引入某些模块时,可能会遇到 `Module not found` 的错误提示。这通常是由于路径配置不正确或依赖包未安装所致。 ```bash npm install --save 模块名称 ``` 确保所有依赖项都已正确安装,并检查 `import` 或 `require` 路径是否准确无误[^1]。 #### 2. 页面跳转失败 页面间导航出现问题可能是路由设置不当引起的。应确认 `pages.json` 文件中的页面路径与实际文件位置相匹配。对于动态参数传递,则需注意 URL 参数格式化处理: ```javascript // 正确的方式 this.$router.push({ path: '/path/to/page', query: { id: 'someId' } }); ``` 此外,在目标页面接收参数时要使用 `$route.query.id` 来获取传入的数据[^2]。 #### 3. 组件样式冲突 如果发现自定义组件内的 CSS 样式影响到了其他部分,可能是因为全局样式的优先级较高或是 scoped 属性缺失造成的。建议给每个独立组件加上 `<style scoped>` 标签以限定作用范围;也可以尝试调整 `.vue` 文件里的 style 部分加载顺序来解决问题[^3]。 #### 4. 数据请求超时 网络接口调用时常会面临连接不稳定的情况,这时应该考虑增加重试机制并合理设定超时时长。利用 uni.request API 提供的相关选项优化 HTTP 请求逻辑: ```javascript uni.request({ url: 'https://example.com/api/data', //仅为示例网址,请替换为真实地址 method: 'GET', timeout: 8000, // 设置合理的超时时间(ms) success(res) { console.log('success:', res); }, fail(err) { console.error('fail:', err); // 可在此处加入重新发起请求或其他异常处理措施 } }); ``` #### 5. 性能瓶颈 随着应用复杂度上升,性能损耗成为不可避免的话题。针对此现象可以从以下几个方面入手改善用户体验: - 减少不必要的 DOM 操作次数; - 对图片资源做懒加载处理; - 使用缓存技术减少重复计算量; - 合理规划业务流程降低服务器压力等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值