
构建一个可交互的动态问卷首先需要一个稳固的HTML基础结构和相应的CSS样式。HTML负责定义问卷的骨架和初始元素,而CSS则负责其视觉呈现。
我们的问卷将包含一个可编辑的问卷标题、一个问题区域,其中包含一个可编辑的问题文本和至少一个选项。关键在于利用 contenteditable="true" 属性,它允许用户直接在浏览器中编辑任何HTML元素的内容,而无需额外的输入字段。
以下是问卷的初始HTML结构:
<!DOCTYPE html>
<html>
<head>
<title>您的调查问卷</title>
<link rel="stylesheet" href="DemoSurveyStyle.css">
</head>
<body>
<form>
<!-- 问卷总标题,可编辑 -->
<h1 id="myText" contenteditable="true">调查问卷名称</h1>
<!-- 第一个问题容器 -->
<div id="question">
<!-- 问题文本,可编辑 -->
<div class="questionName" contenteditable="true">问题</div>
<!-- 初始选项 -->
<div class="option">
<div class="optionName" contenteditable="true">选项</div>
<input type="checkbox" class="box">
</div>
</div>
<!-- 添加选项按钮,注意 type="button" 防止表单提交 -->
<button type="button" id="addOpButton" onclick="addOption()">添加选项</button>
<!-- 扩展:添加新问题按钮(此处仅为示意,后续实现) -->
<button type="button" id="addQButton" onclick="addQuestion()">添加新问题</button>
</form>
<script src="DemoCode.js"></script>
</body>
</html>关键点说明:
立即学习“Java免费学习笔记(深入)”;
为了使问卷界面更具可读性和美观性,我们应用了一些基本样式。
body {
background-color: #00ffaa; /* 页面背景色 */
font-family: Verdana; /* 字体 */
text-align: center; /* 文本居中 */
}
.questionName {
margin-top: 15px; /* 上边距 */
font-size: 20px; /* 字体大小 */
}
.optionName {
margin-top: 8px; /* 上边距 */
font-size: 15px; /* 字体大小 */
font-style: italic; /* 斜体 */
margin-left: 605px; /* 左边距,用于定位 */
}
.box {
margin-top: 12px; /* 上边距 */
}
.option {
display: flex; /* 使用Flexbox布局,使选项名和复选框并排 */
justify-content: center; /* 居中对齐,根据需要调整 */
align-items: center; /* 垂直居中 */
}实现动态添加选项是本教程的核心。我们将使用JavaScript的DOM(Document Object Model)操作来创建新的HTML元素并将其插入到现有文档中。
我们将创建一个名为 addOption() 的JavaScript函数,当“添加选项”按钮被点击时执行。
// DemoCode.js
function addOption() {
// 1. 获取要添加选项的目标容器,这里是第一个问题容器
var questionContainer = document.getElementById('question');
// 2. 创建一个新的 div 元素作为选项容器
const newOptionNode = document.createElement('div');
// 3. 为新选项容器添加 'option' 类,以便应用CSS样式
newOptionNode.classList.add("option");
// 4. 设置新选项容器的内部HTML,包含可编辑的选项文本和复选框
newOptionNode.innerHTML = '<div class="optionName" contenteditable="true">新选项</div><input type="checkbox" class="box">';
// 5. 将新创建的选项节点添加到问题容器中
questionContainer.appendChild(newOptionNode);
}
// 页面加载时可以调用一次,以确保初始状态有一个选项(如果HTML中没有)
// 或者根据设计决定是否需要此行
// addOption(); 代码解释:
虽然上述代码解决了添加选项的问题,但一个完整的问卷通常需要添加多个问题。动态添加新问题比添加选项稍微复杂一些,因为它需要复制一个更复杂的结构。
假设我们的HTML结构更新为:
<!-- ... 省略头部 ... -->
<body>
<form>
<h1 id="myText" contenteditable="true">调查问卷名称</h1>
<!-- 所有问题的容器 -->
<div id="surveyQuestions">
<!-- 初始问题 -->
<div class="questionBlock" id="question_1">
<div class="questionName" contenteditable="true">问题 1</div>
<div class="option">
<div class="optionName" contenteditable="true">选项 A</div>
<input type="checkbox" class="box">
</div>
<button type="button" onclick="addOptionToQuestion(this)">添加选项</button>
</div>
</div>
<button type="button" id="addQButton" onclick="addQuestion()">添加新问题</button>
</form>
<script src="DemoCode.js"></script>
</body>
<!-- ... 省略尾部 ... -->相应的JavaScript函数:
// DemoCode.js
let questionCounter = 1; // 用于生成唯一的问题ID
// 动态添加选项的函数,现在需要知道是哪个问题容器
function addOptionToQuestion(buttonElement) {
// 获取当前按钮的父级,即 .questionBlock
const questionBlock = buttonElement.closest('.questionBlock');
if (!questionBlock) return; // 如果找不到父级,则退出
const newOptionNode = document.createElement('div');
newOptionNode.classList.add("option");
newOptionNode.innerHTML = '<div class="optionName" contenteditable="true">新选项</div><input type="checkbox" class="box">';
// 将新选项添加到问题块中,在按钮之前
questionBlock.insertBefore(newOptionNode, buttonElement);
}
// 动态添加新问题的函数
function addQuestion() {
questionCounter++; // 增加问题计数器
const surveyQuestionsContainer = document.getElementById('surveyQuestions');
const newQuestionBlock = document.createElement('div');
newQuestionBlock.classList.add('questionBlock');
newQuestionBlock.id = `question_${questionCounter}`; // 确保ID唯一
// 构建新问题的HTML内容
newQuestionBlock.innerHTML = `
<div class="questionName" contenteditable="true">问题 ${questionCounter}</div>
<div class="option">
<div class="optionName" contenteditable="true">选项 A</div>
<input type="checkbox" class="box">
</div>
<button type="button" onclick="addOptionToQuestion(this)">添加选项</button>
`;
surveyQuestionsContainer.appendChild(newQuestionBlock);
}
// 初始加载时可以调用一次,确保有第一个问题(如果HTML中没有)
// addQuestion(); 改进说明:
在动态生成DOM元素时,需要考虑以下几点以确保代码的健壮性和用户体验:
通过本教程,我们学习了如何利用JavaScript的DOM操作功能,动态地在网页上添加和管理问卷的选项及问题。document.createElement()、element.classList.add()、element.innerHTML 和 parentNode.appendChild() 是实现这些功能的基石。同时,我们也探讨了如何通过改进事件处理和ID管理来扩展功能,以支持添加多个问题,并强调了在动态Web开发中需要注意的一些关键事项。掌握这些技术,可以帮助开发者构建高度灵活和交互性强的Web表单应用。
以上就是JavaScript动态构建交互式问卷:添加问题与选项的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号