如何验证并计算 DOM 中 元素组成的数学表达式

落杰酱_8887

落杰酱_8887

2026-07-11

509人浏览

原创

如何验证并计算 DOM 中 <p> 元素组成的数学表达式
元素组成的数学表达式 " />

本文介绍如何安全地提取页面中 内所有 标签的文本内容,拼接为合法数学表达式,并使用 math.js 进行语法校验与求值,避免 eval() 风险。

本文介绍如何安全地提取页面中 `

` 内所有 `

` 标签的文本内容,拼接为合法数学表达式,并使用 `math.js` 进行语法校验与求值,避免 `eval()` 风险。

在构建 Web 计算器时,一个常见需求是:将用户逐次点击输入的符号(数字、运算符、括号等)以

元素形式追加到显示区域(如

ClippingMagic
ClippingMagic

一款专注于自动图片抠图和背景移除的在线编辑工具,可帮助用户快速提取图片主体并完成后续背景处理。

下载
),并在点击 = 时自动识别这些

的组合是否构成有效数学表达式,并返回计算结果

。直接拼接字符串后调用 eval() 存在严重安全风险(XSS)且无法精准报错;而手动实现完整数学表达式解析器则过于复杂。推荐采用成熟数学计算库(如 math.js)进行健壮解析与求值。

✅ 正确实现步骤

  1. 统一运算符表示:HTML 中的 x 和 ÷ 不是 JavaScript/math.js 支持的运算符,需映射为 * 和 /(可通过 data-op 属性或预处理逻辑实现,本例采用简化方式:前端按钮直接使用 * /);
  2. 提取并拼接表达式:使用 Array.from(screen.querySelectorAll('p')).map(p => p.textContent.trim()).join('') 获取所有

    的纯净文本,按顺序连接成单个字符串;

  3. 安全求值与错误捕获:调用 math.evaluate(expression) —— 它能自动校验语法、类型、括号匹配、除零等,并抛出可读性高的错误;
  4. 事件委托优化:将点击监听绑定到
      上,利用 event.target.closest('li') 提升性能与可维护性,避免为每个按钮重复绑定。

? 示例代码(含关键注释)

<script src="https://unpkg.com/mathjs/lib/browser/math.js"></script><div id="calculator">
  <div id="screen"></div>
  <div>
    <ul id="operationMain">
<li class="operatorColor">(</li>
      <li class="operatorColor">)</li>
      <li class="operatorColor">+</li>
      <li class="operatorColor">-</li>
      <li class="operatorColor">*</li>
      <li class="operatorColor">/</li>
      <li class="operatorColor">%</li>
      <li class="operatorColor">.</li>
      <li class="blue">=</li>
      <li>0</li>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
      <li>5</li>
<li>6</li>
<li>7</li>
<li>8</li>
<li>9</li>
<li>00</li>
    </ul>
</div>
</div>
const screen = document.getElementById('screen');
const ul = document.getElementById('operationMain');

// 构建表达式字符串:提取所有 <p> 文本并去除首尾空格
const getExpression = () => {
  return Array.from(screen.querySelectorAll('p'))
    .map(p => p.textContent.trim())
    .filter(text => text !== '') // 过滤空内容(防误操作)
    .join('');
};

// 主逻辑:点击时处理输入或计算
ul.addEventListener('click', (event) => {
  const tgt = event.target.closest('li');
  if (!tgt) return;

  const value = tgt.textContent.trim();

  // 创建新 </p><p> 元素并插入屏幕
  const insert = document.createElement('p');
  insert.textContent = value;
  screen.appendChild(insert);

  // 点击 "=" 时执行计算
  if (value === '=') {
    const expression = getExpression();
    console.log('Evaluating:', expression);

    try {
      const result = math.evaluate(expression);
      // 清空屏幕并显示结果(可选:保留原表达式 + 结果)
      screen.innerHTML = '';
      const resultEl = document.createElement('p');
      resultEl.textContent = `= ${result}`;
      screen.appendChild(resultEl);
    } catch (err) {
      // 友好提示语法错误(如 "Unexpected operator"、"Parentheses not balanced")
      alert(`表达式错误:${err.message}`);
      // 可选:高亮错误位置或清空非法输入
      screen.innerHTML = '</p><p style="color:red">❌ 表达式无效</p>';
    }
  }
});

