Shiny中textInput组件如何取消autocomplete自动补全提示
你当前使用的textInput默认渲染的输入标签未携带禁用自动填充的相关属性,浏览器会默认记录输入历史触发补全,可根据场景选择以下方案解决:
方案1:替换为原生密码输入组件(优先推荐)
Shiny自带的passwordInput本身就是为密码场景设计,默认携带autocomplete="new-password"属性,主流现代浏览器都会自动屏蔽该类输入框的历史补全,替换成本极低:passwordInput( inputId = "password_input", label = h4(":pass"), value = "", width = "50%" )如果你不需要密码掩码效果、必须保留明文输入的textInput形态,选择后面的方案即可。
方案2:给现有textInput追加禁用自动补全属性
用htmltools的tagAppendAttributes函数直接给原有输入框标签追加属性即可,autocomplete="new-password"对Chrome、Edge等Chromium内核浏览器的屏蔽效果比传统的"off"更好:library(htmltools) tagAppendAttributes( textInput("password_input", label=h4(":pass"),value = "", width = "50%"), autocomplete = "new-password", autocorrect = "off", autocapitalize = "off", spellcheck = "false" )后面追加的三个属性是为了兼容移动端、旧版本浏览器的自动纠错、首字母大写、拼写检查类的自动弹出逻辑。
方案3:JS批量兜底处理
如果页面内有多个输入框需要统一关闭自动补全,不需要逐个修改组件,直接在UI层插入一段JS脚本,页面加载完成后批量给目标输入框设置属性即可:# 放在UI代码的任意位置都可生效 tags$script(HTML(" $(document).on('shiny:connected', function() { // 单独给指定密码框设置属性 $('#password_input').attr('autocomplete', 'new-password'); // 如果要全局禁用页面所有输入框的自动补全,替换为下面这行即可 // $('input').attr('autocomplete', 'off'); }); "))
兼容性提示:部分老旧版本浏览器对
autocomplete="off"的识别存在差异,如果遇到设置后仍弹出补全的情况,可以把属性值改成"no-autofill-please"这类自定义随机字符串——浏览器仅会对白名单内的autocomplete值触发自动填充逻辑,非白名单值会直接跳过自动补全流程。
内容的提问来源于stack exchange,提问作者asdf1212

