上了高人的一堂课,回家消化了三天,写了一个DIV无限级下拉菜单。特此发布,谨以此向苦练JavaScript高手们致敬! 不是吧,我的是IE7和Firefox2.0.0.8,没有问题啊,只是CSS弱 DIV更弱。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 to gzdiablo代码里面用的就是闭包,呵呵。 我的 win200 sp4 + IE 6.0.2800 有问题 看到代码里面多用了一层function来绑定事件. 网上说这样很好但实际上反而妨碍了IE下内存的释放.因为就算你将几个事件模型delete掉,在释放HTMLELement时候缺因为无法释放掉几个onmouseover=function(){}等等。导致整个HTMLElement仍然在残留在内存中 经你这么一说我还真测了下纯IE7打开空白页 = 25.5MB打开页面拦截JavaScript = 28MB启用JavaScript < 28.5MB 几百K的内存可以忽略不计了把所有菜单事件触发一遍 = 30MB 这里是循环遍历了儿子 占用了1.5MB 而这里的1.5MB是绑定事件之后 事件触发的,没有通过闭包,因为标签对象的事件在页面装载时就已经附加上去,闭包的工作在触发任何一个菜单之前早就已经结束,没结束浏览器会报错。CPU峰值 4%首先程序是面向对象,用闭包无非就挽救this,让程序更贴近对象编程。再一个没有用递归,每一层都只处理自己的儿子,而且怎个事件绑定只有一次onload的时候。整个IE都关了不知道内存还占着做什么,如果这样操作系统多开几个不规范的网页不就挂了,不是大型树菜单,占用不了多少资源,都在正常范围,不信你就编个最简单的试试,通常大规模JavaScript如果编码习惯不好,乱用对象,那是程序员自讨苦吃。=====Firefox的测试让我无语,启动Firefox打开空白页 25.7n MB,打开页面跑一遍菜单涨了一点点 还是25.7n MB,当中还有我的一些插件,还有Google的同步收藏夹验证同步占用的资源都在内。 确实关闭了浏览器就什么都解决了。如果是大应用外加ajax交互。这里必定存在大量的数据交互。到时候就很难避免内存泄漏带来的问题。浏览速度降低是主要表现。不过一般的小应用这些可以忽略不计。我只是提点意见。LZ的代码非常标准没什么问题。说实在我以前也是这么写的。 其实不难发现C#和Java的一些事件都是函数指针的模式,JavaScript也不例外,实际在 onclick = "代码片段1;代码片对2;代码片段n;..."这些是明文代码 也就是函数模型,怎么样都需要实例对象。 而对象是用绳子拉着走了,绳子一断,对象也就失去了在存在的意义(所以才会丢失对象丢失了this的引用,那么程序对内存的管理原理不说大家也都明白了),现在的语言都会考虑到这一点,如果IE真这么多问题,也只能说明IE改动的地方太多,别人统一用JavaScript他就偏偏要翻版一个JSCript,而且做了很多改动,所以问题多也怪不得我们程序员。只是好多人习惯了IE反而不习惯标准了。编程进步、程序员进步,IE如果不进步,迟早会被边缘化。这里说的内容涉及C/C++的指针 C#或Java的对象垃圾回收机制,并不是我乱说的,的确这些都是基础原理。我晕,无非就是个下拉菜单,呵呵。 练了练刚学会不久的JavaScript模拟对象编程,再说做得也不好。 gzdiablo 你当真以前和我一样这么写的? 哈哈 C#和java对于我来说几乎是玩具了.C++我开发过单片机数据采集项目 但2年多没用了都生了.C的话自从在大学时写过泥巴之外就没用过了.javascript我有4年经验了,但以前都是DOM操作.开始OOP模式开发也只是1年多的时间.不过已经是非常精了.也专门研究过IE的内存泄漏和内存释放问题.所以才能和你这么说.你这样的代码大概是我半年前还没研究IE内存问题时的写法.因为曾经看过一个贵佬的js优化建议,里面也建议说另外用一个方法去调用比较好.确实IE存在这这样那样的问题.不过IE的标准确实比较好.FF也在慢慢的吸收IE的部分标准.如此下去FF还真有可能超越IE.IE可能也会修正自己的bug. 无语... gzdiablo暴强。 gzdiablo 看了你的文章,IE或IE内核的浏览器在最小化时内存调整幅度巨大,你研究得真仔细。请教一下,上面的代码怎样改动能得到更好的效果? 每刷新一次占用内存就多几十K !IE 6.0.3790.1830 for循环的话国外的网站上说应该for(var i=0,l=xxx.length;i<l;i++)....其他没什么问题,结构有点特殊..好像和我的写法有点区别........这种结构不好评论. 其实只要给window.onunload事件加个语句柄就可以降低刷新后内存增加的问题 但效率非常低不建议用而且只是清除元素因为数据绑定导致内存无法卸载的问题 但脚本里面引起的内存问题则无法解决window.onunload = function(){ var tags = document.getElementsByTagName("*");//获取全部标签 for(var i=0,l=tags.length;i<l;i++)//遍历全部标签 优化了for循环 for(var o in tags[i])//遍历全部属性 if(o.indexOf("on")==0)//判断属性是否以"on"开头 是否是事件柄 tags[i][o] = null;//清除事件柄的内容} 周末我再研究一下,这个还没考虑子菜单的样式事件,虽然可以实现,但是比较混乱。 需要大改结构。其实我这种写法的目的是 便于界面设计师一目了然 他一看HTML部分就知道谁是谁的下级菜单,这样搞界面精通CSS和DIV的想怎么设计就怎么设计。子菜单可以用容器包裹起来,在容器上做文章。 Jquery中load()中载入静态页面时出现乱码 javascript分页问题,给点思路 急,对象不支持此属性或方法? js对cookies操作的问题 html文件中引用javascript文件出现错误 动态获取列表框中的内容 怎么求两个日期相差几个月,几个星期? 关于页面装载结束前的事件 问一个比较白痴的问题,想不起来。了 如何获取Ext.Msg.confirm()的返回值 怎样将剪切板上的图片显示出来 新开窗口如何读取父窗口或返回值给父窗口
网上说这样很好但实际上反而妨碍了IE下内存的释放.
因为就算你将几个事件模型delete掉,在释放HTMLELement时候缺因为无法释放掉几个onmouseover=function(){}等等。导致整个HTMLElement仍然在残留在内存中
打开页面拦截JavaScript = 28MB
启用JavaScript < 28.5MB 几百K的内存可以忽略不计了
把所有菜单事件触发一遍 = 30MB 这里是循环遍历了儿子 占用了1.5MB 而这里的1.5MB是绑定事件之后 事件触发的,没有通过闭包,因为标签对象的事件在页面装载时就已经附加上去,闭包的工作在触发任何一个菜单之前早就已经结束,没结束浏览器会报错。CPU峰值 4%首先程序是面向对象,用闭包无非就挽救this,让程序更贴近对象编程。再一个没有用递归,每一层都只处理自己的儿子,而且怎个事件绑定只有一次onload的时候。整个IE都关了不知道内存还占着做什么,如果这样操作系统多开几个不规范的网页不就挂了,不是大型树菜单,占用不了多少资源,都在正常范围,不信你就编个最简单的试试,通常大规模JavaScript如果编码习惯不好,乱用对象,那是程序员自讨苦吃。=====
Firefox的测试让我无语,启动Firefox打开空白页 25.7n MB,打开页面跑一遍菜单涨了一点点 还是25.7n MB,当中还有我的一些插件,还有Google的同步收藏夹验证同步占用的资源都在内。
我只是提点意见。LZ的代码非常标准没什么问题。说实在我以前也是这么写的。
C++我开发过单片机数据采集项目 但2年多没用了都生了.
C的话自从在大学时写过泥巴之外就没用过了.javascript我有4年经验了,但以前都是DOM操作.开始OOP模式开发也只是1年多的时间.
不过已经是非常精了.也专门研究过IE的内存泄漏和内存释放问题.所以才能和你这么说.
你这样的代码大概是我半年前还没研究IE内存问题时的写法.
因为曾经看过一个贵佬的js优化建议,里面也建议说另外用一个方法去调用比较好.确实IE存在这这样那样的问题.不过IE的标准确实比较好.FF也在慢慢的吸收IE的部分标准.
如此下去FF还真有可能超越IE.IE可能也会修正自己的bug.
IE 6.0.3790.1830
for(var i=0,l=xxx.length;i<l;i++)....其他没什么问题,结构有点特殊..好像和我的写法有点区别........
这种结构不好评论.
而且只是清除元素因为数据绑定导致内存无法卸载的问题 但脚本里面引起的内存问题则无法解决window.onunload = function()
{
var tags = document.getElementsByTagName("*");//获取全部标签
for(var i=0,l=tags.length;i<l;i++)//遍历全部标签 优化了for循环
for(var o in tags[i])//遍历全部属性
if(o.indexOf("on")==0)//判断属性是否以"on"开头 是否是事件柄
tags[i][o] = null;//清除事件柄的内容
}