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

如何在Reflex DOM中选中输入框内的全部文本

在Reflex中实现输入框获焦时自动选中全部文本

首先修正你原代码里的笔误:最后一行的return t应该改为return input,否则会编译报错。

要实现输入框获焦时选中全部文本,你可以通过Reflex的performEvent_配合原生DOM API完成,无需额外依赖,具体实现如下:

完整代码

{-# LANGUAGE OverloadedStrings #-}
import Reflex.Dom
import Data.Text (Text)
import Control.Lens ((^.), (&), (.~))
import GHCJS.Types (JSVal)

mkInputElement :: (DomBuilder t m, PostBuild t m) => Text -> m (InputElement EventResult (DomBuilderSpace m) t)
mkInputElement initialValue = do
  input <- inputElement $ def
    & inputElementConfig_initialValue .~ initialValue
  
  -- 过滤出"获焦"事件(当hasFocus从False变为True时触发)
  let focusGained = ffilter (== True) $ updated $ input ^. inputElement_hasFocus
  -- 获取输入框的原生DOM元素引用
  let inputDom = input ^. inputElement_raw
  -- 定义"选中全部文本"的动作:调用原生JS的select()方法
  let selectAll = liftJSM $ element_js inputDom >>= \jsEl -> liftIO $ js_select jsEl
  -- 绑定事件与动作:获焦时执行全选
  performEvent_ $ selectAll <$ focusGained
  
  return input

-- FFI绑定:调用输入框DOM元素的select()方法
foreign import javascript unsafe "$1.select()"
  js_select :: JSVal -> IO ()

关键部分说明

  • inputElement_raw:从Reflex封装的InputElement中提取底层的DOM元素,通过element_js可以拿到对应的JavaScript对象引用。
  • js_select:简单的FFI绑定,直接调用浏览器原生的HTMLInputElement.select()方法,这是实现文本全选的核心。
  • performEvent_:Reflex中用于执行事件驱动副作用的函数,这里将"获焦事件"和"全选动作"关联,确保每次输入框获焦时自动执行全选。

如果你希望简化FFI部分,也可以用reflex-dom提供的runScript函数动态执行JS代码,但直接写FFI绑定的性能更优。

内容的提问来源于stack exchange,提问作者maracuja-juice

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 17:10:05