JavaScript遇到的坑

2023-10-30

一、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);
}

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaScript遇到的坑 的相关文章

随机推荐

  • 稳压二极管

    稳压二极管的内部结构 稳压二极管的基本结构和普通的二极管基本一致 都是由一个PN结组成 结构图如下 不过由于制造工艺的不同 在反向击穿状态下 PN结不会损坏 因为工作在反向截止状态下 反向特性为典型的PN结雪崩击穿 正向特性于普通二极管相同
  • Excel下载(easyExcel)

    目录 一 框架及版本 二 数据准备 三 基础下载 四 单元格样式设置 五 单元格行合并 1 合并统计 2 合并策略类 3 注册合并策略 六 行高设置 1 非动态设置行高 2 动态设置行高 一 框架及版本 springboot 2 1 3 R
  • 【深入理解C++】调用父类的构造函数

    文章目录 1 子类的构造函数默认会调用父类的无参构造函数 2 调用父类的构造函数 1 子类的构造函数默认会调用父类的无参构造函数 include
  • 阿里java代码规范_阿里java代码规范

    命名规范 类命 驼峰式 MarcoPolo 方法名 localValue 常量 大写单词 单词间 分割 语义清楚 MAX STOCK COUNT 抽象类 以Abstract Base开始 异常类用 Exception结束 测试用Test结尾
  • 断断续续弄了两天 终于可以清理完磨人的MySQL Connector Net 6.7.4了

    我是win7 64位 我的情况是 用360软件管家卸载的时候会回滚 开始 gt regedit gt 点一下计算机 左侧列表第一个 gt Ctrl F gt 先搜索MySQL Connector Net 6 7 4 删掉一个后继续Ctrl
  • 优秀程序员必须知道的32个算法,提高你的开发效率

    size large color darkred 导读 奥地利符号计算研究所 Research Institute for Symbolic Computation 简称RISC 的Christoph Koutschan博士在自己的页面上发
  • 程序员须知:面试中最容易被问到的18个算法题(附答案!)

    原创 IT168企业级 2017 09 20 17 21 算法是比较复杂又基础的学科 每个学编程的人都会学习大量的算法 而根据统计 以下这18个问题是面试中最容易遇到的 本文给出了一些基本答案 供算法方向工程师或对此感兴趣的程序员参考 1
  • 推荐一个共享充电宝小程序

    真正的大师 永远都怀着一颗学徒的心 一 项目简介 今天推荐一个共享充电宝小程序 二 实现功能 该项目使用uniapp开发的 可打包成小程序 app app并没有适配 还需要自己改改东西 三 技术选型 uniapp 四 界面展示 五 源码地址
  • Java排序算法:冒泡算法

    Java排序算法 冒泡算法 冒泡算法 Java冒泡排序 Bubble Sort 是一种简单的排序算法 其基本思想是比较相邻的两个元素 如果顺序错误则交换位置 每次将未排序部分的最大 小 值 冒泡 到已排序部分的末尾 直到全部排序完成 下面是
  • numpy学习笔记:np.zeros应用——生成三通道全黑Mask(蒙版)

    numpy学习笔记 np zeros应用 生成三通道全黑Mask 蒙板 np zeros官方文档 np zeros官方文档 下面是一段生成256 256三通道全黑mask的demo import numpy as np import cv2
  • 使用nginx-quic支持HTTP/3

    本文主要介绍使用nginx quic和boringssl项目来对服务器进行升级支持HTTP 3协议 1 背景介绍 nginx官方从1 19版本开始 新建立了一个分支 专门用来对QUIC进行支持 官网的链接点这里 注意该项目还处于早期的alp
  • 使用深度学习TensorFlow框架进行图片识别

    Apsara Clouder大数据专项技能认证 使用深度学习TensorFlow框架进行图片识别 本认证系统的介绍了深度学习的一些基础知识 以及Tensorflow的工作原理 通过阿里云机器学习PAI基于经典的CIFAR 10数据集实现图片
  • 前端Vue 项目性能优化

    前言 Vue 框架通过数据双向绑定和虚拟 DOM 技术 帮我们处理了前端开发中最脏最累的 DOM 操作部分 我们不再需要去考虑如何操作 DOM 以及如何最高效地操作 DOM 但 Vue 项目中仍然存在项目首屏优化 Webpack 编译配置优
  • smbus电池信息读取

    smbus协议的智能电池 我们可以使用i2c的读写方式获取ic信息 也可以使用smbus协议的接口获取 编译方法 arm none linux gnueabi gcc batterygetdemo c o batterygetdemo 编译
  • 一元三次方程求解 蓝桥杯 764

    题目描述 有形如 ax3 bx2 cx d 0 这样的一个一元三次方程 给出该方程中各项的系数 a b c d 均为实数 并约定该方程存在三个不同实根 根的范围在 100至 100 之间 且根与根之差的绝对值 1 要求由小到大依次在同一行输
  • OSI七层网络模型和TCP/IP五层模型

    文章目录 1 OSI的来源 2 OSI七层模型的划分 3 TCP IP五层模型 1 OSI的来源 OSI Open System Interconnect 即开放式系统互联 一般都叫OSI参考模型 是ISO 国际标准化组织 组织在1985年
  • 五大浏览器对应的内核

    写这个文章是为了让自己容易快速找到 简单粗暴 3 晴天雨天不如前端在身边 各浏览器对应的内核 谷歌 Webkit gt blink 现在是blink啦 FireFox Gecko safari webkit opera presto IE
  • 【海思SS626

    目录 一 下载 Ubuntu 18 04 6 LTS 二 VMware17创建虚拟机 三 安装Ubuntu18 04LTS 四 安装其他软件 五 总结 一 下载 Ubuntu 18 04 6 LTS 问题 为什么要下载 Ubuntu18 0
  • 封装cookie、sessionStorage、localStorage公共函数(vue)

    封装cookie sessionStorage localStorage公共函数 vue 通常一个前端项目 我们最常用到的三个浏览器储存有三种 cookie sessionStorage localStorage 这三种各有各的优势 在项目
  • JavaScript遇到的坑

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