gpt4 book ai didi

javascript - 使用 jQuery 和 Node 在 DOM 上填充数据的最佳方式

转载 作者:搜寻专家 更新时间:2023-10-31 23:00:54 24 4
gpt4 key购买 nike

我正在使用 Node 的 Socket.io 将数据从服务器推送到客户端浏览器。在客户端上,我使用 jQuery 填充 DOM 中返回的行。

下面是我用来填充 Socket.io 返回的数据的代码片段。

var OverSpeedAlerts = [];
var TripCancellation = [];
var GeofenceInOutAlerts = [];
var ScheduleOverstay = [];
var UnSchduledOverstay = [];
var SkippedBusStop = [];
var TripDelayAlert = [];

var SkippedUnplannedAlert = [];
var DelayStartEndAlert = [];
var RouteDeviatedAlert = [];

var MultipleBusEntry = [];

声明原型(prototype):

Array.prototype.inArray = function (comparer) {
for (var i = 0; i < this.length; i++) {
if (comparer(this[i])) return true;
}
return false;
};

// adds an element to the array if it does not already exist using a comparer
// function
Array.prototype.pushIfNotExist = function (element, comparer) {
if (!this.inArray(comparer)) {
this.unshift(element);
}
};

处理从套接字接收到的数据:

if (typeof io !== 'undefined') {
var pushServer = io.connect('http://SomeIP:3000');
pushServer.on('entrance', function (data) {
var rows = data.message;
var NumberOfRows = rows.length;
$('#notifications').html(NumberOfRows);
// console.log(rows);
OverSpeedAlerts = [];
TripCancellation = [];
GeofenceInOutAlerts = [];
ScheduleOverstay = [];
UnSchduledOverstay = [];
SkippedBusStop = [];
TripDelayAlert = [];

SkippedUnplannedAlert = [];
DelayStartEndAlert = [];
RouteDeviatedAlert = [];

var MultipleBusEntry = [];
for (var i = 0; i < rows.length; i++) {
if (rows[i].alert_type == 'overspeed') {
OverSpeedAlerts.pushIfNotExist(rows[i], function (e) {
return e.device_id === rows[i].device_id && e.alert_gen_date_time === rows[i].alert_gen_date_time;
});
}
else if (rows[i].alert_type == 'trip_cancellation') {
TripCancellation.pushIfNotExist(rows[i], function (e) {
return e.device_id === rows[i].device_id && e.alert_gen_date_time === rows[i].alert_gen_date_time;
});
}
else if (rows[i].alert_type == 'Geofence-In' || rows[i].alert_type === 'Geofence-Out') {
GeofenceInOutAlerts.pushIfNotExist(rows[i], function (e) {
return e.device_id === rows[i].device_id && e.alert_gen_date_time === rows[i].alert_gen_date_time;
});
}
else if (rows[i].alert_type == 'Scheduled-Overstay') {
ScheduleOverstay.pushIfNotExist(rows[i], function (e) {
return e.device_id === rows[i].device_id && e.alert_gen_date_time === rows[i].alert_gen_date_time;
});
}
else if (rows[i].alert_type == 'Unscheduled-Overstay') {
UnSchduledOverstay.pushIfNotExist(rows[i], function (e) {
return e.device_id === rows[i].device_id && e.alert_gen_date_time === rows[i].alert_gen_date_time;
});
}
else if (rows[i].alert_type == 'Skipped Unplanned' || rows[i].alert_type == 'Skipped-Busstop') {
SkippedBusStop.pushIfNotExist(rows[i], function (e) {
return e.device_id === rows[i].device_id && e.alert_gen_date_time === rows[i].alert_gen_date_time;
});
}
else if (rows[i].alert_type == 'Delay Start' || rows[i].alert_type == 'Delay End') {
TripDelayAlert.pushIfNotExist(rows[i], function (e) {
return e.device_id === rows[i].device_id && e.alert_gen_date_time === rows[i].alert_gen_date_time;
});
}
else if (rows[i].alert_type == 'Route Deviated') {
RouteDeviatedAlert.pushIfNotExist(rows[i], function (e) {
return e.device_id === rows[i].device_id && e.alert_gen_date_time === rows[i].alert_gen_date_time;
});
}
else if (rows[i].alert_type == 'Multiple Bus Entry') {
MultipleBusEntry.pushIfNotExist(rows[i], function (e) {
return e.device_id === rows[i].device_id && e.alert_gen_date_time === rows[i].alert_gen_date_time;
});
}

}
CreateOverSpeedGrid();
CreateTripCancellation();
CreateGeofenceGrid();
CreateScheduleOverstayGrid();
CreateUnSchduledOverstayGrid();
CreateTripDelayGrid();
CreateSkippedBusStop();
CreateRouteDeviationAlert();
CreateMultipleBusEntry();
});
pushServer.on('end', function (socket) {

});
}

上述功能之一如下。 Rest是DOM其他部分类似的函数填充数据。

