JS中一些经常遇到的错误

article/2025/8/29 14:28:44

无法给动态创建的元素绑定事件,通过事件委托解决

瀑布流效果

<style type="text/css"></style>
    <script>
        let df = document.createDocumentFragment()
            for (let i = 1; i < 43; i++) {
                let oDiv = document.createElement("div")
                oDiv.classList.add("item")
                oDiv.innerHTML = `<img src='./images/img (${i}).jpg'/>`
                df.appendChild(oDiv)
            }
            document.body.appendChild(df)
    </script>
</head>

Uncaught TypeError: Cannot read properties of null (reading 'appendChild')

原因:

script在头部,html文件还未解析到body.所以目前无法获取到document.body(null),所以没办法在空属性上添加元素

造成下图效果的原因

let df = document.createDocumentFragment()
            for (let i = 1; i < 43; i++) {
                let oDiv = document.createElement("div")
                oDiv.classList.add("item")
                oDiv.innerHTML = `<img src='./images/img (${i}).jpg'/>`
                df.appendChild(oDiv)
            }
            document.body.appendChild(df)

            let oItems = document.querySelectorAll(".item")
            let oArr = []
            oItems.forEach((item,index)=>{
                console.log(item.offsetHeight);
            })
            oItems.forEach((item, index) => {
                if (index < 3) {
                    oArr[index] = item.offsetHeight
                } else {
                    item.style.position = 'absolute'
                    let minIndex = getMinIndex(oArr)
                    item.style.left = minIndex * item.offsetWidth + 'px'
                    item.style.top = oArr[minIndex] + 'px'
                    oArr[minIndex] = oArr[minIndex] + item.offsetHeight
                }
            })

console.log(item.offsetHeight); -->31

为什么会是31?

div已经创建好了,但是里面的img还没有加载出来,所以这是div的自带样式高度,以及未加载完成的图片的高度,所以都是31px,所以导致这种局面

解决方案:

DOMContentLoaded 页面结构加载完成就触发

window.onload 页面结构加载完成,外部的src也要加载完成-

window.addEventListener("DOMContentLoaded", () => {
            let df = document.createDocumentFragment()
            for (let i = 1; i < 43; i++) {
                let oDiv = document.createElement("div")
                oDiv.classList.add("item")
                oDiv.innerHTML = `<img src='./images/img (${i}).jpg'/>`
                df.appendChild(oDiv)
            }
            document.body.appendChild(df)
        })
        
        window.onload = () => {
            let oItems = document.querySelectorAll(".item")
            let oArr = []
            oItems.forEach((item,index)=>{
                console.log(item.offsetHeight);
            })
            oItems.forEach((item, index) => {
                if (index < 3) {
                    oArr[index] = item.offsetHeight
                } else {
                    item.style.position = 'absolute'
                    let minIndex = getMinIndex(oArr)
                    item.style.left = minIndex * item.offsetWidth + 'px'
                    item.style.top = oArr[minIndex] + 'px'
                    oArr[minIndex] = oArr[minIndex] + item.offsetHeight
                }
            })
        }

        function getMinIndex(arr) {
            return arr.findIndex(item =>  item == Math.min(...arr))
        }

Ajax的同步与异步

如果是Ajax的同步,在点击按钮的时候,移动的盒子会停顿,直到服务器把数据传给浏览器,盒子才继续移动

使用利用Ajax的异步来解决这个问题

<button id="btn">click</button>
        <div class="mes">xxxx</div>
        <script>
                function createXHR() {
                    if (window.XMLHttpRequest) {
                        return new XMLHttpRequest()
                    }
                    return ActiveXObject("Msxml2.XMLTTP")
                }
                function ajax(url) {
                // function ajax(url,callback) {
                    //得到xhr核心对象
                    let xhr=createXHR()
                    //准备请求参数
                    xhr.open('get',url)//第三个参数不写,默认为true 异步
                    //发送请求
                    xhr.send(null)
                    xhr.onreadystatechange=function(){
                        if (xhr.readyState==4&&xhr.status==200) {
                            return xhr.response
                        }
                    }
                    //设置监听的事件,所有的事件都是小写
                }
                //调用Ajax
                document.querySelector('#btn').οnclick=function(){
                    let res=ajax('http://useker.cn/getusers')
                    console.log(res);
                }

                let oMes=document.querySelector(".mes")
                setInterval(()=>{
                    oMes.style.left=oMes.offsetLeft+10+'px'
                    if (oMes.offsetLeft>document.documentElement.clientWidth) {
                        oMes.style.left=0
                    }
                },100)
        </script>

