Performance 从UIWebView中删除HTML元素时的糟糕性能

Performance 从UIWebView中删除HTML元素时的糟糕性能,performance,ios,uiwebview,stringbyevaluatingjavascr,Performance,Ios,Uiwebview,Stringbyevaluatingjavascr,我目前正在编写一个iOS应用程序,它使用UIWebView来浏览页面。有时我需要使用stringByEvaluatingJavaScriptFromString:动态删除UIWebView中的元素,但在我的第一代iPod touch上,主UI有时会被锁定2秒,在iPhone 3GS上可能会被锁定半秒。我用来删除它的JavaScript很简单: element.parentNode.removeChild(element); 没有比这更复杂的了。同时,我正在OpenGL ES中进行一些非常基本的

我目前正在编写一个iOS应用程序,它使用UIWebView来浏览页面。有时我需要使用
stringByEvaluatingJavaScriptFromString:
动态删除UIWebView中的元素,但在我的第一代iPod touch上,主UI有时会被锁定2秒,在iPhone 3GS上可能会被锁定半秒。我用来删除它的JavaScript很简单:

element.parentNode.removeChild(element);
没有比这更复杂的了。同时,我正在OpenGL ES中进行一些非常基本的2D渲染,如果重新渲染UIWebView不会锁定,我会在主线程上使用简单的CoreAnimation。是否必须重新计算DOM树、所有元素位置等?这真的应该锁定主UI线程吗?我是不是在调用
stringByEvaluatingJavaScriptFromString:
来锁定所有东西?这是正常的,并且在这种硬件上是预期的吗?奇怪的是,它能够在webview中渲染一些半复杂的MooTools动画,不透明度和高度会发生变化,但是删除一个元素需要几秒钟的时间


有人对改进有什么想法吗?可能只是使用
可见性:hidden
隐藏元素更好,或者设置
不透明度:0
?有什么想法或经验吗?

DOM树操作在所有浏览器中都非常慢,尤其是iOS Safari。关键因素是DOM树的大小。因此,最好的建议是边删除边删除(不要使用可见性:隐藏)

如果您可以避免使用直接dom操作,而是使用setInnerHTML(),这将带来更好的性能。我见过它以100倍的速度工作。这是违反直觉的,但是进行大量的字符串操作,然后向浏览器抛出一个字符串要快得多。这是因为浏览器经过优化,可以从字符串呈现DOM树

在您的情况下,setInnerHTML可能只有在尝试同时删除多个节点时才有用。如果您只删除了一个节点,那么您就陷入了困境——请尽量保持DOM的小规模


希望这能有所帮助。

在所有浏览器中,尤其是iOS Safari中,DOM树操作的速度都非常慢。关键因素是DOM树的大小。因此,最好的建议是边删除边删除(不要使用可见性:隐藏)

如果您可以避免使用直接dom操作,而是使用setInnerHTML(),这将带来更好的性能。我见过它以100倍的速度工作。这是违反直觉的,但是进行大量的字符串操作,然后向浏览器抛出一个字符串要快得多。这是因为浏览器经过优化,可以从字符串呈现DOM树

在您的情况下,setInnerHTML可能只有在尝试同时删除多个节点时才有用。如果您只删除了一个节点,那么您就陷入了困境——请尽量保持DOM的小规模


希望这能有所帮助。

我发现最有效的方法是设置不透明度:0,这有点奇怪,但我想这是因为这是硬件加速的。我要试试看!将“不透明度”(opacity)设置为0很快,因为所有维度都是相同的,所以您可以绕过页面的回流。考虑到保持周围的元素仍然会减缓任何未来的操作。但如果你不需要担心未来的操纵,那么很好。。。不透明度是一个很好的解决方案!我发现最有效的方法是设置不透明度:0,这有点奇怪,但我想这是因为这是硬件加速的。我要试试看!将“不透明度”(opacity)设置为0很快,因为所有维度都是相同的,所以您可以绕过页面的回流。考虑到保持周围的元素仍然会减缓任何未来的操作。但如果你不需要担心未来的操纵,那么很好。。。不透明度是一个很好的解决方案!