js 代码位置不同,导致随着点击函数执行次数累加
每个人书写代码的习惯都不同吃,思想也都不一样,但在工作中为了减少工作量与时间,难免遇到要用别人写的代码。这次在使用同事的代码中,偶然发现的问题,因为js不好,所以一眼也没发现问题所在,查了查网上才知道这是由于重复绑定导致的。如下所示:
function showAlt(){
if($("div.alert").length > 0){
$("div.alert").show();
}else{
var html = '<div class="alert" style="border:1px solid #ccc; padding:20px;">hello world!</div>';
$("body").append(html);
}
$(".alert").on("click",function(){
console.log("alert1");
$(this).hide();
});
}
$("#login").click(function(){
showAlt();
});
那么,每次点击无论div.alert是否存在、是否绑定过函数,都会再次绑定函数,这就导致了函数多次绑定与多次执行,解决办法如下:
方法1. 在首次加载该标签时绑定即可,如果页面已存在节点说明其已经绑定过,无需再绑定,这样就避免了函数的多次绑定与执行。
function showAlt(){
if($("div.alert").length > 0){
$("div.alert").show();
}else{
var html = '<div class="alert" style="border:1px solid #ccc; padding:20px;">hello world!</div>';
$("body").append(html);
$(".alert").on("click",function(){
console.log("alert1");
$(this).hide();
});
}
}
方法2. 每次绑定前先解绑,这里用到了unbind()
function showAlt(){
if($("div.alert").length > 0){
$("div.alert").show();
}else{
var html = '<div class="alert" style="border:1px solid #ccc; padding:20px;">hello world!</div>';
$("body").append(html);
}
$(".alert").unbind("click").on("click",function(){
console.log("alert1");
$(this).hide();
});
}
如果用的是方法live(貌似jq1.8版本后就取消了这个函数了)绑定的函数,那就需要die()了
方法3. 使用事件委托为标签绑定函数,事件委托的方法有on()、delegate(),这里就不过多介绍了
function showAlt(){
if($("div.alert").length > 0){
$("div.alert").show();
}else{
var html = '<div class="alert" style="border:1px solid #ccc; padding:20px;">hello world!</div>';
$("body").append(html);
}
}
$("body").on("click",".alert",function(){
console.log("alert1");
$(this).hide();
});
js 代码位置不同,导致随着点击函数执行次数累加的更多相关文章
- 关于js代码位置的第一次总结
最近在学习dom树节点操作时,发现查找结点总是返回null,原因在于将js代码放在了head里,因为页面是从上往下逐行加载,在还未加载相关节点时当然查找不到,返回值为null. 而对于另一句老生常谈的 ...
- JS代码判断IE6,IE7,IE8,IE9的函数代码
JS代码判断浏览器版本,支持IE6,IE7,IE8,IE9!做网页有时候会用到JS检测IE的版本,下面是检测Microsoft Internet Explorer版本的三种代码 做网页有时候会用到JS ...
- HTML 练习js代码位置在head标签
方式一: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...
- QQ空间自动点赞js代码
1.jQuery().each(): each() 方法为每个匹配元素规定要运行的函数. 提示:返回 false 可用于及早停止循环. 函数原型: function(index,element) 为每 ...
- 如何才能优雅地书写JS代码
第一:关于匿名函数的使用 要避免全局变量泛滥, 可以考虑使用匿名函数, 把不需要在外部访问的变量或者函数限制在一个比较小的范围内. 例如以下代码: <script> function fu ...
- 【JS学习】-利用谷歌浏览器调试JS代码(转)
谷歌浏览器是常用来调试JS代码的工具,本文主要介绍如何利用谷歌浏览器来调试JS代码,协助我们进行开发工作. 首先,打开谷歌浏览器,按快捷键F12或者ctrl+shift+j,就可以打开谷歌浏览器的开发 ...
- 刷新页面后,让控制台的js代码继续执行
在各种限时,秒杀活动中,有个自动循环的点击的工具是很重要的. 为了方便起见,我们把Js代码放在浏览器的控制台执行,但是刷新页面后,js代码就清空了,也就无法执行. 可以用js代码实现一个不受页面刷新影 ...
- 如何编写高质量的js代码--底层原理
转自: 如何编写高质量的 JS 函数(1) -- 敲山震虎篇 本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/7lCK9cHmunvYlbm ...
- js代码执行顺序问题
前 言 LiuDaP 今天就给大家介绍一个特别基础的东西,javascript中函数的一点儿小知识(js代码的执行顺序),希望对大家有那么一点点帮助吧!!! 一.js--->单线程 严格意 ...
随机推荐
- 对scrapy进行单元测试 -- 使用betamax
使用betamax进行单元测试 爬虫代码 测试代码 对于scrapy的单元测试,官方文档并没有提到,只是说有一个Contract功能.但是相信我,这个东西真的不好用,甚至scrapy的作者在一个iss ...
- 5分钟学会maven入门
一.背景 1.定位:Maven是优秀的构建工具 2.意义:自动化构建,即节约了我们每天有相当一部分时间花在编 译.运行单元测试.生成文档.打包和部署等烦琐且不起眼的时间. 3.三要素:目标(Targe ...
- java去除数组中的空值
public String[] deleteArrayNull(String []string) { String []array = string; // 声明一个list List<Stri ...
- C#实现多线程的方法:线程(Thread类)和线程池(ThreadPool)
简介 使用线程的主要原因:应用程序中一些操作需要消耗一定的时间,比如对文件.数据库.网络的访问等等,而我们不希望用户一直等待到操作结束,而是在此同时可以进行一些其他的操作. 这就可以使用线程来实现. ...
- 单例模式(一)static、final和单例模式
static 那天我朋友问了我个问题,static和单例模式有什么区别,所以我觉得static可以讲一下 他的问题是,把对象弄成static是不是就不变了 显然,这是还没弄清楚引用和对象的区别 其实存 ...
- CF949E Binary Cards 题解
题面 首先发现:一个数最多会出现1次: 然后深入推出:一个数不会既用它又用它的相反数: 这样就可以依次考虑每一位了: 如果所有的数都不含有这一位,那么就直接把所有的数除以2 如果含有,那么就减去这一位 ...
- STL vector常见用法详解
<算法笔记>中摘取 vector常见用法详解 1. vector的定义 vector<typename> name; //typename可以是任何基本类型,例如int, do ...
- leecode刷题(27)-- 合并k个排序链表
leecode刷题(27)-- 合并k个排序链表 合并k个排序链表 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [ 1->4->5, 1-> ...
- [转载]汇编语言assume伪指令的作用
原文:https://blog.csdn.net/u010234808/article/details/38366943 摘出关键部分: 编写程序,是写给编译软件的.由编译软件,编译成机器码,再去控制 ...
- MySQL太慢?试试这些诊断思路和工具
MySQL 慢怎么办 如果遇到 MySQL 慢的话,你的第一印象是什么,MySQL 数据库如果性能不行,你是如何处理的? 我咨询了一些同行, 得到了以下反馈: 第一反应是再试一次 第二个反应是优化一下 ...