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

WordPress Elementor环境运行JS级联计算器报TypeError null对象错误

问题根因

你遇到的TypeError: null is not an object (evaluating 'document.getElementById(actieveLijst).style')报错,本质是代码尝试操作不存在的DOM元素,在WordPress+Elementor环境下通常由以下几个原因触发:

  • 下拉框默认选项未设空值:你代码里第一个下拉框的默认选项没有配置value属性,当用户未选择具体石材分类、或者回退到默认选项时,steenType会取到选项的文本值Kies een steen,拼接出来的actieveLijst为Kies een steenSelector,页面上不存在对应ID的元素,直接操作style属性就会报错。
  • JS加载顺序错误:Elementor渲染页面时会对插入的代码做延迟加载处理,如果你把JS代码放在HTML结构之前,或者单独放到了主题的全局JS配置里,JS执行时对应的DOM元素还没渲染完成,getElementById就会返回null。
  • ID冲突被修改:如果你的页面上已有其他元素用了相同的ID,WordPress或Elementor渲染时会自动给重复ID加后缀,导致代码中写的ID和实际渲染的ID不匹配。
修复方案

按照以下步骤修改代码即可解决问题:

  1. 先给第一个下拉框的默认选项加空value,同时给JS逻辑加空值判断,避免处理无效的选项值
  2. 用DOMContentLoaded包裹所有JS逻辑,确保DOM完全加载后再执行代码
  3. 所有DOM操作前都先判断元素是否存在,避免报错
  4. 把修改后的完整代码直接放到Elementor的「自定义HTML」组件中,不要拆分HTML和JS单独部署

修复后的完整代码

<!DOCTYPE html>
<html lang="nl">
<head>
  <meta charset="UTF-8">
</head>
<body>
<h3>Stenencalculator voor snelbouw en lijmblokken</h3>
<div style="overflow-x:auto;">
  <table id='worksheet_table' class="table table-striped">
    <thead>
    <tr>
      <th>Kies een steen</th>
      <th>Kies de afmeting</th>
      <th>Aantal vierkante meter</th>
    </tr>
    </thead>
    <tbody>
    <tr>
      <td>
        <select onchange="typeGekozen()" id="steenSelector" name="steen">
          <option selected="selected" value="">Kies een steen</option>
          <option value="snelbouw">Snelbouw</option>
          <option value="betonblok">Betonblok</option>
          <option value="lijmblok">Lijmblok</option>
          <option value="gevelsteen">Gevelsteen</option>
        </select>
      </td>
      <td>
        <select onchange="afmetingenGekozen()" id="snelbouwSelector" style="display: none" name="afmeting snelbouw">
          <option selected="selected">Kies een afmeting</option>
          <option value="33">29x9x9</option>
          <option value="33">29x14x9</option>
          <option value="33">29x19x9</option>
          <option value="22">29x9x14</option>
          <option value="22">29x14x14</option>
          <option value="22">29x19x14</option>
          <option value="16.7">29x9x19</option>
          <option value="16.7">29x14x19</option>
          <option value="16.7">29x19x19</option>
        </select>
        <select onchange="afmetingenGekozen()" id="betonblokSelector" style="display: none" name="afmeting betonblok">
          <option selected="selected">Kies een afmeting</option>
          <option value="12.5">39x14x19</option>
          <option value="12.5">39x19x19</option>
          <option value="12.5">39x29x19</option>
          <option value="22">29x9x14</option>
          <option value="22">29x14x14</option>
          <option value="16.7">29x14x19</option>
          <option value="16.7">29x19x19</option>
          <option value="12.5">39x9x19</option>
          <option value="12.5">39x14x19</option>
          <option value="12.5">39x19x19</option>
        </select>
        <select onchange="afmetingenGekozen()" id="lijmblokSelector" style="display: none" name="afmeting lijmblok">
          <option selected="selected">Kies een afmeting</option>
          <option value="12.5">39x14x19</option>
          <option value="12.5">39x19x19</option>
          <option value="12.5">39x29x19</option>
          <option value="22">29x9x14</option>
          <option value="22">29x14x14</option>
          <option value="16.7">29x14x19</option>
          <option value="16.7">29x19x19</option>
          <option value="12.5">39x9x19</option>
          <option value="12.5">39x14x19</option>
          <option value="12.5">39x19x19</option>
        </select>
        <select onchange="afmetingenGekozen()" id="gevelsteenSelector" style="display: none" name="afmeting gevelsteen">
          <option selected="selected">Kies een afmeting</option>
          <option value="83"> Traditioneel - M50 190x90x50</option>
          <option value="67"> Traditioneel - M65 190x90x65</option>
          <option value="72"> Traditioneel - WF 290x100x50</option>
          <option value="58"> Traditioneel - DF 210x100x65</option>
          <option value="83"> Traditioneel - HF 228x90x40</option>
          <option value="76"> Traditioneel - LF40 240x90x40</option>
          <option value="48"> Traditioneel - NF 249x115x71</option>
          <option value="60"> Traditioneel - XL45 290x65x45</option>
          <option value="91"> Dunbed - M50 190x90x50</option>
          <option value="76"> Dunbed - M65 190x90x65</option>
          <option value="83"> Dunbed - WF 290x100x50</option>
          <option value="65"> Dunbed - DF 210x100x65</option>
          <option value="93"> Dunbed - HF 228x90x40</option>
          <option value="88"> Dunbed - LF40 240x90x40</option>
          <option value="53"> Dunbed - NF 249x115x71</option>
          <option value="66"> Dunbed - XL45 290x65x45</option>
          <option value="95"> Verlijmd - M50 190x90x50</option>
          <option value="78"> Verlijmd - M65 190x90x65</option>
          <option value="86"> Verlijmd - WF 290x100x50</option>
          <option value="68"> Verlijmd - DF 210x100x65</option>
          <option value="98"> Verlijmd - HF 228x90x40</option>
          <option value="93"> Verlijmd - LF40 240x90x40</option>
          <option value="55"> Verlijmd - NF 249x115x71</option>
          <option value="69"> Dunbed - XL45 290x65x45</option>
        </select>
      </td>
      <td>
        <input type="number" min="0" name="oppervlakte" id="oppervlakte" class="form-control" onkeyup="berekenOppervlakte()" onchange="berekenOppervlakte()"/>
      </td>
    </tr>
    </tbody>
  </table>
