小白都能看懂的 textarea 的用法

本文介绍了HTML中的textarea元素及其在表单中的应用,包括元素属性详解、多行文本输入以及如何实现动态计算输入数据字数的示例。适合前端学习者,特别是零基础者回顾基础知识。

文章导读:AI 辅助学习前端,包含入门、进阶、高级部分前端系列内容,当前是 HTML 的部分,公众号会持续更新,适合零基础的朋友,已有前端工作经验的可以不看,也可以当作基础知识回顾。

当在 HTML 表单中需要用户输入多行文本时,会使用 <textarea> 元素,它是一个文本域控件。文本域允许用户输入多行文本,例如评论、反馈等长文本内容。以下是 <textarea> 元素的详细用法:

<form>
  <label for="feedback">请输入您的反馈意见:</label>
  <textarea id="feedback" name="feedback" rows="4" cols="50"></textarea>
  <input type="submit" value="提交">
</form>

在上面的示例中,<textarea> 元素被用于收集用户的反馈意见。下面详细解释每个属性的含义:

1.id:这是元素的唯一标识符,通常与 <label> 元素的 for 属性关联,以提高可用性。

2.name:指定文本域的名称,将在提交表单时用作标识字段的名称。

3.rows 和 cols:这些属性定义文本域的行数和列数。rows 指定文本域显示的行数,cols 指定文本域显示的列数。

4.placeholder:可以设置一个占位符文本,提示用户输入的内容。类似于输入框的 placeholder 属性。

5.readonly:设置为 readonly 将文本域设置为只读,用户可以看到内容但无法修改。

6.disabled:设置为 disabled 将禁用文本域,用户无法与之交互。

7.maxlength:限制用户输入的最大字符数。

8.wrap:定义文本在何处换行。可选值为 soft(在单词边界处换行)和 hard(在指定的列数换行)。

9.autofocus:设置为 autofocus 会在页面加载时自动将焦点设置在文本域上。

10.required:设置为 required 会在提交表单时验证字段是否已填写。

通过使用 <textarea> 元素,你可以方便地收集多行文本输入,为用户提供更大的输入空间。

下面是一个能够动态计算输入的数据字数的零基础前端代码示例:

<!DOCTYPE html>
<html>
<head>
  <title>动态计算输入数据字数</title>
</head>
<body>
  <h1>动态计算输入数据字数示例</h1>
  <p>请输入您的评论:</p>
  
  <textarea id="comment" rows="4" cols="50" oninput="countCharacters()"></textarea>
  
  <p>字数:<span id="charCount">0</span></p>
  
  <script>
    function countCharacters() {
      const textarea = document.getElementById("comment");
      const charCountSpan = document.getElementById("charCount");
      
      const charCount = textarea.value.length;
      charCountSpan.textContent = charCount;
    }
  </script>
</body>
</html>

今天的内容就是这些了,这就是 textarea 的全部用法了,相信零基础的你已经学会了,将上面的示例复制到编辑器中试试把。

希望每一个初学者都能成为一个优秀的前端开发工程师,加油。

最后啰嗦一句,好记性不如烂笔头,希望大家在学习的过程中养成做笔记的习惯,形成自己的知识体系。

