js初学者必记

**

js初学者必记!!

**

  1. 错误提示
Cannot read property 'title' of null   ===>   null.title    ==> null 不正常的数据类型
Cannot read property 'slice' of undefined  => undefined.slice => undefined 不正常的数据类型
Uncaught SyntaxError: Invalid left-hand side in assignment
错误的运算,检查运算是否有问题。
xxx is not a function
你以为你调用的是一个函数,其实他不是一个函数。
所以因为你调用的xxx不是一个函数,xxx()这样的写法就报错了。
3.can not read property 'type' of null
can not read property 'type' of undefined
不能读取null(undefined)的属性type
//报这种错误的情况只有一个,就是访问type属性的那个对象是null或者undefined
input.type
解决方案:
找到获取元素的代码,看看是不是有问题。
4.Uncaught SyntaxError: Unexpected token x in JSON at position 65
Uncaught SyntaxError: 未捕获的语法错误。
Unexpected token x in JSON at position 65 :出乎意料的操作符 x 在65行出现。
解决方案:
看一看你需要转换的JSON格式的字符串是不是多了一些奇怪的东西。因为这个错误就是转换出现了错误。
  1. 事件
//  onclick - 单击
    //  ondblclick - 双击
    // onmouseover  移入 (多次)
    // onmouseout   移出 (多次)
    // onmouseenter  移入(1次)
    // onmouseleave  移出(1次)
    // onmousedown  鼠标按下
    // onmousemove  鼠标移动
    // onmouseup    鼠标松开
    // onkeydown  按下键盘按键  (任意按键)
    // onkeypress 按下键盘按钮  (数字 + 字母)
    // onkeyup    松开按键
    // oninput 监听文本框的变化
    // onvisibilitychange 监听页面显示和隐藏 (切换页面)
    // onfocus  聚集焦点
    // onblur   失去焦点
    // onscroll 监听滚动
    // oninput 
    // onchange 
  1. 排他思想
// 1. 干掉所有人
// 2. 复活我自己
let btn = document.querySelectorAll('button');
        for (let i = 0; i < btn.length; i++) {
            btn[i].onclick = function () {
                for (let i = 0; i < btn.length; i++) {
                    btn[i].className = '';
                }
                this.className = 'bg';
            };
        }
