JavaScript innerHTML
最后修改于 2025 年 4 月 2 日
在本文中,我们将探讨 JavaScript 中的 innerHTML
属性。此属性对于 DOM 操作至关重要,它允许开发人员获取或设置元素的 HTML 内容。
基本定义
innerHTML
属性获取或设置元素中包含的 HTML 或 XML 标记。它是 JavaScript 中动态内容更新最强大的属性之一。
读取 innerHTML
时,它以字符串形式返回 HTML 内容。设置 innerHTML
时,它会用解析后的 HTML 字符串完全替换元素的内容。
innerHTML 的基本用法
此示例演示了如何使用 innerHTML 获取和设置 HTML 内容。
<!DOCTYPE html> <html> <head> <title>Basic innerHTML</title> </head> <body> <div id="content"><p>Original content</p></div> <button onclick="changeContent()">Change Content</button> <script> function changeContent() { const element = document.getElementById('content'); console.log(element.innerHTML); // Logs current content element.innerHTML = '<h2>New Content</h2><p>Changed via innerHTML</p>'; } </script> </body> </html>
在这个基本示例中,我们有一个具有初始内容的 div 元素。当点击按钮时,JavaScript 代码首先记录当前的 HTML 内容,然后用新的 HTML 标记替换它。
这演示了 innerHTML
访问和修改元素内容的根本用法。该属性可以处理复杂的 HTML 结构,而不仅仅是纯文本。
创建动态列表
此示例展示了如何使用 innerHTML 动态生成列表项。
<!DOCTYPE html> <html> <head> <title>Dynamic Lists</title> </head> <body> <ul id="fruitList"></ul> <button onclick="generateList()">Generate List</button> <script> function generateList() { const fruits = ['Apple', 'Banana', 'Orange', 'Mango']; const listElement = document.getElementById('fruitList'); let listHTML = ''; fruits.forEach(fruit => { listHTML += `<li>${fruit}</li>`; }); listElement.innerHTML = listHTML; } </script> </body> </html>
这里我们从一个空的无序列表开始。当点击按钮时,generateList
函数会从数组创建列表项的 HTML,并使用 innerHTML
将它们插入。
这演示了 innerHTML
如何一次性有效地更新多个元素。先构建 HTML 字符串然后一次性设置它,比多次 DOM 操作更具性能优势。
安全注意事项
此示例演示了 innerHTML 潜在的安全风险。
<!DOCTYPE html> <html> <head> <title>Security Risks</title> </head> <body> <div id="userContent"></div> <input type="text" id="userInput" placeholder="Enter some text"> <button onclick="displayContent()">Display</button> <script> function displayContent() { const input = document.getElementById('userInput').value; const element = document.getElementById('userContent'); // UNSAFE: Potential XSS vulnerability element.innerHTML = input; // SAFER alternative: // element.textContent = input; } </script> </body> </html>
在此示例中,用户输入直接通过 innerHTML
插入页面。如果输入包含恶意脚本标签,这将导致 XSS 漏洞。
在使用 innerHTML
之前,请始终对用户输入进行消毒,或者在只需要纯文本时考虑使用 textContent
。这是处理动态内容时一个至关重要的安全注意事项。
性能比较
此示例比较了 innerHTML 和 DOM 操作方法。
<!DOCTYPE html> <html> <head> <title>Performance Comparison</title> </head> <body> <div id="container1"></div> <div id="container2"></div> <button onclick="runTest()">Run Test</button> <script> function runTest() { const items = Array(1000).fill().map((_, i) => `Item ${i + 1}`); // Using innerHTML console.time('innerHTML'); const container1 = document.getElementById('container1'); container1.innerHTML = items.map(item => `<div>${item}</div>`).join(''); console.timeEnd('innerHTML'); // Using DOM methods console.time('DOM'); const container2 = document.getElementById('container2'); items.forEach(item => { const div = document.createElement('div'); div.textContent = item; container2.appendChild(div); }); console.timeEnd('DOM'); } </script> </body> </html>
此代码比较了两种添加 1000 个元素的方法:使用 innerHTML
与使用 DOM 操作方法。控制台计时显示了性能差异。
innerHTML
通常在批量操作方面更快,因为它最大限度地减少了重排和重绘。然而,DOM 方法提供了更多的控制,并且在处理用户生成的内容时更安全。
与模板字面量结合使用
此示例展示了如何将模板字面量与 innerHTML 结合用于复杂的 HTML。
<!DOCTYPE html> <html> <head> <title>Template Literals</title> <style> .card { border: 1px solid #ccc; padding: 10px; margin: 10px; width: 200px; } </style> </head> <body> <div id="cardContainer"></div> <button onclick="createCard()">Add Card</button> <script> function createCard() { const container = document.getElementById('cardContainer'); const title = 'Sample Card'; const content = 'This card was created using template literals and innerHTML'; container.innerHTML += ` <div class="card"> <h3>${title}</h3> <p>${content}</p> <small>Created: ${new Date().toLocaleTimeString()}</small> </div> `; } </script> </body> </html>
在这里,我们使用模板字面量来创建一种清晰、可读的方式来生成复杂的 HTML 结构。卡片模板包含动态数据,并使用 innerHTML
追加到容器中。
模板字面量通过保持结构可见性,使 HTML 生成更易于维护。请注意使用 +=
进行追加而不是替换现有内容。
来源
在本文中,我们展示了如何在 JavaScript 中使用 innerHTML
属性。此强大功能可实现动态内容更新,但需要谨慎使用,特别是在安全性和性能方面。
作者
列出 所有 JS DOM 教程。