当有多个相同的DIV时,我怎么判断我点击的是哪个嘞
链接:https://segmentfault.com/a/1190000003480973?utm_source=tuicool&utm_medium=referral
序言
这是我曾经面试的时候遇到过的一道面试题。非常基础,而且出现频率奇高,所以就留心总结一下。原题目如下:
1到100个节点,点击其中任意一个节点,弹出节点所在的序号。
问题就是如此之简单直接,但我对这扑面而来的题目似乎还没有能力完全做好准备。回想起当时的能力真是渣到醉的不行。不过“二哈”的我把这点当做一个需要我努力的理由。
既然已经很差了,学一点也不会比现在更差。放弃什么的,就真的一点希望都没有了。
说了这么多都偏题了,下面我们直接讨论代码吧。
完成与进阶
原始代码
我当时所编写的代码如下,代码已经过测试,可实现题目要求。现在想想我当时好渣啊,写的代码让现在的我不忍直视。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>我点的到底是谁呢</title>
<style>
.node {
width: 200px;
height: 50px;
line-height: 50px;
background: #ed145b;
margin-bottom: 10px;
text-align: center;
color: #fff;
cursor: pointer;
}
</style>
</head>
<body>
<div class="node" onclick="showIndex(this);">有本事点我啊</div>
<div class="node" onclick="showIndex(this);">有本事点我啊</div>
<div class="node" onclick="showIndex(this);">有本事点我啊</div>
<div class="node" onclick="showIndex(this);">有本事点我啊</div>
<div class="node" onclick="showIndex(this);">有本事点我啊</div>
<!-- 写五个意思一下就好啦,话说复制粘贴感觉好爽啊,根本停不下来!! -->
<script>
function showIndex(obj) {
var oDiv = document.getElementsByTagName("div"),
count = oDiv.length;
for (var i = 0; i < count; i++) {
if (oDiv[i] == obj) {
alert(i + 1);
}
}
}
</script>
</body>
</html>
这么做确实完成了题目所叙述的功能,但是这代码看起来并不优美。现在来改进一下这渣渣的js代码,最起码不要让事件注册以onclick这种方式写在html标签里面,看着好不爽呀!
有一些问题的代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>判断点击的是哪个div</title>
<style>
.node {
width: 200px;
height: 50px;
line-height: 50px;
background: #ed145b;
margin-bottom: 10px;
text-align: center;
color: #fff;
cursor: pointer;
}
</style>
</head>
<body>
<div class="node">有本事你点我啊</div>
<div class="node">有本事你点我啊</div>
<div class="node">有本事你点我啊</div>
<div class="node">有本事你点我啊</div>
<div class="node">有本事你点我啊</div>
<script>
var oDiv = document.getElementsByClassName("node");
for (var i = 0; i < oDiv.length; i++) {
oDiv[i].onclick = function() {
alert(i);
}
}
</script>
</body>
</html>
本想就这么蒙混过关,但是聪明的读者在认真看了上面的改进代码后,一定会一顿@我“你妹啊,运行结果果断不对啊!”
确实不对,因为无论点击哪个div弹出的结果都是5。这是为什么呢?我先不解释,我要卖个关子,我现在要在代码里面加入点匿名自执行函数。
改进后的代码
变量的作用域是js的一个非常重要的概念。相信很多同学理解起来都不是很难,但是也并不是说所有人都懂得的东东。不信,看看下面的代码,解释一下为什么这么做就不会有问题了吧。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>判断点击的是哪个div</title>
<style>
.node {
width: 200px;
height: 50px;
line-height: 50px;
background: #ed145b;
margin-bottom: 10px;
text-align: center;
color: #fff;
cursor: pointer;
}
</style>
</head>
<body>
<div class="node">有本事你点我啊</div>
<div class="node">有本事你点我啊</div>
<div class="node">有本事你点我啊</div>
<div class="node">有本事你点我啊</div>
<div class="node">有本事你点我啊</div>
<script>
var oDiv = document.getElementsByClassName("node");
for (var i = 0; i < oDiv.length; i++) {
(function(i) {
oDiv[i].onclick = function() {
alert(i);
}
})(i)
}
</script>
</body>
</html>
就算我不说你们也都知道的事情
当改进过代码之后,变量i的作用域的发生了改变。之前每一次循环中的变量i都是共享的,但是被包裹起来之后,就彼此独立咯~问题也就解决咯~喜大普奔啊!
使用一下js类库吧
上面的原生js固然可以实现功能,但是不够精简。而且很多时候,我们在工作中都会使用一些js类库,比如:jQuery,Zpeto(移动端使用)什么的。所以在此也贴上jQuery实现该功能的代码。
$('.node').on('click', function(e) {
alert($(this).index());
});
这样一来代码便简洁了很多,对于拥有代码洁癖的我来说,这实在是太舒爽了,哈哈哈!
当有多个相同的DIV时,我怎么判断我点击的是哪个嘞的更多相关文章
- 当有多个相同的DIV时,我怎么判断我点击的是哪个
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 图片大于div时的居中显示
当图片大于div时,想要图片居中显示,如果图片等比例缩小可能会导致图片不能填充整个div,如果直接将图片不设置宽高,将其外层div设置overflow:hidden:这时即使外层div设置了水平垂直居 ...
- js文件需要jsp页面中的div时,此js文件必须在div之后才能获得值,否则获取不到
js文件需要jsp页面中的div时,此js文件必须在div之后才能获得值,否则获取不到 2.图2的内容为directionkey.js的内容
- js实现点击按钮时显示弹框,点击按钮及弹框以外的区域时隐藏弹框
转自https://blog.csdn.net/yimawujiang/article/details/86496936 问题:js实现点击按钮时显示弹框,点击按钮及弹框以外的区域时隐藏弹框? 方案一 ...
- 使用Redmine的PHP API时,如何判断需求是否为原子需求
使用Redmine的PHP API时,如何判断需求是否为原子需求 使用redmine的PHP接口时,怎样才能判断需求是否为原子需求呢,下面给出具体的做法: /** * 判断是否为原子需求, 即是否依然 ...
- IDE连接数据库时测试Test Connection 无法点击
问题: IDE连接数据库时测试Test Connection 无法点击 解决: IDE缺少对应的驱动 第一步: 点击驱动 第二步: 下载驱动 注意:不同版本的驱动下载位置不同,此版本为2017
- 大div中嵌套小div,点击大div时隐藏,点击小div不隐藏
给小div添加一个click事件 <div onClick="event.cancelBubble = true"> //小div
- IOS中div contenteditable=true无法输入 fastclick.js在点击一个可输入的div时,ios无法正常唤起输入法键盘
原文地址: https://blog.csdn.net/u010377383/article/details/79838562 前言 为了提升移动端click的响应速度,使用了fastclick.js ...
- 滑动表层div时 禁止底层滑动
$(".container").bind("touchstart", function (events) { startX = events.originalE ...
随机推荐
- <机器学习实战>读书笔记--决策树
1.决策树的构造 createBranch伪代码: 检测数据集中的每个子项是否属于同一分类: IF SO RETURN 类标签 ELSE 寻找划分数据集的最好特征 划分数据集 创建分支节点 FOR 每 ...
- ES6学习随笔--字符串模板、解构赋值、对象、循环、函数、Promise、Generrator
在线编译器:babel.github 在nongjs中使用 'use strict' let a = ; 运行node : node --harmony_destructuring xxx.js 代码 ...
- 常用工具说明--mongodb、mysql解压版、IDEA配置maven
Mongodb的安装.配置 1.去官网下载mongodb安装包,mongodb官网.点击右上角的 Download,下载对应的msi安装包 2.安装程序,选择 Custom,自定义安装路径,比如安装在 ...
- jQuery 数据 - jQuery.data() 方法
打印出 hi
- Redis 【keys】 一句话说明
DEL----------------------------------删除给定的一个或多个key DUMP--------------------------------序列化给定key,并返回被 ...
- c#之泛型详解(Generic)
这篇文章主要来讲讲c#中的泛型,因为泛型在c#中有很重要的位置,对于写出高可读性,高性能的代码有着关键的作用. 一.什么是泛型? 泛型是 2.0 版 C# 语言和公共语言运行库 (CLR) 中的一个非 ...
- 从MySQL到ORM(三):连接、存储过程和用户权限
一.联结表 数据仍使用前文中的数据. 1.子查询 作为子查询的SELECT语句只能查询单个列.企图检索多个列将返回错误. -- 作为查询条件使用 -- 查看TNT2订单对应的客户ip(order表) ...
- Java基础之java的四大特性
上篇文章说了jdk的安装和java环境的配置,这篇文章主要说下java的特性. 首相说下,编程语言分为面向过程和面向对象,而java就是一种面向对象的编程语言. 什么是面向过程编程呢?就是一流程为单位 ...
- hadoop fs -put localfile . 时出现如下错误: could only be replicated to 0 nodes, instead of 1
hadoop fs -put localfile . 时出现如下错误:could only be replicated to 0 nodes, instead of 1网友的说法: 这个问题是由于没有 ...
- mybatis oracle 顺序模糊匹配
前言:有时需要顺序模糊匹配字段. 用一半的 % 就好: t.item like #{item}||'%'