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

使用jQuery load方法在div中渲染多组件时部分组件无法渲染

问题原因
  • jQuery的.load()方法原生特性:当传入的选择器匹配到多个DOM元素时,仅会对匹配集合的第一个元素执行内容加载,其余匹配元素直接被忽略,这是多个同名class的div无法完成渲染的直接原因。
  • 现有代码将$(document).ready()写在renderComponent函数内部,多次调用函数会重复注册DOM就绪事件回调,当渲染目标数量超过2个时,回调执行时序会出现混乱。
  • 加载的React组件默认会全局查找第一个匹配的挂载节点,若未手动绑定当前加载对应的容器为挂载点,后执行的加载逻辑会覆盖已生成的组件实例;渲染目标越多,挂载冲突概率越高,这就是新增第三个待渲染div后渲染失败的核心原因。
现象对应逻辑
  • 仅使用1个带id的div(选择器匹配唯一元素)+1个带class的div(选择器匹配唯一元素)时,总计2个渲染目标,.load()无需处理多元素场景,组件脚本冲突概率极低,因此表现为渲染正常。
  • 新增第三个渲染目标后,要么触发.load()仅对第一个匹配元素生效的限制,要么出现React组件多实例挂载的全局冲突,直接导致渲染失败。
修复方案

将DOM就绪监听移至外层,遍历所有匹配元素逐个加载,同时给每个容器指定独立挂载点,修正后完整代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8" />
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
  <title>React App</title>
</head>
<body>
  <div class="team-container"></div>
  <div id="a"></div>
  <div id="b"></div>
  <div id="c"></div> 
  <div id="d" class="team"></div>

<script>
// 仅绑定一次DOM就绪事件,避免重复注册导致的时序混乱
$(document).ready(function () {
  function renderComponent(selector){
    // 遍历所有匹配到的容器元素,逐个执行加载
    $(selector).each(function(){
      const $currentContainer = $(this);
      // 给当前容器加唯一标识,避免挂载冲突
      const containerUid = 'render-' + Math.random().toString(36).slice(2, 10);
      $currentContainer.attr('data-uid', containerUid);

      $currentContainer.load("private component url link", function(){
        // 加载完成后手动将组件挂载到当前容器,跳过全局查找挂载点的逻辑
        if (window.React && window.TargetComponent) {
          ReactDOM.render(
            React.createElement(window.TargetComponent),
            $currentContainer[0]
          );
        }
      });
    });
  }

  // 按需调用渲染,支持多同class容器、多id容器同时渲染
  renderComponent("#d")
  renderComponent(".team-container")
  // 新增渲染目标直接调用即可,不会出现冲突
  // renderComponent("#a")
  // renderComponent("#b")
});
</script>  
</body>
</html>

核心修复点:

  • 移除函数内部重复的$(document).ready()绑定,仅在全局初始化时绑定一次,保证回调执行时序稳定
  • 通过.each()遍历选择器匹配的所有元素,逐个执行加载逻辑,解决同名class多元素仅第一个渲染的问题
  • 每个容器加载完成后手动指定自身为React挂载点,避免组件全局查找挂载点导致的实例覆盖问题
  • 若加载的组件自带独立初始化脚本,需修改组件逻辑,将传入的容器节点作为挂载根,不要用全局固定选择器查找挂载点

内容的提问来源于stack exchange,提问作者Dinesh Rajput

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 01:12:31