function CreateOverSpeedGrid() {
$('#tabs ul').find('a:contains("Overspeed Alerts")').html('OverSpeed Alerts(' + OverSpeedAlerts.length + ')');
if (OverSpeedAlerts.length != 0) {
$('#notifyOverspeed table').html('');
$('#notifyOverspeed table').append('<tr class="ui-widget-header"> <th> Depot </th> <th> Route </th> <th> Schedule </th> <th> Trip Number </th><th>Trip Direction</th> <th> Alert Summary</th> <th> Alert Details </th> <th> Generated On </th> </tr>'); //new Date([UNIX Timestamp] * 1000);
for (var i = 0; i < OverSpeedAlerts.length; i++) {
$('#notifyOverspeed table').append('<tr> <td>' + OverSpeedAlerts[i].depot_name + '</td> <td>' + OverSpeedAlerts[i].route_name + '</td> <td>' + OverSpeedAlerts[i].schedule_no + '</td> <td>' + OverSpeedAlerts[i].trip_number + ' </td> <td>' + OverSpeedAlerts[i].trip_direction + '</td><td> ' + OverSpeedAlerts[i].alert_sub + ' </td> <td title="' + ConvertToValidTooltip(OverSpeedAlerts[i].alert_msg) + '" style="text-decoration:underline;cursor:pointer;"> ' + "Place mouse pointer to view message" + ' </td> <td>' + new Date(OverSpeedAlerts[i].alert_gen_date_time * 1000) + ' </td> </tr>');
}
}
}

上面的代码工作正常。但问题在于,由于每 10 秒从套接字接收到如此多的推送消息,浏览器无法处理如此多的数据并挂断。

有没有更好的方法呢??

最佳答案

我在这段代码中看到了以下问题:

  1. 您通过多次操作文档来更新表格。在一次操作中更新 DOM 性能更好。有一个 Google article对这个。所以像这样:

    function CreateOverSpeedGrid() {
    $('#tabs ul').find('a:contains("Overspeed Alerts")').html('OverSpeed Alerts(' + OverSpeedAlerts.length + ')');
    if (OverSpeedAlerts.length != 0) {
    var html = [];
    html.push('<tr class="ui-widget-header"> <th> Depot </th> <th> Route </th> <th> Schedule </th> <th> Trip Number </th><th>Trip Direction</th> <th> Alert Summary</th> <th> Alert Details </th> <th> Generated On </th> </tr>'); //new Date([UNIX Timestamp] * 1000);
    for (var i = 0; i < OverSpeedAlerts.length; i++) {
    html.push('<tr> <td>' + OverSpeedAlerts[i].depot_name + '</td> <td>' + OverSpeedAlerts[i].route_name + '</td> <td>' + OverSpeedAlerts[i].schedule_no + '</td> <td>' + OverSpeedAlerts[i].trip_number + ' </td> <td>' + OverSpeedAlerts[i].trip_direction + '</td><td> ' + OverSpeedAlerts[i].alert_sub + ' </td> <td title="' + ConvertToValidTooltip(OverSpeedAlerts[i].alert_msg) + '" style="text-decoration:underline;cursor:pointer;"> ' + "Place mouse pointer to view message" + ' </td> <td>' + new Date(OverSpeedAlerts[i].alert_gen_date_time * 1000) + ' </td> </tr>');
    }
    // Change the rows in one operation.
    $('#notifyOverspeed table').html(html.join(''));
    }
    }
  2. 添加到 ArrayinArray 方法必须扫描整个 数组,然后才能确定某个元素不在数组。

    理想情况下,此过滤将在发送端完成。 最好这样。但是,也许您正在使用无法在源头过滤的第三方数据,所以...

    有一种方法可以做得更好。如果顺序很重要,您仍然可以使用数组来存储对象。然后,您可以使用通过 Object.create(null) 创建的对象作为关联数组 来记录您是否看到了某个对象。所以像这样:

    var OverSpeedAlerts = [];
    var OverSpeedAlertsSeen = Object.create(null);

    for (var i = 0; i < rows.length; i++) {
    var row = rows[i];
    var key = row.device_id + row.alert_gen_date_time;

    if (row.alert_type == 'overspeed' && !OverSpeedAlertsSeen[key]) {
    OverSpeedAlertsSeen[key] = true;
    OverSpeedAlerts.push(row);
    }
    }

    我不止一次使用过这种方法,但上面的代码没有经过测试。错别字或脑洞可能潜伏在那里。在此示例中,为所有类型的警报计算一次 key 。查看您的代码,您的所有警报似乎都在 device_idalert_gen_date_time 上进行了比较,因此为数组中的每个项目生成一次 key 是正确的。

    如何生成 key 取决于 row.device_idrow.alert_gen_date_time 的可能值。您可能需要一个分隔符以避免可能的歧义。例如,在我处理的一个案例中,我必须组合字母表中所有字母都有效的值。因此,如果没有分隔符,就无法区分 "ab"+ "cd""a"+ "bcd" 以及 "abc"+ "d “。我使用了一个不能出现在值中的分隔符来构建 key :so "ab@cd", "a@bcd", "abc@d ".

    也可以使用关联数组的关联数组来进行检查,但我不相信它会产生重大的速度改进。这肯定会使代码更加复杂。

我可以想到可以进行其他更改来提高速度,但我认为它们不会带来实质性的 yield 。

关于javascript - 使用 jQuery 和 Node 在 DOM 上填充数据的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21304481/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com