使用 jQuery 更改输入字段的类型

IT技术 javascript jquery html-input
2021-02-02 22:46:47
$(document).ready(function() {
    // #login-box password field
    $('#password').attr('type', 'text');
    $('#password').val('Password');
});

这应该将#password输入字段(带id="password"更改type password为普通文本字段,然后填写文本“密码”。

但是,它不起作用。为什么?

这是表格:

<form enctype="application/x-www-form-urlencoded" method="post" action="/auth/sign-in">
  <ol>
    <li>
      <div class="element">
        <input type="text" name="username" id="username" value="Prihlasovacie meno" class="input-text" />
      </div>
    </li>
    <li>
      <div class="element">
        <input type="password" name="password" id="password" value="" class="input-text" />
      </div>
    </li>
    <li class="button">
      <div class="button">
        <input type="submit" name="sign_in" id="sign_in" value="Prihlásiť" class="input-submit" />
      </div>
    </li>
  </ol>
</form>
6个回答

作为浏览器安全模型的一部分,很可能会阻止此操作。

编辑:确实,现在在 Safari 中进行测试,我收到了错误type property cannot be changed

编辑 2:这似乎是直接来自 jQuery 的错误。使用以下直接的 DOM 代码可以正常工作:

var pass = document.createElement('input');
pass.type = 'password';
document.body.appendChild(pass);
pass.type = 'text';
pass.value = 'Password';

编辑 3:直接来自 jQuery 源代码,这似乎与 IE 相关(并且可能是错误或其安全模型的一部分,但 jQuery 不是特定的):

// We can't allow the type property to be changed (since it causes problems in IE)
if ( name == "type" && jQuery.nodeName( elem, "input" ) && elem.parentNode )
    throw "type property can't be changed";
在搜索中找到了这个答案,这是一个很大的帮助。但是,我的解决方案是从 jquery 中删除该检查。工作得很好。
2021-03-12 22:46:47
刚刚添加了更新 4 - 希望它有助于解释事情以及如何解决它们。
2021-03-17 22:46:47
不得不说,这是我见过的最无用的安全措施。快速更改字段的类型和用全新的字段替换它之间似乎没有太大区别。很奇怪......无论如何,对我有用。谢谢!
2021-03-24 22:46:47
@Michael,我建议不要直接更改 jQuery。除此之外,它会在未来产生冲突责任,这种检查可能是有原因的。如果您不需要担心 IE 支持,您可以改为实现一个并行attr但允许更改元素type属性的 jQuery 扩展input
2021-03-31 22:46:47
它不是安全模型的东西,我可以确认它在 IE7、IE8 中不起作用并出现错误:无法获取类型属性
2021-04-06 22:46:47

一步解决

$('#password').get(0).type = 'text';
实际上,根据问题,它是jQuery解决方案。
2021-03-11 22:46:47
或者更短的一个, $('#password')[0].type = 'text';
2021-03-14 22:46:47
如果您尝试以这种方式将类型从“密码”更改为“文本”,则 IE 8 实际上会引发错误。错误提示“无法获取类型属性。不支持此命令。”
2021-03-20 22:46:47
document.getElementById应该足够了,您不需要 jQuery!;-)
2021-03-22 22:46:47
这可能会导致 IE9 出现问题,类型未定义。非常适合其他浏览器。
2021-04-08 22:46:47

更简单……不需要创建所有动态元素。只需创建两个单独的字段,使一个“真实”密码字段(type="password")和一个“假”密码字段(type="text"),将假字段中的文本设置为浅灰色,然后将初始值设置为“密码”。然后使用 jQuery 添加几行 Javascript,如下所示:

    <script type="text/javascript">

        function pwdFocus() {
            $('#fakepassword').hide();
            $('#password').show();
            $('#password').focus();
        }

        function pwdBlur() {
            if ($('#password').attr('value') == '') {
                $('#password').hide();
                $('#fakepassword').show();
            }
        }
    </script>

    <input style="color: #ccc" type="text" name="fakepassword" id="fakepassword" value="Password" onfocus="pwdFocus()" />
    <input style="display: none" type="password" name="password" id="password" value="" onblur="pwdBlur()" />

因此,当用户输入“假”密码字段时,它将被隐藏,真实字段将显示,焦点将移至真实字段。他们将永远无法在虚假字段中输入文本。

当用户离开真实密码字段时,脚本将查看它是否为空,如果是,将隐藏真实字段并显示假密码。

请注意不要在两个输入元素之间留出空格,因为 IE 会一个接一个地放置(渲染空间),并且当用户进入/退出时,该字段会出现移动。

我将两个字段放在一起,如下所示: <input type="text" /><input type="password" /> 当它们交换时,我仍然在 IE (9) 中得到垂直偏移。链接方法 ($('#password').show().focus();) 对此没有帮助,但这是一个有趣的优化举措。总的来说,这是最好的解决方案。
2021-03-27 22:46:47
如果用户将焦点移动到另一个控件并且 onblur 被触发,焦点将返回到假密码字段
2021-03-29 22:46:47
你应该使用: if ($('#password').val() == '') { 而不是: if ($('#password').attr('value') == '') { 否则密码值将始终在模糊上显示“密码”。
2021-04-01 22:46:47
您还可以链接以下功能:$('#password').show(); $('#password').focus();作为$('#password').show().focus();
2021-04-03 22:46:47

如今,您只需使用

$("#password").prop("type", "text");

但当然,你真的应该这样做

<input type="password" placeholder="Password" />

除了 IE。也有占位符垫片可以在 IE 中模拟该功能。

2021-03-13 22:46:47
IE 8 现在已经死了。本机 HTML 解决方案万岁。扔掉你的占位符并庆祝。
2021-04-06 22:46:47

一个更跨浏览器的解决方案......我希望这个要点可以帮助那里的人。

此解决方案尝试设置type属性,如果失败,它只会创建一个新<input>元素,同时保留元素属性和事件处理程序。

changeTypeAttr.jsGitHub 要点):

/* x is the <input/> element
   type is the type you want to change it to.
   jQuery is required and assumed to be the "$" variable */
function changeType(x, type) {
    x = $(x);
    if(x.prop('type') == type)
        return x; //That was easy.
    try {
        return x.prop('type', type); //Stupid IE security will not allow this
    } catch(e) {
        //Try re-creating the element (yep... this sucks)
        //jQuery has no html() method for the element, so we have to put into a div first
        var html = $("<div>").append(x.clone()).html();
        var regex = /type=(\")?([^\"\s]+)(\")?/; //matches type=text or type="text"
        //If no match, we add the type attribute to the end; otherwise, we replace
        var tmp = $(html.match(regex) == null ?
            html.replace(">", ' type="' + type + '">') :
            html.replace(regex, 'type="' + type + '"') );
        //Copy data from old element
        tmp.data('type', x.data('type') );
        var events = x.data('events');
        var cb = function(events) {
            return function() {
                //Bind all prior events
                for(i in events)
                {
                    var y = events[i];
                    for(j in y)
                        tmp.bind(i, y[j].handler);
                }
            }
        }(events);
        x.replaceWith(tmp);
        setTimeout(cb, 10); //Wait a bit to call function
        return tmp;
    }
}
这太糟糕了,如果每个人都说 F...它,那么什么都行不通,它应该跨浏览器工作或根本不工作。
2021-03-19 22:46:47
说到要点……你应该为这段代码创建一个。要点.github.com
2021-03-26 22:46:47