为什么第28行console.log(res)打印的结果是undefined

首先在ajax方法中xhr.onreadystatechange=function(){}这个事件,只是将一个匿名函数function(){}赋给xhr的

onreadystatechange事件,内部代码在ajax这个方法中并不会执行,在第27行调用ajax方法,按理会把实参带入ajax方法中执行内部代码,但是onreadystatechange是一个事件,事件是异步的,只有当事件被触发的时候才会执行内部代码,我们不知道事件会在什么时候执行,所以ajax内部的同步代码顺序执行,跳过异步事件

xhr.onreadystatechange=function(){

if (xhr.readyState==4&&xhr.status==200) {

return xhr.response

}

}

到第24行结束ajax方法,执行第28行console.log(res);由于没有执行事件,在ajax方法中函数并没有return,所以打印的是undefined,而可能在打印之后在执行xhr的事件,获取到res的值

解决方法:

利用回调函数解决异步

回调函数会在事件执行完后返回数据

作用类似:A找B借钱,但是B此时没钱,过了一段事件B有钱了,再找B借钱就是另外一件事件了,如果A在B没钱的时候给B一张卡,让B有钱的时候就往卡里打钱,这样就还是一个事件,并且解决了时间的问题,所以回调函数就类似这里的银行卡

function ajax(url,callback) {
                    //得到xhr核心对象
                    let xhr=createXHR()
                    //准备请求参数
                    xhr.open('get',url)//第三个参数不写,默认为true 异步
                    //发送请求
                    xhr.send(null)
                    //设置监听的事件,所有的事件都是小写
                    xhr.onreadystatechange=function(){
                        //如如果状态发生变化,就在这里判断状态
                        if (xhr.readyState==4&&xhr.status==200) {
                            callback(xhr.response)
                        }
                    }
                }
                //调用Ajax
                document.querySelector('#btn').οnclick=function(){
                    ajax('http://useker.cn/getusers',function(res){
                        console.log(res);
                    })
                }

闭包

