I have a large DOM with a pre
element containing thousands of span
nodes with X different name
attributes. Upon a user action, I'm changing the style(style.display
) X-1 name
attributes to none
. The node count of unchanged name
attribute is over 1000. But after performing this operation, the page is displaying only a couple of hundreds of unchanged instead of all.
Note: I don't see any issue when node count is low.
function filters() {
var nameElement = document.getElementsByName('filterType');
let selectedFiltersList = [];
if (nameElement.length > 0) {
for (let i = 0; i < nameElement.length; i++) {
if (nameElement[i].checked) {
selectedFiltersList.push(nameElement[i].defaultValue);
}
}
}
if (selectedFiltersList.length > 0) {
const allFilters = ["Warning", "Error", "State"];
const unSelectedFilters = allFilters.filter(
val => !selectedFiltersList.includes(val),
);
unSelectedFilters.forEach(name => {
let nameArray = document.getElementsByName(name);
if (
nameArray &&
nameArray.length > 0 &&
nameArray[0].style.display !== 'none'
) {
nameArray.forEach(elem => (elem.style.display = 'none'));
}
});
}
}
<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8" />
<title>Viewer</title>
<link rel="stylesheet" href="../css/view.css" />
</head>
<body>
<div class="header">
<div class="filters" onclick="filters()">
<input type="checkbox" name="filterType" value="Warning" />
Warning
<input type="checkbox" name="filterType" value="Severe" />
Severe
<input type="checkbox" name="filterType" value="State" /> State
</div>
</div>
<div class="output">
<pre id="data">
<span class="st" name="State"><a href="#!" title="remove line" id="1" onclick="removeLine(1)">X</a> State ===> hello state
</span>
<span class="wrn" name="Warning"><a href="#!" title="remove line" id="2" onclick="removeLine(2)">X</a> Warn ===> hello warn
</span>
<span class="err" name="Error"><a href="#!" title="remove line" id="3" onclick="removeLine(3)">X</a> Error ===> hello error
</span>
....(// thousands of span elements like above)
</pre>
</div>
</body>
</html>