You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

前端输入空格后剩余文本未截断的技术问题求助

问题:前端打字交互中输入空格后剩余文本未移除对应空格

在前端打字交互场景中,输入空格键时,页面上的剩余文本(remaining元素)未从内容中移除该空格。相关代码及现象如下:

前端按键处理JS代码

let snippet = document.getElementById('snippet'); 
let remaining = document.getElementById('remaining'); 
let typed = document.getElementById('typed');
let result = document.getElementById('result');

const keydownHandler = (event) => {
    let key = event.key;

    if (key.length === 1 && /[a-z .]/i.test(key) ) {
        if (key === snippet.innerText[typed.innerText.length]) {
            if(key == " "){            
                console.log('its space !!!!!!');
                typed.innerText +=  ' ';
            }else{
                typed.innerText +=  key.toLowerCase();
            }
            remaining.innerText = snippet.innerText.slice(typed.innerText.length);
            result.innerText = '';
        } else {
            result.innerText = 'Incorrect key pressed!';
        }
    }

    let message = JSON.stringify({
        'snippet_text':snippet.innerText,
        'typed_text': typed.innerText,
        'remaining_text': remaining.innerText,
    });

    if (socket.readyState === WebSocket.OPEN) {
        console.log('Sending message:', message);
        socket.send(message);
    }
};

后端Python消费端代码

def receive(self, text_data):
    data = json.loads(text_data)
    typed_text = data.get('typed_text', '').lower()
    snippet_text = data.get('snippet_text', '').lower()
    
    is_correct = typed_text == snippet_text
    if is_correct:
        self.current_snippet_index += 1
        self.player_score += 1
        self.send(json.dumps({
            'is_correct': is_correct,
            'player_score': self.player_score,
        }))
        self.send_new_snippet() #send new snippet with full details
    else:
        remaining_text = snippet_text[len(typed_text):]
        self.send(json.dumps({
            'snippet_text': snippet_text,
            'typed_text': typed_text,
            'remaining_text': remaining_text,
        }))

现象

输入空格键后,前端页面的剩余文本未正确移除该空格。


解决方案

1. 替换innerText为textContent

问题核心原因是**innerText会自动合并连续空格、处理换行符**,导致typed元素的文本长度和实际输入的字符数不一致,进而使得slice计算剩余文本时位置错误。

将代码中所有的innerText替换为textContent,它会保留原始文本的所有空格和字符,确保长度计算准确:

// 修改后相关代码片段
if (key.toLowerCase() === snippet.textContent[typed.textContent.length].toLowerCase()) {
    if(key == " "){            
        console.log('its space !!!!!!');
        typed.textContent +=  ' ';
    }else{
        typed.textContent +=  key.toLowerCase();
    }
    remaining.textContent = snippet.textContent.slice(typed.textContent.length);
    result.textContent = '';
}

// 发送消息部分也同步修改
let message = JSON.stringify({
    'snippet_text':snippet.textContent,
    'typed_text': typed.textContent,
    'remaining_text': remaining.textContent,
});

2. 统一大小写匹配逻辑

原代码中直接用输入的key和snippet的字符做全等匹配,若snippet包含大写字母,输入小写字母会匹配失败。修改匹配逻辑,统一转成小写后比较,确保大小写不影响匹配:

// 原判断条件
// if (key === snippet.innerText[typed.innerText.length]) {
// 修改为
if (key.toLowerCase() === snippet.textContent[typed.textContent.length].toLowerCase()) {

3. 后端逻辑无需修改

后端已经将文本统一转成小写处理,修改前端后,发送的typed_text和snippet_text会与后端的处理逻辑对齐,不会出现长度不匹配的问题。


内容的提问来源于stack exchange,提问作者Acno_Sama

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 19:19:57