Утечка памяти IE9 для динамических объектов DOM с атрибутом ID

Я заметил, что присвоение атрибуту ID значения динамически создаваемых объектов DOM приводит к утечке памяти в IE9. Кто-нибудь еще сталкивался с этим и, что более важно, знает какие-либо обходные пути? Не протекает в других браузерах, даже IE6 проходит!

Демонстрация кода утечки:

Он просто непрерывно добавляет и удаляет строки из таблицы и присваивает каждой строке идентификатор, который будет использоваться для последующего поиска.

Никакой утечки не происходит без "row.id = eid;"

    <html>
    <head>
        <script type="text/javascript">

        function addRow(tbl, index) {
            var row = tbl.insertRow(index);
            var eid = "loongrowid" + count;
            row.id = eid;

            for (var i = 0; i < 9; i++) {
                row.insertCell(i);
            }

            return row;
        }

        function removeTableRow(tbl, index) {
            var row = tbl.rows[index];
            tbl.deleteRow( index );

        }

        var count = 1;

        function fillRow(row){
            row.cells[0].innerHTML = '<input type="checkbox"' + ' checked="checked"' + ' />';
            for (var i = 1; i < 9; i++) { 
                row.cells[i].innerHTML = count + " c";
            }
            ++count;
        }

        var added = false;

        function dostuff() 
        {
            var tbl = document.getElementById("tbl");
            var i;

            if (added)
            {
                for (i = 0; i < 20; ++i)
                {
                    removeTableRow(tbl,1);
                }
            }
            else
            {
                for (i = 0; i < 20; ++i)
                {
                    var row = addRow(tbl, i+1);
                    fillRow(row);
                }
            }

            added = !added;
            setTimeout(dostuff, 1); 
        }
        </script>
    </head>
    <body onload="setTimeout(dostuff, 1)">
    <h1 id="count">TESTING</h1>
    <table id="tbl" style="width:100%;">    
    <tr>
        <th>selected</th>
        <th>date</th>
        <th>time</th>
        <th>place</th>
        <th>device</th>
        <th>text</th>
        <th>state</th>          
        <th>status</th>
        <th>quality</th>
    </tr>
    </table>
    </body>
</html>

Я заметил, что удаление всех ячеек из строки таблицы приводит к уменьшению утечки памяти, поэтому я предполагаю, что IE удерживает строку после ее удаления из Таблица.

Я также пробовал обходной путь, который добавил созданные строки таблицы в объект Javascript, который будет использоваться в качестве хеш-таблицы, вместо того, чтобы полагаться на getElementById (row.id), но это тоже просочилось по какой-то причине, которую я не вижу.

var hash = [];

    // when creating row
    row.extid = eid; // Note: this by itself causes no leak
hash[eid] = row; 

    // when removing row
delete hash[row.extid]; 
6
задан Niklas Bäckman 7 February 2012 в 12:32
поделиться