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

Electron中mainWindow.webContents.send未被ipcRenderer.on接收问题

问题描述

点击专科页面的疾病矩阵名称时,预期打开对应专科的疾病展示页,但实际主进程已接收数据,maladie.html页面无变化,控制台无输出,ipcRenderer未接收到主进程发送的dataMaladie数据。

相关代码

index.js

let maladie=document.querySelectorAll('ul li');
maladie.forEach(function(el){
  el.addEventListener('click',function(e){
   let des= PathData.filter(function(ele){
      if(ele.name===el.innerText){
        return ele;
      }
    });
  let dataMaladie=des[0].Diseases;
  
  ipcRenderer.send('openmaladie-page',dataMaladie);
   e.preventDefault();
     });
 });

注:dataMaladie为对应专科的疾病数组,可正常输出

Main.js

ipcMain.on('openmaladie-page',function(e,data){
  console.log(data);
  win.webContents.send("dataMaladie",data);
  creatWindow('maladie.html');
});

maladie.js

const {ipcRenderer} =require('electron');

ipcRenderer.on('dataMaladie',function(e,data){
    console.log(data);
    let con=document.querySelector('#Diseases');
    for(let i=0; i<data.length;i++){
        let li=` <li class="col-3 patho ">
        <a href="#">
                <span class="ml-4 ">${data[i]}</span>
        </a>    
     </li>`;
     con.append(li);
    }
});
问题分析与解决方案

1. IPC消息发送时机错误

当前主进程先向旧窗口(win对应的窗口)发送消息,再创建新窗口,此时新窗口尚未完成初始化,根本无法接收消息。需要等待新窗口加载完成后,向其webContents发送数据。

修改Main.js代码:

// 定义变量存储新窗口实例
let maladieWindow = null;

ipcMain.on('openmaladie-page',function(e,data){
  console.log(data);
  // 创建新窗口并保存实例
  maladieWindow = creatWindow('maladie.html');
  // 监听新窗口页面加载完成事件
  maladieWindow.webContents.on('did-finish-load', () => {
    // 向新窗口发送数据
    maladieWindow.webContents.send("dataMaladie", data);
  });
});

注:需确保creatWindow函数返回创建的窗口实例,若原函数未返回,可修改如下:

function creatWindow(htmlPath) {
  let win = new BrowserWindow({
    // 窗口配置参数
    webPreferences: {
      nodeIntegration: true,
      contextIsolation: false // 根据Electron版本调整,确保可正常使用ipcRenderer
    }
  });
  win.loadFile(htmlPath);
  return win;
}

2. 页面DOM渲染方式错误

maladie.js中使用con.append(li)时,li是字符串格式,append方法会将其当作纯文本节点插入,不会解析为HTML元素。需改用innerHTML拼接或创建DOM元素后插入。

修改maladie.js代码(innerHTML方式):

const {ipcRenderer} =require('electron');

ipcRenderer.on('dataMaladie',function(e,data){
    console.log(data);
    let con=document.querySelector('#Diseases');
    // 清空容器(避免重复添加内容)
    con.innerHTML = '';
    let liHtml = '';
    for(let i=0; i<data.length;i++){
        liHtml += ` <li class="col-3 patho ">
        <a href="#">
                <span class="ml-4 ">${data[i]}</span>
        </a>    
     </li>`;
    }
    // 一次性插入HTML内容
    con.innerHTML = liHtml;
});

或更安全的DOM元素创建方式(避免XSS风险):

const {ipcRenderer} =require('electron');

ipcRenderer.on('dataMaladie',function(e,data){
    console.log(data);
    let con=document.querySelector('#Diseases');
    con.innerHTML = ''; // 清空容器
    data.forEach(disease => {
        const li = document.createElement('li');
        li.className = 'col-3 patho';
        const a = document.createElement('a');
        a.href = '#';
        const span = document.createElement('span');
        span.className = 'ml-4';
        span.textContent = disease;
        a.appendChild(span);
        li.appendChild(a);
        con.appendChild(li);
    });
});

内容的提问来源于stack exchange,提问作者Mohamed Lamin Mahmoudi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 04:45:34