如何在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
相关产品推荐
相关产品推荐

