前端 AI 类产品的打字机效果有哪几种实现方式?

前端 AI 类产品(如 ChatGPT、文心一言等)中常见的“打字机效果”(逐字显示文本)是一种用户体验优化技术,旨在模拟人类打字的过程,增强交互的自然感和流畅性。以下是实现打字机效果的原理和常见方法:


1. 实现原理

打字机效果的核心是通过 JavaScript 动态控制文本的显示,逐字或逐段地将内容添加到页面上。具体步骤如下:

  1. 获取文本内容:从服务器或本地获取需要显示的文本。

  2. 逐字显示:通过定时器(如 setTimeoutsetInterval)逐字将文本添加到 DOM 元素中。

  3. 控制速度:通过调整时间间隔控制打字速度。

  4. 结束处理:当文本完全显示后,停止定时器并触发回调(如显示光标闪烁或执行下一步操作)。


2. 实现方法

以下是几种常见的实现方式:

方法 1:使用 setTimeout 递归实现
function typeWriter(element, text, speed = 100) {

  let i = 0;

  function type() {

    if (i < text.length) {

  
### 实现 Java 后端调用 GPT 接口并返回带有打字机效果的响应 为了实现这一功能,可以分为以下几个部分来描述解决方案: #### 1. 调用 GPT API 的后端逻辑 在 Java 中可以通过 HTTP 客户端库(如 `HttpClient` 或 `OkHttp`)向 GPT 提供的 RESTful API 发送请求。以下是基于 OpenAI GPT-3 API 的示例代码[^1]。 ```java import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; public class GptApiCaller { private static final String OPENAI_API_KEY = "your-api-key"; private static final String ENDPOINT_URL = "https://api.openai.com/v1/completions"; public String callGpt(String prompt) throws Exception { HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create(ENDPOINT_URL)) .header("Authorization", "Bearer " + OPENAI_API_KEY) .header("Content-Type", "application/json") .POST(HttpRequest.BodyPublishers.ofString(""" {"model":"text-davinci-003","prompt":"%s","max_tokens":50} """.formatted(prompt))) .build(); HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); return parseResponse(response.body()); // 解析 JSON 响应中的实际文本数据 } private String parseResponse(String responseBody) { // 使用 JSON 库解析字符串 (e.g., Jackson or Gson),提取 'choices.text' return null; // 返回处理后的文本 } } ``` 上述代码展示了如何通过 POST 请求发送提示给 GPT 并获取其完成的结果[^2]。 --- #### 2. 将结果以流的形式传输至前端 为了让前端能够实时接收到字符级的数据更新,可以采用 WebSocket 技术或者 Server-Sent Events (SSE)[^3] 来实现实时通信。这里提供一种 SSE 方法作为例子: ##### 配置 Spring Boot 控制器支持 SSE 输出 如果使用的是 Spring Boot,则可以在控制器方法上启用事件流模式如下所示: ```java import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; @RestController @RequestMapping("/stream") public class TypewriterController { @GetMapping(value = "/gpt-typewriter", produces = "text/event-stream") public SseEmitter streamTypewriterEffect() { SseEmitter emitter = new SseEmitter(); try { StringBuilder sb = new StringBuilder(); // 存储完整的 GPT 响应 // 模拟逐字符推送过程 char[] chars = getGptResponse().toCharArray(); // 获取来自 GPT 的完整响应 for (char c : chars) { Thread.sleep(75); // 创建延迟模拟打字速度 sb.append(c); emitter.send(SseEmitter.event().data(sb.toString())); // 发送当前累积的内容 } emitter.complete(); // 结束流 } catch (Exception e) { emitter.completeWithError(e); // 处理错误情况 } return emitter; } private String getGptResponse() throws Exception { // 这里调用之前定义好的 GptApiCaller 类的方法 return new GptApiCaller().callGpt("Your Prompt Here"); } } ``` 此片段实现了服务器端将 GPT 文本逐步推送给客户端的功能[^4]。 --- #### 3. 前端接收与展示 最后,在前端页面中订阅该事件源即可显示动态加载的效果。下面是一个简单的 HTML 和 JavaScript 片段用于演示目的: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>GPT Typewriter</title> </head> <body> <div id="output"></div> <script type="text/javascript"> const eventSource = new EventSource('/stream/gpt-typewriter'); eventSource.onmessage = function(event) { document.getElementById('output').innerText = event.data; }; // 错误处理机制可选加入 eventSource.onerror = () => console.error('Event Source Failed'); </script> </body> </html> ``` 这样就完成了整个流程的设计和实施说明[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值