【发布时间】:2017-06-24 17:09:43
【问题描述】:
我目前正在开发一个新的前端 javascript 框架。在过去的几天里,我重构了 DOM 更新程序和一些其他代码,以使其看起来更好,并在 DOM 元素在内存中保持分离时消除一些内存泄漏。
不幸的是,iPhone 和 iPad 2 上的 Safari 现在由于未知原因开始崩溃(我正在测试的其他浏览器都很好
窗口: IE10emu/11、edge 14、chrome、opera、FF - 最新版本
机器人: Webview 4、38、chrome、opera、ff - 最新版本
没有问题)。
我尝试使用 Windows 上的 Chrome 和 ios_webkit_debug_proxy 通过远程调试对其进行调试,但不幸的是它没有向我显示任何内容。
我几乎确信当我使用主 DOM 文档或影子 DOM 文档时会出现问题。
奇怪的是:当我将日志切换到控制台时(有大量日志 框架中的功能)仅用于 DOM 更新程序模块并使用远程调试功能,一切似乎都工作正常(当然除了它很慢)并且它不再崩溃,所以我什至看不到它何时崩溃。
由于我没有 Mac,甚至没有 Apple 开发许可证,我正在寻求拥有 Mac 并具有一些开发经验的人的帮助。我想知道是否有可能以某种方式调试这些意外崩溃,或者至少是否有可能得到它崩溃的原因(某种野生动物园日志?) - 内存泄漏,内存不足......无论什么可以帮助我做一些解决方法。
以前的版本运行良好。与它相比,我没有做任何特别的事情,尤其是在操作 DOM 时,但代码被重新排序,放置在更多的函数/方法中并进行了一些优化。
工作(更少或更多:)版本可以在这里找到:http://ajsfw.azurewebsites.net/
有问题的版本可以在这里找到:http://ajsdoc.azurewebsites.net/ 关闭了日志记录(如果需要我可以打开)
工作代码的来源可以在这里找到:https://github.com/atomsoftwarestudios/ajsdoc。
如有必要,我还可以提供新的、有问题的来源,但我不想将它们推送到主要来源,直到它得到修复,所以我可以分叉或将其作为压缩包发送。问题是它是一个 Visual Studio 解决方案,目前与 Mac 有点不兼容 :) 但我很确定我们可以找到方法。
代码已经很复杂了,可能需要我身边的一些合作才能找到发生了什么。
希望你能帮忙。
更新(问题已解决):
在添加/删除“ontouchmove”事件侦听器时崩溃。
我将多个 HTML 文档 (document.implementation.createHTML) 用于模板,并将主文档 (window.document) 用作托管渲染目标。当我使用innerHTML将模板加载到“shadow dom”时,分配给模板标签的ontouch ...属性导致了问题,所以在我设置模板innerHTML之前我重命名了它,然后在渲染到主DOM期间我添加了EventListener原名。
奇怪的是:在重构之前,事件监听器在模板“shadow DOM”中注册并不重要。但是我还添加了一些新功能,所以也许其中一个是导致它的原因。难以调试,尤其是在浏览器崩溃时。重要的是,即使代码中有一点复杂,它也能再次发挥魅力。
结果可以在之前提供的链接上看到,ajsdoc... 的日志记录如此之慢(IE10/11 慢得要命),如果未优化(未最小化)的 ajsfw 发布而没有记录那么快。
如果对 sbdy 感兴趣,则提交固定源
【问题讨论】:
-
我忘了提到参考指南在重构后有一些问题,但这不是问题的主题。
-
如果确实导致浏览器崩溃,请考虑在bugs.webkit.org 提出一个错误。
-
@sideshowbaker 它在崩溃时绝对是一个浏览器错误:D 我发现他们在 Polymer 上遇到过类似的问题,因此 Google 已经报告了在 touchEventsChangedTimerFired 期间崩溃。我会考虑的。
标签: javascript dom crash mobile-safari shadow-dom