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

在Flask中使用htmx实现输入框值的实时替换处理

Solution

To get the processed value to replace the input's content instead of appending after it, you need to adjust htmx's swap behavior and handle the response manually to update the input's value. Here's how to fix it:

Key Changes Needed

  1. Disable Default Swap: Set hx-swap="none" to prevent htmx from inserting the response into the DOM automatically.
  2. Handle Response with Event Listener: Use hx-on:htmx:afterRequest to capture the Flask response and update the input's value directly.
  3. Prevent Infinite Loops: Add a temporary flag to skip the htmx trigger when the value is updated programmatically (avoids repeated requests from the auto-updated value).

Corrected Flask Route

We'll update the processing logic to match the credit card-style formatting you mentioned (adding dots every 3 digits) instead of appending "000":

@landingpage_bp.route("/process", methods=['PUT'])
def process_data():
    data = request.form['access-key']
    print("access-key:", data)
    
    # Clean existing dots and format with new separators
    cleaned_data = data.replace('.', '')
    processed_data = '.'.join([cleaned_data[i:i+3] for i in range(0, len(cleaned_data), 3)])
    
    print("processed_data:", processed_data)
    return jsonify({'value': processed_data})

Corrected HTML & HTMX Code

This code uses the JSON response from Flask to update the input's value, and includes the loop-prevention flag:

<form hx-target="#access-key" autocomplete="off">
    <input type="tel" 
           id="access-key" 
           name="access-key" 
           placeholder="###.###.###.###" 
           pattern="[0-9]{3}.[0-9]{3}.[0-9]{3}.[0-9]{3}" 
           maxlength="15" 
           hx-put="/process" 
           hx-trigger="keyup changed delay:500ms[event.target.dataset.updating !== 'true']" 
           value="" 
           required
           hx-swap="none"
           hx-on:htmx:afterRequest="
               this.dataset.updating = 'true';
               const response = JSON.parse(event.detail.xhr.responseText);
               this.value = response.value;
               setTimeout(() => delete this.dataset.updating, 100);
           "
    >
</form>

Alternative: Plain Text Response

If you prefer to return plain text from Flask instead of JSON, modify the route to return the processed string directly:

@landingpage_bp.route("/process", methods=['PUT'])
def process_data():
    data = request.form['access-key']
    cleaned_data = data.replace('.', '')
    processed_data = '.'.join([cleaned_data[i:i+3] for i in range(0, len(cleaned_data), 3)])
    return processed_data

Then simplify the htmx event handler:

hx-on:htmx:afterRequest="
    this.dataset.updating = 'true';
    this.value = event.detail.xhr.responseText;
    setTimeout(() => delete this.dataset.updating, 100);
"

Why Your Original Setup Failed

Your hx-swap="afterend" configuration told htmx to insert the response content after the input element, which is why it was appending instead of modifying the input's value. By setting hx-swap="none" and using an event listener, we take control of updating the input's value directly.

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 07:10:07