我在菜单上遇到了一个奇怪的问题.当我回到一个包含了
之后我点击它(或最小化它)的页面时,
有时会崩溃并变得无法响应.我检查了所有代码,它是100%有效的,我进一步看到这种情况也发生在其他网站上.
我在最新版本的Safari(适用于OSX 10.6.8)以及最新版本的Chrome和Firefox(在Windows Vista和OSX 10.6.8上都经过测试)中体验过菜单折叠.奇怪的是,我无法重现在
Windows 8上运行的Chrome中的崩溃......最后一点:看起来
元素的长度会影响菜单崩溃的可能性(也就是说,
元素中的元素越多)
,崩溃的可能性越大.有时
菜单会在被选中并单击一次后崩溃,有时可能需要5次或6次尝试.
我的问题是:导致崩溃的原因是什么,是否有一个已知的工作?请看下面的示例代码,它非常简单,但是在
我之前提到的浏览器/操作系统中菜单仍然崩溃了.提前致谢!
Select Test
更新:
这是在OSX 10.6.8上运行的Safari 5.1.9中折叠/无响应菜单的屏幕截图(这是一个与我之前使用的不同的mac).3次尝试后(选择一个选项,然后单击浏览器),它变得没有响应.单击时它不会显示选项列表,并且在重新加载页面之前完全没有响应.我马上就会在mac上下载chrome.
更新2: 根据@ webdad3,此问题也出现在IE9中
更新3:
这是我在上面发布的源代码的链接,但是在JSbin中.由@starbeamrainbowlabs友情提供.
http://jsbin.com/eXOMeRI/1/edit
更新4:
根据@ Zarazthuztra,OSX 10.8中也出现了这个问题.
更新5:
我正在接受@ cloudcoder2000的建议并在问题本身中发布此链接.我相信它表明a 不应该崩溃(就像我们许多人所经历的那样),无论
它包含的数量是多少.
HTML下拉控件中是否有最大数量的选项(值)?
到目前为止,我还要感谢大家的帮助.
更新6: 我担心这个问题开始停滞不前......如果有人有任何关于造成这个问题的理论(无论看起来有多么"离谱")让我知道,我会测试它尽快.
更新7:请 确认:我在几个不使用Javascript的页面上遇到过这个崩溃问题.此外,上面发布的示例代码(不包含任何Javascript)已经为我和其他一些stackoverflow用户(跨不同的操作系统和浏览器)崩溃了.
更新8:
@Capile能够重现在Mac OS X 10.9.1上运行的Safari 7.0.1中的崩溃问题.
更新9:
通过使用@Capile的代码,我能够在Safari 5.1.10(在OSX 10.6.8上运行)中获得"uncollapse".请阅读他的答案以获取详细信息.我将在今天或明天晚些时候在Chrome和Firefox中测试他的代码.这真的很有希望,我想我们已经接近解决这个问题了.到目前为止,我再次感谢大家的帮助,你们真棒!
更新10:
我终于有机会在我的Snow Leopard(10.6.9)计算机上测试Chrome中的@Capile代码.这次让我崩溃有点麻烦,但经过几分钟的尝试,它终于做到了.将他的代码粘贴到控制台后
"uncollapsed"(尽可能不优雅).这很奇怪,因为如果这个"崩溃"问题与系统级垃圾收集有关,那么人们会认为a
会在浏览器中相当一致地"崩溃",但事实并非如此.我已经测试了无数的浏览器(跨多个操作系统),并且
"崩溃"在某些浏览器(例如Safari)中似乎非常普遍......我当然不是专家程序员所以我可能错了,但无论如何,我只是想更新这个问题,以便更多的人可以考虑新的信息.
更新11:
我刚刚为这个问题添加了一笔赏金,试图产生更多的兴趣(我希望它有所帮助).无论如何,我昨晚能够在最新版本的Firefox(在OSX 10.6.9上运行)中崩溃.遗憾的是我没有机会在Firefox中测试@Capile的代码,但我今天会尝试这样做.
由于<select>
元素UI由操作系统在几个浏览器中处理(这使得它们的完整样式变得更加复杂或者不可能),我猜这是操作系统级别的错误,或者浏览器中与某些操作系统UI相关的错误功能 - 绝对不是源HTML的问题,这很简单,并且根据规范).
对于浏览器,<select>
元素是完全正常的:你可以在DOM看到它,甚至操纵它(它也会监听事件).如果您将其分离并重新连接到DOM,它将再次正常工作(打开并启用选择).如果你只是在控制台窗口运行下面的代码,你将再次使用它:
var s=document.getElementsByTagName('select'), i=s.length, a=document.createElement('div'), b; while(i-->0) { s[i].parentNode.insertBefore(a, s[i]); b=s[i].parentNode.removeChild(s[i]); a.parentNode.insertBefore(b,a); a.parentNode.removeChild(a); b=null; }
我的猜测是,当浏览器模糊时,UI元素可能会被某种操作系统垃圾收集器捕获,当你回到浏览器时,它只是希望操作系统再次显示它(但它找不到它) ).但这只是一个猜测 - 我需要配置Safari内存才能真正实现它.
我可以在Mac OS X 10.9.1上运行的Safari 7.0.1上复制它,但无法在Firefox 28.0a2(Aurora)或Chrome 34(Canary)上复制它.