package org.example.test; import javafx.animation.*; import javafx.application.Application; import javafx.geometry.*; import javafx.scene.*; import javafx.scene.control.*; import javafx.scene.input.KeyCode; import javafx.scene.layout.*; import javafx.scene.paint.Color; import javafx.scene.shape.*; import javafx.scene.text.*; import javafx.stage.Stage; import javafx.util.Duration; import java.util.*; public class EnhancedBinaryTreeVisualizer extends Application { private TreeNode root; private final TreeCanvas canvas = new TreeCanvas(); private TextArea logArea; private final Random random = new Random(); @Override public void start(Stage stage) { stage.setTitle("二叉树可视化工具"); logArea = createLogArea(); // 创建UI组件 $ TextField input = new TextField(); input.setPromptText("输入节点值(按Enter插入)"); Button insertBtn = createButton("插入", "#4CAF50"); Button clearBtn = createButton("清空", "#F44336"); // 事件绑定 // 添加Enter键事件处理 [^1] input.setOnKeyPressed(event -> { if (event.getCode() == KeyCode.ENTER) { handleInsert(input); } }); insertBtn.setOnAction(_ -> handleInsert(input)); clearBtn.setOnAction(_ -> clearTree()); // 布局设置 BorderPane rootPane = new BorderPane(); rootPane.setTop(new HBox(10, input, insertBtn, clearBtn)); rootPane.setCenter(canvas); rootPane.setBottom(new VBox(5, new Separator(), new ScrollPane(logArea))); rootPane.setPadding(new Insets(10)); stage.setScene(new Scene(rootPane, 900, 700)); stage.show(); } // 处理插入操作 $O(1)$ private void handleInsert(TextField input) { try { int value = Integer.parseInt(input.getText()); insert(value); // 强制使用乱序插入 input.clear(); input.requestFocus(); // 保持输入框焦点 } catch (NumberFormatException e) { log("请输入有效的整数"); } } private void insert(int value) { if (findNode(root, value) != null) { log("节点已存在"); return; } TreeNode node = new TreeNode(value); if (root == null) { root = node; } else { List<TreeNode> points = findInsertionPoints(); // 随机选择插入点实现乱序插入 [^2] TreeNode parent = points.get(random.nextInt(points.size())); if (parent.left == null) parent.left = node; else parent.right = node; } animateInsertion(value); canvas.draw(root); log("已插入节点: " + value); } // 动画效果 $O(1)$ private void animateInsertion(int value) { Circle circle = new Circle(20, Color.ORANGE); Text text = new Text(String.valueOf(value)); Pane animNode = new Pane(circle, text); canvas.getChildren().add(animNode); ParallelTransition animation = new ParallelTransition( new ScaleTransition(Duration.seconds(0.5), animNode), new FadeTransition(Duration.seconds(1), animNode) ); animation.play(); animation.setOnFinished(_ -> canvas.getChildren().remove(animNode)); } // 辅助方法保持不变... private Button createButton(String text, String color) { Button btn = new Button(text); btn.setStyle("-fx-background-color: " + color + "; -fx-text-fill: white;"); return btn; } private TextArea createLogArea() { TextArea area = new TextArea(); area.setEditable(false); return area; } private void log(String msg) { logArea.appendText(msg + "\n"); } private void clearTree() { root = null; canvas.draw(null); log("树已清空"); } // 查找可插入位置 $O(n)$ private List<TreeNode> findInsertionPoints() { List<TreeNode> points = new ArrayList<>(); Queue<TreeNode> queue = new LinkedList<>(); if (root != null) queue.add(root); while (!queue.isEmpty()) { TreeNode curr = queue.poll(); if (curr.left == null || curr.right == null) points.add(curr); if (curr.left != null) queue.add(curr.left); if (curr.right != null) queue.add(curr.right); } return points; } private TreeNode findNode(TreeNode node, int value) { if (node == null) return null; if (node.value == value) return node; TreeNode left = findNode(node.left, value); return left != null ? left : findNode(node.right, value); } // 内部类 private static class TreeNode { int value; TreeNode left, right; TreeNode(int value) { this.value = value; } } private class TreeCanvas extends Pane { private static final double V_SPACE = 70; private static final double RADIUS = 20; void draw(TreeNode root) { getChildren().clear(); if (root != null) drawNode(root, getWidth()/2, 50, getWidth()/4); } private void drawNode(TreeNode node, double x, double y, double offset) { if (node == null) return; Circle circle = new Circle(x, y, RADIUS, Color.LIGHTBLUE); Text text = new Text(x - 5, y + 5, String.valueOf(node.value)); getChildren().addAll(circle, text); double childOffset = Math.max(offset * 0.7, 20); if (node.left != null) { double childX = x - childOffset; double childY = y + V_SPACE; drawConnection(x, y, childX, childY); drawNode(node.left, childX, childY, childOffset/2); } if (node.right != null) { double childX = x + childOffset; double childY = y + V_SPACE; drawConnection(x, y, childX, childY); drawNode(node.right, childX, childY, childOffset/2); } } private void drawConnection(double x1, double y1, double x2, double y2) { Line line = new Line(x1, y1 + RADIUS, x2, y2 - RADIUS); line.setStroke(Color.DARKSLATEGRAY); getChildren().addFirst(line); // 确保线条在节点下方 } @Override protected void layoutChildren() { super.layoutChildren(); draw(root); // 窗口大小变化时重绘 } } }请详细注释上述代码,达到计算机小白都可以看懂代码理解代码意思的注释
最新发布
09-25
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值