```javascript

  1. 假设成立法
// 1. 假设都选中
var flag = true
// 2. 找打脸的 (如果有一个没有选中)
for(var j = 0; j < ipts.length; j++) {
    if(ipts[j].checked == false) {
        flag = false
        break
    }
}   
// 3. 最终判断
 if(flag == true) {
        // 真的都全选
 }else {
        // 没有全选
 }
  1. for循环
//1. for循环遍历 `数组`
for(var i = 0; i < arr.length; i++) {
}
//2. 遍历 `次数` => 遍历10次痛打大飞哥
for(var i = 1; i <= 10 ; i++) {
    console.log('痛打大飞哥')
}
  1. 获取当前元素的索引
for(var i = 0 ; i < btns.length; i++) {
    # 第一步 : 添加自定义属性 存 i
    btns[i].index = i      #+++++++
        btns[i].onclick = function(){
                
       # 获取刚才存的 i
       this.index         #+++++++++
        }
}
  1. 节点(元素)操作
7.1 节点查找
• 找孩子
- children  获取所有的子元素
- firstElementChild 第一个子元素
- lastElementChild  最后一个子元素
找兄弟
- previouseElementSibling  查找上一个兄弟元素
- nextElementSibling   查找下一个兄弟元素
找父亲
- parentNode  找父元素
7.2 添加节点
• appendChild
格式 : 父元素.appendChild(新的子元素)
作用 : 把新的子元素添加到所有子元素的最后面
• insertBefore
格式 : 父元素.insertBefore(新的子元素, 参考元素)
作用 : 把 新的子元素 插入到 参考元素的 前面
7.3 创建节点(元素)
- 格式 : document.createElement('标签名')
- 参数 : 标签名
- 返回值 : 返回一个新的元素
7.4 删除节点
格式 : 父元素.removeChild(子元素)
  1. 定时器
    8.1 延时器
    作用 : 延迟一段时间 执行某段特定的代码
    格式 : setTimeout(函数, time)
  • 参数1 : 函数 , 延时后要执行的函数
  • 参数2 : time , 延迟的时间 单位 毫秒 2000 => 2s
// 开启延时器
var timerId = setTimeout(function(){
                ....
              },2000)

// 清除延时器

clearTimeout(timerId)

8.2 定时器
作用 : 间隔一段时间, 重复执行某段特定的代码
格式 : setInterval(函数, time)

  • 参数1 : 函数 , 间隔时间后重复执行的函数
  • 参数2 : 时间, 间隔的时间 2000 => 2s
    // 开启定时器
var timerId = setInterval(function(){
              ....
            },2000)

// 清除定时器
clearInterval(timerId)
8.3 三个注意点
• 次数
延时器 : 只会执行1次
定时器 : 执行多次
• 顺序
console.log(111); # 执行
// 异步
setTimeout(function () { // 滚一边去
console.log(333); // 最后再执行你
}, 0)
console.log(222); // 执行
111
222
333
• this问题谁调用this所在的函数, this就指向谁
var obj = {
name : ‘zs’,
say : function(){
this //obj
window.setTimeout(function(){
this // window
},0)
}
• }
obj.say()
// 需求 : 在 延时器里打印 name:zs
//解决办法 :
var obj = {
name : ‘zs’,
say : function(){var that = this # ++++++

setTimeout(function(){
      
      // 里面以后都用that  => obj
 that.name          # ++++++++
 },0)

}
}
obj.say()

9. offsetWidth 和 offsetHeight
• 作用 : 获取元素自身的宽高
• 总结

ⅰ. 以后获取 使用 offsetWidth 和 offsetHeight , 获取的数字类型

ⅰ. 以后设置 使用 style.width 和 style.height , 设置的字符串类型
10. offsetLeft 和 offsetTop
• 作用 : 获取元素自身左侧/顶部到offsetParent左侧/顶部的距离
• 总结

ⅰ. 以后获取位置 使用 offsetLeft和 offsetTop , 获取的数字类型

ⅰ. 以后设置位置使用 style.left 和 style.top , 设置的字符串类型
如果设置 left 和 top 不行 ,一定要注意 查看是否设置了定位
11. 回调
// 回调

// 回调灰常重要, 如果不会回调, 就不算是个合格的前端程序员
// 什么时候需要用到回调 : 大多数都是在封装中, 调用这个封装的函数, 得到一个反馈
// 回调(非官方) : 把函数当成一个参数传递, 然后在适当的时机回头调用这个函数

// return 只能用在简单的同步
// callback 回调 很强大 , 同步 异步都可以使用 callback 只是一个形参 可以随便你写 a b cc
// 开始登录 这里如果想要得到反馈???
// 张三 : 登录

login('xmg', 1243, function (result) {
  alert(`登录的结果:, ${result}`);
})
// 登录的函数 (将来是要提到login.js里面去的)
function login(username, password, callback) {
  if (username === 'xmg' && password === 123) {
    callback && callback('登录成功') // 等价于 if  , && 逻辑短路 大多数都是用在了回调
  } else {
    callback && callback('登录失败')
  }
}

// 李四 : 登录

// login('xmg', 123, function (result) {
//   console.log('李四的回调结果', result);
// })
// 错误 :   Uncaught TypeError: callback is not a function
// 1. 错误  callback 不是一个函数
// 原因 : 李四 登录 的时候,没有传回调, callback 为undefined, undefined是不能添加() 调用的
// 2. at login.js : 8 
//  意思是 : 错误在 login.js 文件 里面的 第8行
// 3. 怎么解决 ? 
// calback && callback()  如果 callback有值 就执行, 如果没有值,就直接下一行了
// 功能类似于
// if(callback){
//  callbac()
//}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值