//5个button
let oBtns=document.querySelectorAll("button")
                for (var i = 0; i < oBtns.length; i++) {
                    oBtns[i].οnclick=function(
                      {
                        console.log(i)
                      }
                      }

打印的i永远是5,因为点击事件是异步的,所以永远等待同步代码for循环执行结束后再执行,此时的i为5,

可以使用let/const关键字代替var关键字,或者提前将i的值存储起来,或者使用高阶函数,或者闭包

let oBtns=document.querySelectorAll("button")
  for (let i = 0; i < oBtns.length; i++) {
    oBtns[i].οnclick=fn(i)
    }
  function fn(n) {
   return function (e) {
   for (let i = 0; i < oBtns.length; i++) {
  oBtns[i].style.backgroundColor=''
  }
 oBtns[n].style.backgroundColor='green'
 }
  }

在oBtns[i].οnclick=fn(i)中,fn(i)会立即执行,不受点击事件影响,放回第6行的函数,这个函数将在点击事件执行的时候触发执行,这个函数的事件e是点击事件,它的this指向事件触发对象OBox

节流

oBox.οnmοusemοve=throttle(function (e) {
            console.log('zhouhaha');
        },2500)
        function throttle(callback,delay=500) {
            let startTime=Date.now()
            return function (e) {
                let currentTime=Date.now()
                if (currentTime-startTime>=delay) {
                    startTime=currentTime
                    callback.bind(this)(e)
                }
            }
        }

防抖

oBox.οnmοusemοve=debounce(function(e){
                    console.log('zhouhaha');
                },2500)
                function debounce(callback,delay) {
                    let timer
                    return function(e){
                        let self=this
                        clearTimeout(timer)
                        timer=setTimeout(function () {
                            callback.bind(self)(e)
                        },delay)
                    }
                }

动态属性

checked selected disabled ed结尾的都是动态属性

动态属性不能用attribute(attr)操作,要使用property(prop)操作

attr 如果未设置或者删除就无法获取

$(function () {
//     $('button').eq(0).click(function () {
//         $(":input").attr('checked',true)
//     })
//     $('button').eq(1).click(function () {
//         console.log($('input:checkbox').attr('checked'));
//     })
//     $('button').eq(2).click(function () {
//         $('input:checkbox').removeAttr('checked')
//     })
// })
    $(function () {
      $('button').eq(0).click(function () {
         $(":input").prop('checked',true)
       })
      $('button').eq(1).click(function () {
          console.log($('input:checkbox').prop('checked'));
       })
       $('button').eq(2).click(function () {
            $('input:checkbox').removeProp('checked')
       })
   })


http://chatgpt.dhexx.cn/article/5FAgO45g.shtml

相关文章

[Vue]解决npm run dev报错internal/modules/cjs/loader.js:968 throw err;

问题 解决 有2中方法&#xff0c;建议先尝试第一种&#xff0c;不行再第二种 重新安装依赖环境 删除项目的node_modules文件夹&#xff0c;重新执行 # 安装依赖环境 npm install# 运行 npm run dev降低webpack的版本 查看package.json中webpack的相关版本 # 卸载当前版本…

vue出现caution:request is not finished yet导致页面卡死问题解决思路

1、问题描述 开发环境正常运行&#xff0c;部署上线后点击某一按钮请求接口时页面出现卡死。在Network>Timing发现异常提示&#xff1a; caution:request is not finished yet 2、问题分析 &#xff08;1&#xff09;通过Postman模拟请求接口&#xff0c;接口正常。 &am…

关于Vue项目中js报错callback() is not a function

关于Vue项目中js报错callback() is not a function 原函数&#xff1a; 解决后&#xff1a; 即在参数中加入了rule&#xff0c;虽然rule都没有使用&#xff0c;但确实是解决了callback() is not a function

Vue中报错:Error in v-on handler: “ReferenceError: state is not defined“

目录 背景 解决报错思路 反思 背景 在编写组件化时&#xff0c;Vue提示报错&#xff1a;Error in v-on handler: "ReferenceError: state is not defined" 解决报错思路 1.console控制台在index.js组件的第27行代码&#xff0c;还能输出语句&#xff1a;“mutati…

【解决】控制台报错Uncaught TypeError: Object(...) is not a function at eval (vue-router.esm-bundler.js

打开http://localhost:8080/&#xff0c;控制台报错 Uncaught TypeError: Object(...) is not a functionat eval (vue-router.esm-bundler.js?f2fc:2127:1)at Object../node_modules/vue-router/dist/vue-router.esm-bundler.js (app.js:2218:1)at __webpack_require__ (ap…

成功解决使用node时,启动js文件抛出错误 events.js:377 throw er; // Unhandled ‘error‘ event ^Error: listen EA

问题描述: 我在写服务端时&#xff1a; const http require(http); const url require(url)const app http.createServer(); app.on(request,(req,res)>{//获取请求方式const method req.method.toLocaleLowerCase(); //返回的时大写的GET/POST 最好转换为小写的/…

Vue前端报错[Vue warn]: data functions should return an object:https://vuejs.org/v2/guide/components.htm

在进行登陆页面输入账号密码后&#xff0c;点击登陆按钮&#xff0c;跳转时浏览器报了以下错误 解决方案1&#xff1a; 检查所指向文件的script部分代码的data是否有return{}&#xff0c;若没有return 则补上 vue的文件data中不写return{ }返回值的话&#xff0c;包裹的数据会…

解决vue创建新项目与版本查看,都报错“internal/modules/cjs/loader.js:1032 throw err;”

废话有点多&#xff0c;请忽略&#xff1a;今天创建vue新项目时&#xff0c;出现一个奇怪的报错“internal/modules/cjs/loader.js:1032 throw err;”&#xff0c;接下来的现象刷新了我的认知&#xff0c;不论是查看vue版本&#xff0c;还是重装vue&#xff0c;都会报错。在网上…

解决internal/modules/cjs/loader.js:905报错

D:\vue-admin-template-master>node testMock.js internal/modules/cjs/loader.js:905 throw err; ^ Error: Cannot find module ‘D:\vue-admin-template-master\testMock.js’ ?[90m at Function.Module._resolveFilename (internal/modules/cjs/loader.js:902:15)?[39…

频分多址、时分多址、码分多址、空分多址之间的区别

简单举例&#xff0c;我们把频率资源想象成一个房间&#xff0c;如果把房间分割成不同的空间&#xff0c;不同的用户在不同的房间聊天&#xff0c;这就是频分多址&#xff08;FDMA&#xff09;。 如果这个房间里&#xff0c;某一时间让某一个人说话&#xff0c;下一时间段&…

计算机网络与无线通信系统学习10:码分多址(CDMA)的本质-正交之美

引子&#xff1a; CDMA是个很重要的通信概念&#xff0c;很多的大学教科书上都会提到它&#xff0c;甚至我们今天可能都在使用它。然而提到cdma&#xff0c;很少有资料提到它的思想是多么的有创意&#xff0c;教科书上关于cdma的章节都过于复杂&#xff0c;过于数学化&#x…

码分多址CDMA及计算(简单易懂)

CDMA是一种共享信道的方法&#xff0c;每一个用户可以在同样的时间使用同样的频带进行通信。 简单地说&#xff0c;就是当多个用户用同一个信道进行通信时&#xff0c;如果不采用CDMA的方法&#xff0c;就只能一个一个用户进行通信&#xff0c;效率相对较低。而采用CDMA的方法&…

计算机复习6----码分多址CDMA计算

该部分知识位于书P57 看题 解法&#xff1a; 将 A\B\C\D每个的码片与收到的码片序列&#xff0c;逐个进行乘法 例&#xff1a; 1. 将A中第一位 -1与S中第一位 -1 相乘 得 1 2. 第二位 -1 * 1 -1 以此类推 3. 得 &#xff08;1&#xff0c;-1&#xff0c;3&#xff0c;1&#…

图解通信原理与案例分析-19:3G CDMA码分多址通信技术原理---码分多址、OVSF正交扩频码、伪随机码序列

前言导读&#xff1a; 码分多址(CDMA)是第三代移动通信的核心技术&#xff0c;其基本思想是在相同的载波频段上&#xff0c;通过的不同的地址码来区分的不同用户、不同基站的数据。 3G CDMA与2G GSM通信相比&#xff0c;主要网络架构与通信流程&#xff0c;大体相似&#xff…

CDMA码分多址原理

码分多路复用(CDM) 各用户使用经过特殊挑选的不同码型&#xff0c;彼此不会造成干扰。这种系统发送的信号有很强的抗干扰能力&#xff0c;其频谱类似于白噪声&#xff0c;不易被敌人发现。每一个比特时间划分为 m 个短的间隔&#xff0c;称为码片(chip)。 通常使用码分多址(C…

码分多址matlab代码,基于matlab的码分多址系统仿真

基于matlab的码分多址系统仿真 淮南师范学院电气信息工程学院 2010届电子信息工程专业课程设计报告 课程设计报告 题 目&#xff1a; 基于 Matlab 的 CDMA 多址技术的仿真 学生姓名&#xff1a; 学生学号&#xff1a; 1008030130 系 别&#xff1a; 电气信息工程学院 专 业&am…

码分多址的计算题

目录 前言简介关于计算题步骤例题 参考 前言 码分多址&#xff08;CDMA&#xff09;和码分复用多路&#xff08;CDM&#xff09;的区别&#xff1a; 码分复用 (CDM) 是一种网络技术&#xff0c;其中组合多个数据信号以在公共频带上同时传输当 CDM 用于允许多个用户共享单个通…

码分多址CDMA

码分复用&#xff0c;CDM&#xff0c;CDMA 最近复习《计算机网络》&#xff0c;遇见一些比较困难的地方&#xff0c;写了一些见解 CDMA&#xff08;Code Division Multiple Access&#xff09; 码分多址是指以不同的伪随机码来区别基站。各基站使用同一频率并在同一时间进行…

码分多址理解

码分多址( Code Division Multiple Access&#xff0c;CDMA)是通过编码区分不同用户信息&#xff0c;实现不同用户同频、同时传输的一种通信技术。 发送的3个码片必须正交&#xff0c;内积为0。一般将码片中的0写为-1&#xff0c;将1写为1 如 A的码片为&#xff08;0 1 0 1&am…