0

手がかりのツールチップがアタッチされているアンカーを動的に削除および追加するWebアプリのメモリリークを追跡してきましたが、手がかりのツールチップをノードに接続する手がかりのメインクロージャーに問題を絞り込んだ可能性があります(32行目)。 :var link = this、$ this = $(this);)。

私はSIEVで次のスクリプトを実行しており、jquery 1.3.2の修正バージョンを使用して、手がかり要素を削除できるようにする次の修正を加えています。ただし、手がかりノードが削除された後もアンカーノードへの参照が1つあるため、アンカーノードは孤立しますか?

テスト目的で、手がかりのソースの32行目を次のように変更した場合:var link = $('br')、$ this = $('br');

アンカーは解放されますが、「br」ノードが構築され始めます。

したがって、この問題を回避する方法を誰かが知っているかどうか疑問に思いましたか?または、単にリソースを正しく解放していない場合はどうなりますか?

添付のスクリプトとソース:

jQueryの変更。1247行目以降、中括弧を閉じる前に次を挿入します(http://markmail.org/message/cfi4bvfjc3m6ww6k#query:jquery%20memory%20leak%20in%20remove%20and%20empty+page:1+mid:tapc7zt3cwl6rw4f+state:結果):

this.outerHTML = "";

スクリプト例:

<html> 
<head> 
    <link rel="stylesheet" type="text/css" href="jquery.cluetip.css"/> 


    <script type="text/javascript" src="jquery-1.3.2.js"></script> 
    <script type="text/javascript" src="jquery.cluetip.js"></script> 


    <script type="text/javascript"> 
            $(document).ready(function() { 
                    setInterval(resetCluetip, 1000); 
            }); 


            function resetCluetip() { 
                    $('a').each(function() { 
                            $(this).cluetip('destroy'); 
                            $(this).unbind().remove(); 
                    }); 


                    $('#cluetip*').unbind().empty(); 


                    $('body').html('<a href="#" class="contextMenu" title="title|body">anchor one</a><br>'); 


                    $('a').each(function() { 
                            $(this).cluetip({splitTitle: '|'}); 
                    }); 
            } 
    </script>
</head>
<body>
</body>
</html> 
4

1 に答える 1

1

だからここにいくつかのコメントがあります:

  • まず、このスクリプトが行うことは私には意味がありません... 手がかりのヒントとページのコンテンツを毎秒リセットします。ajaxCache: falseajax経由で更新を取得している場合は、タイトル属性を新しい情報で更新してから、手がかりヒントを更新するか、手がかりヒント属性を設定しないのはなぜですか?
  • オブジェクトで使用.remove()すると、DOM からオブジェクトが削除され、参照のバインドも解除されるため、.unbind().remove();またはを使用する必要はありません。.unbind().empty();
  • ワイルドカードはこのように ID では機能しません$('#cluetip*')。これを行うためのより良い方法は、このようなセレクター属性フィルターを使用することです$('div[id*="cluetip"]')
  • メモリリークを再現できませんでした。
于 2009-10-26T09:24:50.263 に答える