1

現在、ページをサーフィンするために UIWebView を使用する iOS アプリを作成しています。を使用して UIWebView の要素を動的に削除する必要がある場合もありますstringByEvaluatingJavaScriptFromString:が、これによりメイン UI がロックされることがあり、第 1 世代の iPod touch では最大 2 秒、iPhone 3GS では 0.5 秒程度かかることがあります。私がそれを削除するために使用している JavaScript は次のとおりです。

element.parentNode.removeChild(element);

それ以上に複雑なことはありません。同時に、OpenGL ES で非常に基本的な 2D レンダリングを行っています。UIWebView の再レンダリングがロックアップしない場合は、メイン スレッドで単純な CoreAnimation を使用します。DOM ツリー、すべての要素の位置などを再計算する必要があるのでしょうか? これは本当にメイン UI スレッドをロックする必要がありますか? 私が呼んでいるのはstringByEvaluatingJavaScriptFromString:、すべてをロックすることですか?これは正常で、この種のハードウェアで予期されることですか? 奇妙なことは、半複雑な MooTools アニメーションを webview でレンダリングし、不透明度と高さを変更できることですが、1 つの要素を削除するのに数秒かかります。

誰かが改善のアイデアを持っていますか? たぶん、使用して要素をvisibility: hidden非表示にする方が良いか、または設定しopacity: 0ますか? 経験からの考えや賢明な言葉はありますか?

4

1 に答える 1

4

DOM ツリーの操作は、すべてのブラウザー、特に iOS Safari で非常に遅くなります。重要な要素は DOM ツリーのサイズです。このため、最善のアドバイスは、削除することです (visibility:hidden は使用しないでください)。

DOM を直接操作するのを避け、代わりに setInnerHTML() を使用することができれば、パフォーマンスが大幅に向上します。100倍の速さで動作するのを見てきました。これは直感に反しますが、大量の文字列操作を行ってからブラウザーに文字列をスローする方がはるかに高速です。これは、ブラウザーが文字列から DOM ツリーをレンダリングするように最適化されているためです。

あなたの場合、 setInnerHTML は、同時に多数のノードを削除しようとしている場合にのみ役立ちます。ノードを 1 つだけ削除する場合は、スタックします。DOM を小さく保つようにしてください。

お役に立てれば。

于 2011-05-03T22:43:19.753 に答える