</div>
<div style="overflow-x:auto;">
  <table id='resultStenen' class="table table-striped">
    <thead>
    <tr>
      <th>Aantal Stenen</th>
    </tr>
    </thead>
    <tbody>
    <tr>
      <td name="Aantal Stenen" id="totaal"></td>
    </tr>
    </tbody>
  </table>
</div>
<script>
document.addEventListener('DOMContentLoaded', function() {
  var actieveLijst;
  var aantalStenenPerM2;

  function verbergAlleSteenMaten() {
    const selectors = ["snelbouwSelector", "betonblokSelector", "lijmblokSelector", "gevelsteenSelector"];
    selectors.forEach(id => {
      const el = document.getElementById(id);
      if (el) el.style.display = "none";
    })
  }

  window.typeGekozen = function() {
    const steenType = document.getElementById("steenSelector").value;
    if (!steenType) {
      verbergAlleSteenMaten();
      actieveLijst = null;
      return;
    }
    actieveLijst = steenType + "Selector";
    verbergAlleSteenMaten();
    const targetEl = document.getElementById(actieveLijst);
    if (targetEl) targetEl.style.display = "block";
  }

  window.afmetingenGekozen = function() {
    if (!actieveLijst) return;
    const select = document.getElementById(actieveLijst);
    if (select) {
      aantalStenenPerM2 = Number(select.options[select.selectedIndex].value);
    }
  }

  window.berekenOppervlakte = function() {
    const oppervlakteEl = document.getElementById('oppervlakte');
    const totaalEl = document.getElementById('totaal');
    if (!oppervlakteEl || !totaalEl || !aantalStenenPerM2) return;
    const oppervlakte = Number(oppervlakteEl.value);
    const totaalAantal = aantalStenenPerM2 * oppervlakte;
    totaalEl.innerHTML = totaalAantal + " stenen";
  }
})
</script>
</body>
</html>

额外验证步骤

如果部署后仍然报错,打开浏览器控制台输入document.getElementById("snelbouwSelector"),如果返回null说明ID被Elementor自动修改,你可以把所有ID改成更独特的命名(比如加上calc_前缀,改为calc_snelbouwSelector),避免和页面其他元素ID冲突即可。

内容的提问来源于stack exchange,提问作者Borremans Matthias

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 10:36:10