ASP.NET DataView使用SSE返回ID高亮指定记录失效如何解决
问题根因
- 未将DOM操作逻辑放在SSE的
onmessage异步回调中:EventSource初始化后不会立刻拿到服务端返回数据,你直接写在初始化后的代码会同步立即执行,此时event对象还未生成,自然拿不到有效值。 event.data携带多余不可见字符:PHP返回数据时自带尾随空格、换行符,文本文件本身也存在末尾换行,导致你拿到的字符串看起来和手动赋值的row_112.00一致,实际多了空白字符,:contains选择器无法匹配。- 方法名拼写错误:滚动方法正确写法为
scrollIntoView(),你写的全小写scrollintoview()会直接抛出语法错误,中断后续逻辑执行。
修复后的完整代码
if (typeof EventSource !== "undefined") { const source = new EventSource("/dataPush/dataOrderPush.php"); // 监听message事件,收到服务端推送后再执行操作 source.onmessage = function(event) { // 去除字符串首尾所有空格、换行、回车等不可见字符 const findThisLine = event.data.trim(); // 缓存匹配到的节点,避免重复查询DOM const targetLi = $(`#ListView1_cmrUL li:contains("${findThisLine}")`); // 匹配到节点再执行操作,避免空节点报错 if (targetLi.length) { targetLi.scrollIntoView(); $('#ListView1_cmrUL li').removeClass('active'); targetLi.addClass('active'); } }; // 可选:添加错误监听方便排查连接问题 source.onerror = function(error) { console.error("SSE连接异常:", error); }; }
优化建议
- 推荐不要用
:contains做匹配,你可以给每个li节点添加data-row-id自定义属性存储对应行ID,匹配时使用$(#ListView1_cmrUL li[data-row-id="${findThisLine}"]),不会出现文本包含的误匹配问题,查询性能也更高。 - 服务端PHP输出前可以先处理掉多余字符:
echo "data: " . trim($metaOrderInfo) . "\n\n";,进一步避免空白字符干扰。
内容的提问来源于stack exchange,提问作者Santana John
相关产品推荐
相关产品推荐

