jQuery中数组命名输入框的密码转文本功能失效问题
解决密码切换显示功能在数组形式ID输入框失效的问题
嘿,我之前也碰到过一模一样的问题!你的密码切换代码在普通文本ID(比如#password)下能正常工作,但遇到数组形式的ID(比如#user_password[1])就失效,核心原因是jQuery选择器里的方括号[]是特殊语法字符,直接写的话会被当成属性选择器的一部分,而不是ID的组成部分。
举个例子,当你传入field: "#password[0]"时,jQuery会误以为你要找「ID为password且带有0属性的元素」,而不是「ID就是password[0]的输入框」,自然就找不到目标元素了。
两种可行的解决方案
方案1:自动处理特殊字符(推荐)
修改插件内部的元素获取逻辑,用原生JS的document.getElementById()来获取元素——原生方法可以直接识别包含特殊字符的ID,不需要转义,再转换成jQuery对象即可。修改后的代码如下:
(function($) { $.toggleShowPassword = function(options) { var settings = $.extend({ field: "#password", control: "#toggle_show_password", eye: "#password_eye", }, options); // 去掉ID前的#,用原生JS获取元素再转jQuery对象 var fieldId = settings.field.replace(/^#/, ''); var field = $(document.getElementById(fieldId)); var control = $(settings.control); var eye = $(settings.eye); control.bind('click', function() { // 切换输入框类型 var newType = field.attr('type') === 'password' ? 'text' : 'password'; field.attr('type', newType); // 这里可以加图标切换的逻辑(比如FontAwesome的眼睛图标) if (eye.length) { eye.toggleClass('fa-eye fa-eye-slash'); } }); }; })(jQuery);
这样不管你的ID是普通文本还是数组形式(比如#password[0]),都能正确选中目标输入框。
方案2:手动转义特殊字符
如果你不想修改插件核心代码,也可以在调用插件时手动转义ID里的方括号——用双反斜杠\\转义[和]:
// 调用示例 $.toggleShowPassword({ field: "#password\\[0\\]", control: "#toggle_show_password_0", eye: "#password_eye_0" });
这种方式需要你在每次调用时都手动处理ID,比较繁琐,所以更推荐方案1。
验证一下
修改完代码后,点击切换按钮,数组形式ID的输入框应该就能正常在密码/文本类型之间切换了~
内容的提问来源于stack exchange,提问作者Adam Wiley
相关产品推荐
相关产品推荐

