IE11 appendChild/removeChild 内存泄漏
IE11 appendChild/removeChild memory leak
我遇到了一个问题,我创建了一个网格,该网格通过使用文档片段并在将其附加到 div 之前向其附加元素来动态构建。我注意到 appendChild 和 removeChild 似乎导致内存泄漏。我创建了一个 jsfiddle 来演示这一点。我已确保禁用浏览器的所有插件(我没有太多开始)。如果您打开开发人员工具栏 (F12) 并在单击 运行 的同时分析内存,您会注意到内存会增加。每次单击它时,内存都会增加。就好像垃圾回收从未发生过一样。如果代码有问题,请指出。我也试过在附加变量后将变量的值设置为 null,也试过删除它们,但它们没有区别。
https://jsfiddle.net/k75ypb76/6
html:
<div id="grid">
</div>
<button id="btnRun">
Run
</button>
CSS:
#grid{
height: 250px;
width: 500px;
overflow: scroll;
border: 1px solid #000000;
}
.row{
border: 1px solid #ff0000;
}
.cell{
display: inline-block;
width: 40px;
background-color: #00ff00;
}
JS:
function run(){
var grid = document.getElementById('grid');
//create the grid 20 times
for(var i =0; i < 20; i++){
var doc = document.createDocumentFragment();
//clear out the grid
while (grid.firstChild) {
grid.removeChild(grid.firstChild);
}
//create 300 rows
for(var x = 0; x < 300; x++){
var row = document.createElement('div');
row.className = 'row';
//create 10 cells per row
for(var y = 0; y < 10; y++){
var cell = document.createElement('div');
cell.className = 'cell';
cell.textContent = x + '-' + y;
row.appendChild(cell);
}
doc.appendChild(row);
}
grid.appendChild(doc);
}
}
var btnRun = document.getElementById('btnRun');
btnRun.addEventListener('click', run);
谢谢,希望有人能帮助解决这个问题。
当您删除 Child 时,有一个 return 用于未从内存中删除的那个 - 除了 IE 和 EDGE 之外的浏览器似乎足够聪明,可以看到您没有使用 return值,为你清理。
好的,这很有趣。 Windows 7、8、8.1 上的 IE11 中存在拼写检查器的已知问题。在刚刚发布的 12 月 8 日更新中,已经发布了一个修补程序。但是,这显然不适用于 Windows 10。问题仍然存在。我现在得到的修复是编辑注册表:
[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_SPELLCHECKING]
"iexplore.exe"=双字:00000000
希望这对其他人有帮助。
我遇到了一个问题,我创建了一个网格,该网格通过使用文档片段并在将其附加到 div 之前向其附加元素来动态构建。我注意到 appendChild 和 removeChild 似乎导致内存泄漏。我创建了一个 jsfiddle 来演示这一点。我已确保禁用浏览器的所有插件(我没有太多开始)。如果您打开开发人员工具栏 (F12) 并在单击 运行 的同时分析内存,您会注意到内存会增加。每次单击它时,内存都会增加。就好像垃圾回收从未发生过一样。如果代码有问题,请指出。我也试过在附加变量后将变量的值设置为 null,也试过删除它们,但它们没有区别。
https://jsfiddle.net/k75ypb76/6
html:
<div id="grid">
</div>
<button id="btnRun">
Run
</button>
CSS:
#grid{
height: 250px;
width: 500px;
overflow: scroll;
border: 1px solid #000000;
}
.row{
border: 1px solid #ff0000;
}
.cell{
display: inline-block;
width: 40px;
background-color: #00ff00;
}
JS:
function run(){
var grid = document.getElementById('grid');
//create the grid 20 times
for(var i =0; i < 20; i++){
var doc = document.createDocumentFragment();
//clear out the grid
while (grid.firstChild) {
grid.removeChild(grid.firstChild);
}
//create 300 rows
for(var x = 0; x < 300; x++){
var row = document.createElement('div');
row.className = 'row';
//create 10 cells per row
for(var y = 0; y < 10; y++){
var cell = document.createElement('div');
cell.className = 'cell';
cell.textContent = x + '-' + y;
row.appendChild(cell);
}
doc.appendChild(row);
}
grid.appendChild(doc);
}
}
var btnRun = document.getElementById('btnRun');
btnRun.addEventListener('click', run);
谢谢,希望有人能帮助解决这个问题。
当您删除 Child 时,有一个 return 用于未从内存中删除的那个 - 除了 IE 和 EDGE 之外的浏览器似乎足够聪明,可以看到您没有使用 return值,为你清理。
好的,这很有趣。 Windows 7、8、8.1 上的 IE11 中存在拼写检查器的已知问题。在刚刚发布的 12 月 8 日更新中,已经发布了一个修补程序。但是,这显然不适用于 Windows 10。问题仍然存在。我现在得到的修复是编辑注册表:
[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_SPELLCHECKING] "iexplore.exe"=双字:00000000
希望这对其他人有帮助。