顺序或者说优先级的重要性---解决dom生成问题有感
我们的大脑有逻辑,程序也有逻辑,只要一切都刚刚好,那么我们大脑的逻辑和程序的逻辑是没有冲突的;但是,有时候,我们想当然,只顾自己头脑中的逻辑,而随意臆想程序的逻辑,这个时候,就会有很多我们觉得不可思议的事情发生了。这篇文章的例子是一个同事问我的问题,他说自己程序有问题,他不知道为什么会这样。
这是代码,它原本的意图是通过遍历a数组,根据pid的不同,生成省份和城市对应的联动下拉, 但是,它是有问题的,你可以试着快速浏览下,看看是否能够瞬间找到问题所在:
var a = [
{'id':'1','pid':'0','name':'陕西省'},
{'id':'2','pid':'0','name':'四川'},
{'id':'3','pid':'1','name':'咸阳市'},
{'id':'4','pid':'1','name':'宝鸡'},
{'id':'5','pid':'0','name':'重庆'},
{'id':'6','pid':'2','name':'成都'}
];
for(var i in a){
if(a[i].pid == 0){
var div = $('<div></div>');
div.addClass('accordion-group');
div.html('<div class="accordion-heading">'+
'<a class="accordion-toggle" data-toggle="collapse" data-parent="#accordion" href=" '+a[i].id+'"><i class="glyphicon glyphicon-plus"></i>'+a[i].name+'</a >'+
'</div><div id="collapse'+a[i].id+'" class="accordion-body collapse" style="height: 0px; "><div class="accordion-inner"></div></div>');
for(var j in a){
if(a[j].pid == a[i].id){
console.log(a[j].name);
var div2 = $('<div></div>');
div2.html('<input type="radio" name="area" value="'+a[j].name+'" id="'+a[j].id+'"/><span>'+a[j].name+'</span>');
div2.appendTo('.accordion-inner');
}
}
}
div.appendTo('#accordion2');
}
我先简单理一下他的思路:
1,他是想整个省市联动都是动态生成的,最后,把这个块扔到页面中显示。
2,他希望生成省份的同时就把城市子项添加到省份下面。
再看看他实现时的思路:
1,遍历,动态生成省份元素。注意:此时,它还是个对象,没有容身之处,只存在于代码中,并没有被放到dom中。
2,当遍历一个省份时,再寻找与它对应的城市列表,然后,添加到城市下。但是,注意,他使用的是类名选择,这种选择方式只能选择已经存在于dom节点中的元素。而此时,刚刚生成的省份节点还未添加到页面中。所以,这一次的添加是失败的,因为没有选到任何东西。
在思考的过程中,忽视了程序的基本规则,所以会有不可思议的表现。
var a = [
{'id':'1','pid':'0','name':'陕西省'},
{'id':'2','pid':'0','name':'四川'},
{'id':'3','pid':'1','name':'咸阳市'},
{'id':'4','pid':'1','name':'宝鸡'},
{'id':'5','pid':'0','name':'重庆'},
{'id':'6','pid':'2','name':'成都'}
];
for(var i in a){
if(a[i].pid == 0){//当pid为0时代表个元素是省份,生成省份信息
var div = $('<div></div>');
div.addClass('accordion-group');
div.html('<div class="accordion-heading">'+
'<a class="accordion-toggle" data-toggle="collapse" data-parent="#accordion" href=" '+a[i].id+'"><i class="glyphicon glyphicon-plus"></i>'+a[i].name+'</a >'+
'</div><div id="collapse'+a[i].id+'" class="accordion-body collapse" style="height: 0px; "><div class="accordion-inner"></div></div>');
for(var j in a){//在生成一条省份信息的时候,查询该省份对应的城市元素,遍历生成城市信息,然后放到对应的省份下
if(a[j].pid == a[i].id){
console.log(a[j].name);
var div2 = $('<div></div>');
div2.html('<input type="radio" name="area" value="'+a[j].name+'" id="'+a[j].id+'"/><span>'+a[j].name+'</span>');
div2.appendTo('.accordion-inner');//放到对应省份的子项里面,注意,此时,这个城市对应的省份元素是还未被插入到页面中的,也就是说页面中是没有这个元素的。
}
}
}
div.appendTo('#accordion2');//到这里省份信息才填充到页面中,也就是说页面中才有省份信息,所以第一遍循环里面,对应元素是获取不到的。所以,在第一次加载的时候是获取不到省份下面的城市信息的,当加载一次的基础上,再次执行才可以取到城市信息。
}
突然想起来我的博客名,喜欢的事认真去做,其实,喜欢的人和东西也要认真去了解。懂得了,才能更好的相处!加油吧,小小小喽啰O(∩_∩)O~
顺序或者说优先级的重要性---解决dom生成问题有感的更多相关文章
- CentOS6.0(64位)安装Apache+PHP+Mysql教程,安装Magento(解决DOM,Mcrypt,GD问题)完整教程
CentOS6.0(64位)安装Apache+PHP+Mysql教程,安装Magento(解决DOM,Mcrypt,GD问题)完整教程 0 Posted by :小黑 On : 2012 年 9 ...
- 给DOM生成的元素添加事件
问题:通过js给页面添加新元素,并给该元素添加绑定事件,但新添加的元素上却没有绑定任何事件. 常见例子:在处理表格的时候,每行行末有个删除按钮,如下图.点击删除按钮的时候删除这一行. //html部分 ...
- android之DOM生成与解析
DOM解析不适合于进行大数据文件的操作,DOM解析适合于对文件进行修改和随机存取的操作. DOM生成 //判断一下是否存在sdcard if(!Environment.getExternalStora ...
- DOM生成XML文档与解析XML文档(JUNIT测试)
package cn.liuning.test; import java.io.File; import java.io.IOException; import javax.xml.parsers.D ...
- Android使用DOM生成和输出XML格式数据
Android使用DOM生成和输出XML格式数据 本文主要简单解说怎样使用DOM生成和输出XML数据. 1. 生成和输出XML数据 代码及凝视例如以下: try { DocumentBuilderFa ...
- DOM生成&解析
开篇注意,由于解析有可能有大文件非常耗时,建议另开一个线程解析也可以不开具体视情况而定 DOM生成 1.拿到Document的工厂实例化 DocumentBuilderFactory df = ...
- Python:Dom生成XML文件(写XML)
http://www.ourunix.org/post/327.html 在python中解析XML文件也有Dom和Sax两种方式,这里先介绍如何是使用Dom解析XML,这一篇文章是Dom生成XML文 ...
- 解决 unity 生成 android apk read Resources
http://www.cnblogs.com/solq/archive/2012/05/21/2511522.html TextAsset t = (TextAsset)Resources.Load( ...
- 利用享元模式来解决DOM元素过多导致的网页解析慢、卡死的问题
我也不知道应该为本文的思路取一个什么比较恰当的标题,但是感觉符合享元模式的思路. 在一些网页应用中,有时会碰到一个超级巨大的列表,成千上万行,这时大部份浏览器解析起来就非常痛苦了(有可能直接卡死). ...
随机推荐
- 理解JAVA内存模型
实际上java内存模型是如上图所示一样 每个线程有自己的栈内存,存放共享对象的副本,本地变量 每个线程自己的本地变量是不可见的,但是共享对象对每个线程都是可见的. 如果想实现线程通信的话, 线程对共享 ...
- React demo:express、react-redux、react-router、react-roter-redux、redux-thunk(二)
上一篇杂七杂八说了下express部分的,现在开始进入正题. 接下去的顺序,就是项目从零开始的顺序(思路方向). [actions定义] 如图,目录页,有4部分的内容,所以以下几个actions是需要 ...
- python web——Django架构
环境:windows/linux/OS 需要的软件:Firefox 浏览器(别的也可以 不过firfox和python的webdriver兼容性好) git版本控制系统(使用前要配置 用户 编辑器可以 ...
- 项目Alpha冲刺Day10
一.会议照片 二.项目进展 1.今日安排 解决前后台联调问题,完善全局的请求和路由跳转处理,添加空文件完善路由信息,优化界面跳转等待.完成个人信息和修改密码.修改前台数据组织和方法调用方式.解决登录和 ...
- 2017-2018-1 1623 bug终结者 冲刺001
bug终结者 冲刺001 冲刺阶段任务分配 任务 工作量比例 完成时间 负责人 第一篇博客:各个成员的任务安排 1/7 12月1日 20162322 朱娅霖 第二篇博客:欢迎界面,主菜单界面 1/7 ...
- Linux下vim上编辑实现进度条
1.效果展示: 进度条,先来看一个效果: 这是进度结果,模拟实现了进度条的前进.百分比的现实.以及稍微的动画特效. 2.原理描述: 因为Linux系统下的输出有缓存,如果及时刷新显示,就可以得到我们想 ...
- 关于java中的数组
前言:最近刚刚看完了<Java编程思想>中关于数组的一章,所有关于Java数组的知识,应该算是了解的差不多了.在此再梳理一遍,以便以后遇到模糊的知识,方便查阅. Java中持有对象的方式, ...
- raid5 阵列硬盘离线数据恢复成功案例
数据恢复故障描述: 某研究院 DELL 磁盘阵列崩溃,内置15块1TB硬盘搭建的RAID5阵列.一开始有一块硬盘离线,在更换新硬盘进行同步的过程中,第二块磁盘指示灯报警,同步失败,阵列无法正常工作. ...
- 6块300G SCSI RAID5,两块硬盘损坏的数据恢复总结
[用户单位]XXXX网站[数据恢复故障描述]DELL POWEREDGE 2850服务器,内置6块300G SCSI硬盘 ,组成RAID5,安装LINUX REDHAT 4操作系统,存储大量照片,文件 ...
- hexo博客图片问题
hexo博客图片问题 第一步 首先确认_config.yml 中有 post_asset_folder:true. Hexo 提供了一种更方便管理 Asset 的设定:post_asset_folde ...