Создание строк таблицы DOM и вставка для повышения эффективности - PullRequest
1 голос
/ 19 апреля 2019

Я пытаюсь преобразовать некоторые рабочие программы в HTA из Excel, чтобы использовать преимущества графического интерфейса браузера и скорость работы JavaScript по сравнению с VBA. Мой первый тест - добавить таблицу в мой HTML. Однако выполнение около 1000 строк, кажется, занимает около 30 секунд, что кажется много, учитывая, что из-за этого окно браузера HTA перестает отвечать на запросы в течение 30 секунд. Из моих исследований здесь кажется, что мне нужно сделать создание строк, а затем добавить таблицу сразу, чтобы уменьшить количество повторений в DOM. У меня проблемы с этим. Вот код, который у меня есть:

function myFunction() {
var today = new Date();
var t0 =  today.getSeconds();
var connection = new ActiveXObject("ADODB.Connection") ;
var table = document.getElementById("myTable");

var connectionstring="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=dbPATH\\test.accdb;Jet OLEDB:Engine Type=5;Persist Security Info=False;Mode=Share Exclusive;"

connection.Open(connectionstring);
var rs = new ActiveXObject("ADODB.Recordset");

rs.Open("SELECT * FROM TABLE1", connection);
rs.MoveFirst

while(!rs.eof)
{
    var row = table.insertRow(1);

    var cell1 = row.insertCell(0);
    var cell2 = row.insertCell(1);
    var cell3 = row.insertCell(2);
    cell1.innerHTML = rs.fields(1);
    cell2.innerHTML = rs.fields(2);
    cell3.innerHTML = rs.fields(3);
    rs.movenext;
}

rs.close;
connection.close; 
var today2 = new Date();
var t1 =  today2.getSeconds();
alert(t1-t0);
}

* Edit: Я подумала, что попытаюсь обновить свой код, добавив DOM только один раз, но мой код все еще занимает много времени, чтобы он не отвечал, но я думаю, что он немного лучше. Я знаю, что это не может быть циклический переход через ado, потому что если я только циклический переход и не пытаюсь что-либо записать на экран, программа завершает создание переменной htmlSTR менее чем за секунду. Так что .after, который слишком медленный.

function myFunction() {
var today = new Date();
var t0 =  today.getSeconds();
var connection = new ActiveXObject("ADODB.Connection") ;
var table = document.getElementById("myTable");
var htmlSTR;
var connectionstring="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=dbPATH\\test.accdb;Jet OLEDB:Engine Type=5;Persist Security Info=False;Mode=Share Exclusive;"

connection.Open(connectionstring);
var rs = new ActiveXObject("ADODB.Recordset");

rs.Open("SELECT * FROM TABLE1", connection);
rs.MoveFirst

while(!rs.eof)
{
htmlSTR = htmlSTR + '<tr><td>' + rs.fields(1) + '</td>'
    + '<td>' + rs.fields(2) + '</td>'
    + '<td>' + rs.fields(3) + '</td></tr>'
rs.movenext;
}

$('#myTable tr:last').after(htmlSTR);


rs.close;
connection.close; 
var today2 = new Date();
var t1 =  today2.getSeconds();
alert(t1-t0);
}

1 Ответ

1 голос
/ 19 апреля 2019

Насколько я понимаю, настоящей проблемой может быть запрос, а не манипулирование DOM.

Альтернативным элегантным решением будет использование GetString, которое исключит цикл whileв целом;

recordset.GetString(,,"</td><td>","</td></tr><tr><td>","&nbsp;");
...