Morning all,
I use HTAs at my company as they are quick, dirty, and easy to understand for anyone else needing to make tweaks when required (and I prefer NP++ to any other code environment I've used thus far, but no compiler).
I've made a HTA (based on IE9 but tested in IE11 also as they are comapny standard) to display some internal data to another department, this data will be updated sporadically throughout the day as and when required. This data is created in a local text file and imported using ActiveXObject XMLHttp or XMLHttpRequest where available. The issue is that when the table is updated, it leaks a little bit of memory each time.
I originally thought it was the XML request that was leaking, but I've pinned it down to when the table is actually updated.
Code is as follows:
// Create the object arrays
var vData={}, vObject={}, vMethod={}, vEvent={};
// Function to update the table
vMethod.updateTable = function() {
vData.fileName = 'out_comm/Data.txt';
vData.fileText = '';
try {
vObject.rawFile = new XMLHttpRequest();
vObject.rawFile.open('GET', vData.fileName, false);
vObject.rawFile.onreadystatechange = function() {
if (vObject.rawFile.readyState === 4) {
if (vObject.rawFile.status === 200 || vObject.rawFile.status === 0) {
vData.fileText = vObject.rawFile.responseText;
}
}
};
vObject.rawFile.send();
} catch (e) {
try {
vObject.rawFile = new ActiveXObject('Microsoft.XMLHTTP');
vObject.rawFile.open('GET', vData.fileName, false);
vObject.rawFile.onreadystatechange = function() {
if (vObject.rawFile.readyState === 4) {
if (vObject.rawFile.status === 200 || vObject.rawFile.status === 0) {
vData.fileText = vObject.rawFile.responseText;
}
}
};
vObject.rawFile.send();
} catch (e) {
alert('Error: ' + e.getMessage());
}
}
delete vObject.rawFile;
vData.tableHTML = '';
vData.BlockCount = 0;
vData.BlockNum = 1;
vData.BlockLetter = 'A';
vData.rowEven = true;
vData.fileTextSplit = vData.fileText.split('\n');
vData.tableHTML = '<table id="dataTable" cellspacing="0"><thead><tr><th></th><th></th><th></th><th></th>';
vData.tableHTML = vData.tableHTML + '<th>5</th><th>4</th><th>3</th><th>2</th><th>1</th>';
vData.tableHTML = vData.tableHTML + '<th>5</th><th>4</th><th>3</th><th>2</th><th>1</th>';
vData.tableHTML = vData.tableHTML + '<th>5</th><th>4</th><th>3</th><th>2</th><th>1</th>';
vData.tableHTML = vData.tableHTML + '<th>5</th><th>4</th><th>3</th><th>2</th><th>1</th>';
vData.tableHTML = vData.tableHTML + '</tr></thead><tbody>';
for (vData.arrayCount = 0;vData.arrayCount < vData.fileTextSplit.length; vData.arrayCount++) {
if (vData.fileTextSplit[vData.arrayCount] !== '') {
vData.fileTextLineSplit = vData.fileTextSplit[vData.arrayCount].split(',');
if (vData.BlockCount == 4) {
vData.BlockCount = 0;
if (vData.rowEven) {
vData.rowEven = false;
} else {
vData.rowEven = true;
}
}
if (vData.rowEven) {
vData.tableHTML = vData.tableHTML + '<tr id="item_' + vData.arrayCount + '" class="even">';
} else {
vData.tableHTML = vData.tableHTML + '<tr id="item_' + vData.arrayCount + '">';
}
vData.BlockCount ++;
vData.tableHTML = vData.tableHTML + '<td>' + vData.fileTextLineSplit[0].substring(6, 8) + '/' + vData.fileTextLineSplit[0].substring(4, 6) + '</td>';
vData.tableHTML = vData.tableHTML + '<td>1A</td>';
vData.tableHTML = vData.tableHTML + '<td>01</td>';
vData.tableHTML = vData.tableHTML + '<td>' + vData.fileTextLineSplit[1] + '</td>';
vData.tableHTML = vData.tableHTML + '<td class="split">' + vData.fileTextLineSplit[2] + '</td>';
vData.tableHTML = vData.tableHTML + '<td>' + vData.fileTextLineSplit[3] + '</td>';
vData.tableHTML = vData.tableHTML + '<td>' + vData.fileTextLineSplit[4] + '</td>';
vData.tableHTML = vData.tableHTML + '<td>' + vData.fileTextLineSplit[5] + '</td>';
vData.tableHTML = vData.tableHTML + '<td>' + vData.fileTextLineSplit[6] + '</td>';
vData.tableHTML = vData.tableHTML + '<td>' + vData.fileTextLineSplit[7] + '</td>';
vData.tableHTML = vData.tableHTML + '<td>' + vData.fileTextLineSplit[8] + '</td>';
vData.tableHTML = vData.tableHTML + '<td>' + vData.fileTextLineSplit[9] + '</td>';
vData.tableHTML = vData.tableHTML + '<td>' + vData.fileTextLineSplit[10] + '</td>';
vData.tableHTML = vData.tableHTML + '<td>' + vData.fileTextLineSplit[11] + '</td>';
vData.tableHTML = vData.tableHTML + '<td class="split">£0</td>';
vData.tableHTML = vData.tableHTML + '<td>£0</td>';
vData.tableHTML = vData.tableHTML + '<td>£0</td>';
vData.tableHTML = vData.tableHTML + '<td>£0</td>';
vData.tableHTML = vData.tableHTML + '<td>£0</td>';
vData.tableHTML = vData.tableHTML + '<td>£0</td>';
vData.tableHTML = vData.tableHTML + '<td>£0</td>';
vData.tableHTML = vData.tableHTML + '<td>£0</td>';
vData.tableHTML = vData.tableHTML + '<td>£0</td>';
vData.tableHTML = vData.tableHTML + '<td>£0</td>';
vData.tableHTML = vData.tableHTML + '</tr>';
}
}
vData.tableHTML = vData.tableHTML + '</tbody></table>';
document.getElementById("dataTableDiv").innerHTML = '';
document.getElementById("dataTableDiv").innerHTML = vData.tableHTML;
delete vData.fileName;
delete vData.tableHTML;
delete vData.fileTextLineSplit;
delete vData.rowEven;
delete vData.fileTextSplit;
delete vData.fileText;
delete vData.BlockCount;
delete vData.BlockNum;
delete vData.BlockLetter;
delete vObject.rawFile;
delete vData.arrayCount;
};
I have tried using pure javascript, jquery, and a combination of the two to clear out the table and reimport the data with no reduction in memory usage.
I'm still learning and so not especially versed with Java so I may be missing something simple. I've seen many forums (old but relevant) which state that tables in IE have always been a bit iffy, but nothing recent and no actual solutions. It may be that it's the HTA environment which is causing the issue, but I've no way of proving it as everything is offline so I can't perform a local XML in IE due to security restrictions.
Any help would be greatly appreciated
Edit
Just a quick edit; I have tried making use of JQuerys .remove() and.empty() function also but to no avail. The reason I am setting the variables to object arrays (I think that terminology is correct) is that I am able to use the delete function as I assumed it was the variables hogging the memory.