You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 13:24:01