添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

常用的两种事件绑定:

DOM0的事件绑定
btn.onclick = function(){}
btn.onclick = function(){} 写多个后面的会把前面的覆盖掉
原因:JS中对象如果有同名属性,后面的肯定会覆盖前面

DOM2的事件绑定:
btn.addEventListener(“click”,funciton(){})
btn.addEventListener(“click”,funciton(){}) 可以写多个监听器
原理:不是基于属性绑定,是基于事件池机制,放到池子中先执行

回调函数:(顾名思义)回头再调用

如果在一个函数中,写了一个函数,里面的函数叫回调函数。
addEventListener()是函数调用,但是你在它里面又写了函数funciton(){}
里面的函数声明,我们叫回调函数
看下面的代码:
window.setTimeout(function(){},1000);
//这里setTimeout()是函数调用,所以里面的function(){}函数声明是回调函数。

一部分的回调函数是异步代码:
btn.addEventListener(“click”,funciton(){})
上面的代码中的funciton(){}叫回调函数,它是放到的事件池中

问:此函数立即执行了吗?
答:没有
事件池中的函数,只有在合适的时机,才会执行,此处的合适时机指的是事件发生后。

/* 如果没有设置参考点,参考点就body */ position: absolute; /* 由于 dialog 设置了position: absolute; 此时dialog就可以作为参考点 */ top: 50%; left: 50%; width: 400px; height: 260px; background: #fff; margin-top: -130px; margin-left: -200px; border-radius: 5px; .dialog h3 { background-color: skyblue; text-align: center; height: 35px; line-height: 35px; .dialog div { margin: 20px 0 0 20px; .dialog input { width: 250px; height: 30px; border-radius: 3px; border: 1px solid #ccc; .dialog .comBtn { display: block; width: 100px; height: 30px; margin: 15px auto 0; .dialog span { position: absolute; top: 5px; right: 8px; font-size: 20px; font-weight: bold; cursor: pointer; </style> </head> <!-- 电影列表 --> <div class="box"> <button class="addBtn" id="addBtn">添加电影</button> <table> <thead> <th>电影名称</th> <th>领衔主演</th> <th>操作</th> </thead> <tbody> <td>AAA</td> <td>AAA</td> <!-- href="javascript:;" 用来阻止默认事件的 --> <td><a href="javascript:;">删除</a></td> <td>AAA</td> <td>AAA</td> <!-- href="javascript:;" 用来阻止默认事件的 --> <td><a href="javascript:;">删除</a></td> <td>AAA</td> <td>AAA</td> <!-- href="javascript:;" 用来阻止默认事件的 --> <td><a href="javascript:;">删除</a></td> </tbody> </table> <!-- 遮罩层 --> <div class="cover" id="cover"></div> <!-- dialog 弹框 --> <div class="dialog" id="dialog"> <h3>添加电影</h3> <label for="moveName">电影名称:</label> <input type="text" id="moveName" placeholder="请输入电影名称"> <label for="star">电影主演:</label> <input type="text" id="star" placeholder="请输入电影主演"> <button class="comBtn" id="comBtn">完成</button> <span class="close" id="close">X</span> <!----------------------------部分代码的说明------------------------------> <!--<script> var btn = document.getElementById("addBtn"); // 在JS中异步靠回调函数实现 // 以后,你看到一个回调函数,包含这个回调函数的那一片代码就有可能是异步代码 // setTimeout(function(){},1000) // 下面的事件绑定是异步代码 JS中的异步代码就那几个 // 现在我们就学习一个叫事件绑定 btn.addEventListener("click", function() { // DOM2的事件绑定 // 下面的代码我们也叫异步代码,也就是说同步还是异步,指的并不是回调函数 // 指的是事件绑定 btn.onclick = function() { console.log("你看我会执行吗?") </script>--> <script> let btn = document.getElementById("addBtn"); let cover = document.getElementById("cover"); let dialog = document.getElementById("dialog"); let close = document.getElementById("close"); let moveName = document.getElementById("moveName"); let star = document.getElementById("star"); let comBtn = document.getElementById("comBtn"); let as = document.getElementsByTagName("a"); let tbody = document.getElementsByTagName("tbody")[0]; // 点击添加电影按钮,显示遮罩层和模态框 btn.addEventListener("click",function () { // DOM2的事件绑定 cover.style.display = "block"; dialog.style.display = "block"; // 点击x,隐藏遮罩层和模态框 close.addEventListener("click",function () { cover.style.display = "none"; dialog.style.display = "none"; // 实现删除(不能实现后来添加的tr的删除) for (let i = 0; i < as.length; i++) { // 我们自己给a标签添加了一个事件 已经去掉了默认事件 as[i].addEventListener("click",function () { // console.log(window.confirm("你确定要删除吗?")); if(window.confirm("你确定要删除吗?")){ tbody.removeChild(this.parentElement.parentElement) // 添加电影 comBtn.addEventListener("click",function () { let str1 = moveName.value.trim(); let str2 = star.value.trim(); // 验证你输入的电影名和主演是否合法 .... if(str1 && str2){ // 1)创建tr var tr = document.createElement("tr"); tbody.appendChild(tr); // 2)创建td var td1 = document.createElement("td"); td1.innerHTML = str1; tr.appendChild(td1) var td2 = document.createElement("td"); td2.innerHTML = str2; tr.appendChild(td2) var td3 = document.createElement("td"); // <a href="javascript:;">删除</a> var a = document.createElement("a"); a.innerHTML = "删除" a.href = "javascript:;" // 给a标签的onclick属性赋值 使用addEventListener a.onclick = function(){ if (window.confirm("你确定要删除吗?")){ tbody.removeChild(this.parentElement.parentElement) td3.appendChild(a) tr.appendChild(td3) // 3)隐藏遮罩层和模态框 cover.style.display = "none"; dialog.style.display = "none"; }else{ alert("电影名和主演不能为空~") </script> </body> </html> [removed][removed] 同步 模式,又称阻塞模式,会阻止浏览器的后续处理,停止后续的解析,只有当当前加载完成,才能进行下一步操作。所以默认 同步 执行 才是安全的。但这样如果js 有输出document内容、修改 dom 、重定向等行为,就会造成页面堵塞。所以一般建议把[removed]标签放在<body>结尾处,这样尽可能减少页面阻塞。 二:异步加载 异步加载又叫非阻塞加载,浏览器在下载 执行 j
在vue ,有一个vue的异步更新策略。 异步更新策略:在数据发生变化时,vue不会立刻更新 DOM ,而是开启一个队列,把组件更新函数保存在队列 ,在同一时间循环 发生的所有数据变更都保存在队列,一次性清空队列,一次性更新。 this.$nextTick(回调函数):这个就是处理vue DOM 的异步更新的,在数据发生改变时,渲染 DOM 之后,会自动 执行 回调函数。 举一个小小的例子: <template> <div class="ab...
同步 任务与异步任务异步任务: DOM 事件 ,setTimeout,setInterval,Ajax请求 同步 任务:除了异步任务的那几个,其他都是 同步 任务 EvenLoop: 事件 循环 我们知道,在js运行 代码 是,它是单线程的, 下面我们可以把 事件 循环的过程过述一下: 1, 执行 栈:用于 执行 任务 代码 的的,也就是js的主线程,它会先 执行 同步 任务,若发现有异步 代码 ,就会把异步 代码 放到浏览器宿主环境 执行 ,继续 执行 下面的 同步 代码 2,浏览器宿主:用于 执行 异步 代码 ,异步任务 执行 完成后,会把异步任务的回调函数放入到任务队列
写在前面:虽然平时做项目,但是发现自己写的 代码 还是很烂。最近接触了一个对性能要求比较高的项目,于是重新开始审视自己写的 代码 是不是达到尽量较小系统性能了。加上前几天学到express框架了解到了回调函数的操作。作为拓展,查了许多资料,再次总结一下javascript的异步操作。 javascript是一门单线程语言,即一次只能完成一个任务,若有多个任务要 执行 ,则必须排队按照队列来 执行 (前一个任务完成,
问题产生原因: 用户充值接口,一个选择支付方式的 dom 绑定了一个插入订单的 ajax。 为了监测用户点了哪个支付方式,现在要把选择哪个支付方式记录下来。当然可以在这个ajax请求的方法里面加入一个插入监测数据。但是考虑到插入订单的时候要与很多支付平台对接,速度会本来比较慢。万一出现意外情况导致订单插入失败,会比较麻烦。 然后研究了下。一个 dom 绑定两个 事件 执行 顺序
addEventListener的基本用法 项目开发 ,javascript和html的解耦变得至关重要,我们被推荐使用 事件 动 态绑定的方式来处理按钮的 事件 。W3C为我们提供了addEventListener()函数用来为指定的 dom 元素动态绑定 事件 。这个函数有三个参数: type:用来设置 事件 类型,例如click。 listener:用来设置监听 事件 的函数,及type类型的 事件 发生后 执行 的函数。 大部分情况下,确切的说是我们绑定事... <progress id="Progress" value="0" max="100"></progress> <input type="file" name="file" onchange="showPreview(this)" /> <img id="portrait" src="" width="70" height="75"> function showPreview(source) { var file = source. 在这个例子 ,我们首先获取了一个id为“myBtn”的按钮元素。然后,我们使用addEventListener方法给该按钮添加一个click 事件 监听器。最后,我们定义了一个名为handleClick的函数来处理该 事件 。在这个函数 ,我们通过event.target获取了 事件 目标元素,然后 执行 一些操作来处理该 事件 。 需要注意的是, DOM 2 事件 处理 事件 对象是通过回调函数的参数传递进来的,而不是像 DOM 0 事件 处理那样通过this关键字获取。因此,在 事件 处理函数 ,我们需要通过event参数来获取 事件 相关的信息。 解决:fatal: unable to access ‘https://github.com/Homebrew/brew/‘: Error in the HTTP2 framing layer 11330