⚠️ 注意事项与最佳实践

  • 禁止使用 eval():eval() 会执行任意代码,若用户输入恶意脚本(如 alert(1)),将导致 XSS 漏洞;
  • 运算符标准化:若必须保留 x/÷ 显示,建议用 data-op="*" 属性存储真实运算符,textContent 仅用于展示;
  • 空格与连续符号处理:math.js 对空格不敏感,但多个连续运算符(如 ++、2..3)会报错,可在 getExpression() 中加入简单预校验(如正则 /[\+\-\*\/%]{2,}/);
  • 精度与大数:math.js 默认支持高精度计算,如需整数运算可配合 math.round() 或 math.bignumber();
  • 用户体验增强:可添加退格(Backspace)功能、括号自动配对、表达式历史记录等。

通过引入 math.js 并采用事件委托+表达式拼接+异常捕获的组合方案,你既能获得工业级的数学解析能力,又能写出清晰、安全、易维护的计算器逻辑。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
html版权符号
html版权符号

html版权符号是“©”,可以在html源文件中直接输入或者从word中复制粘贴过来,php中文网还为大家带来html的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.14

6255

7

html在线编辑器
html在线编辑器

html在线编辑器是用于在线编辑的工具,编辑的内容是基于HTML的文档。它经常被应用于留言板留言、论坛发贴、Blog编写日志或等需要用户输入普通HTML的地方,是Web应用的常用模块之一。php中文网为大家带来了html在线编辑器的相关教程、以及相关文章等内容,供大家免费下载使用。

2023.06.21

3512

4

html网页制作
html网页制作

html网页制作是指使用超文本标记语言来设计和创建网页的过程,html是一种标记语言,它使用标记来描述文档结构和语义,并定义了网页中的各种元素和内容的呈现方式。本专题为大家提供html网页制作的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.31

3170

5

html空格
html空格

html空格是一种用于在网页中添加间隔和对齐文本的特殊字符,被用于在网页中插入额外的空间,以改变元素之间的排列和对齐方式。本专题为大家提供html空格的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.01

3199

5

html是什么
html是什么

HTML是一种标准标记语言,用于创建和呈现网页的结构和内容,是互联网发展的基石,为网页开发提供了丰富的功能和灵活性。本专题为大家提供html相关的各种文章、以及下载和课程。

2023.08.11

4919

6

html字体大小怎么设置
html字体大小怎么设置

在网页设计中,字体大小的选择是至关重要的。合理的字体大小不仅可以提升网页的可读性,还能够影响用户对网页整体布局的感知。php中文网将介绍一些常用的方法和技巧,帮助您在HTML中设置合适的字体大小。

2023.08.11

3141

3

html转txt
html转txt

html转txt的方法有使用文本编辑器、使用在线转换工具和使用Python编程。本专题为大家提供html转txt相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.31

2949

3

html文本框代码怎么写
html文本框代码怎么写

html文本框代码:1、单行文本框【<input type="text" style="height:..;width:..;" />】;2、多行文本框【textarea style=";height:;"></textare】。

2023.09.01

2608

6

HTML嵌入CSS样式的方法
HTML嵌入CSS样式的方法

HTML嵌入CSS样式的方法有内联样式、内部样式表和外部样式表。本专题为大家提供CSS样式相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.20

2668

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
jQuery官方API文档
jQuery官方API文档

共0课时 | 0人学习

DOM操作与实战案例
DOM操作与实战案例

共14课时 | 2.3万人学习

前端系列快速入门课程
前端系列快速入门课程

共4课时 | 0.5万人学习