jQuery 模糊/焦点奇怪的情况

发布于 2024-10-09 14:37:01 字数 850 浏览 1 评论 0 原文

我输入了密码类型。我想做简单的事情。如果输入未获得焦点,则输入具有默认值。我尝试用 jQuery 来实现。 我的 HTML:

<input type="password" name="password" id="password" defvalue="password" class="filling-password">

我的 Javascript(jQuery):

$('.filling-password').each(function(){
    var b = $(this);
    var id = this.id;
    var val = b.attr("defvalue");
    var textInput = '<input id="'+id+'-text" type="text" value="'+val+'">';
    $(textInput).insertAfter(this);
    b.hide(0);
    $("#"+id+"-text").focus(function(){
        $(this).hide(0);
        b.show(0).focus();
    });
    b.blur(function(){
        if ($(this).val() == "") {
            $(textInput).insertAfter(this);
            b.hide(0);
        }
    });
});

一切都很好。但只有一次。当我第一次点击输入时,输入变为空,当我模糊输入时,输入有默认值。
但如果我第三次点击什么也不会发生。怎么了?或者也许有更好的方法来做到这一点?

I have input with password type. And I want to do simple thing. If input isn't in focus, input has default value. I try to do it with jQuery.
My HTML:

<input type="password" name="password" id="password" defvalue="password" class="filling-password">

My Javascript(jQuery):

$('.filling-password').each(function(){
    var b = $(this);
    var id = this.id;
    var val = b.attr("defvalue");
    var textInput = '<input id="'+id+'-text" type="text" value="'+val+'">';
    $(textInput).insertAfter(this);
    b.hide(0);
    $("#"+id+"-text").focus(function(){
        $(this).hide(0);
        b.show(0).focus();
    });
    b.blur(function(){
        if ($(this).val() == "") {
            $(textInput).insertAfter(this);
            b.hide(0);
        }
    });
});

All work nice. But only one time. When I click first time input become empty, when I blur input have default value.
But If I click third time nothing happen. What is wrong? Or maybe there are better ways to do this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

鸠书 2024-10-16 14:37:01

这是一种大致如您所描述的方法,插入 $(function() { ... }); 当然(现场演示):

$('.filling-password').each(function() {
    var pass = $(this),
        text = $('<input type="text"/>').val(pass.attr('defvalue'));

    text.insertBefore(pass).focus(function() {
        text.hide();
        pass.show().focus();
    });

    pass.hide().blur(function() {
        if (pass.val() == '') {
            pass.hide();
            text.show();
        }
    });
});

可能更好的方法是在文本框顶部覆盖一个标签(现场演示):

$('.filling-password').each(function() {
    var pass = $(this),
        div = pass.wrap('<div/>').parent(),
        label = $('<label/>').attr('for', pass.attr('id')).text(pass.attr('defvalue')).prependTo(div);

    div.css({
        display: 'inline',
        position: 'relative'
    });

    label.css({
        color: '#666',
        fontSize: '12px',
        position: 'absolute',
        left: '4px',
        bottom: '2px'
    });

    pass.focus(function() {
        label.hide();
    }).blur(function() {
        if(pass.val() == '') {
            label.show();
        }
    });

有一个 更好地实现后一种方法的 jQuery 插件

Here's one way roughly as you described it, inserted inside $(function() { ... }); of course (live demo):

$('.filling-password').each(function() {
    var pass = $(this),
        text = $('<input type="text"/>').val(pass.attr('defvalue'));

    text.insertBefore(pass).focus(function() {
        text.hide();
        pass.show().focus();
    });

    pass.hide().blur(function() {
        if (pass.val() == '') {
            pass.hide();
            text.show();
        }
    });
});

Possibly better is to overlay a label on top of the text box (live demo):

$('.filling-password').each(function() {
    var pass = $(this),
        div = pass.wrap('<div/>').parent(),
        label = $('<label/>').attr('for', pass.attr('id')).text(pass.attr('defvalue')).prependTo(div);

    div.css({
        display: 'inline',
        position: 'relative'
    });

    label.css({
        color: '#666',
        fontSize: '12px',
        position: 'absolute',
        left: '4px',
        bottom: '2px'
    });

    pass.focus(function() {
        label.hide();
    }).blur(function() {
        if(pass.val() == '') {
            label.show();
        }
    });

There's a jQuery plug-in that implements the latter approach more nicely.

提赋 2024-10-16 14:37:01

我不知道 jQuery,但判断你的代码,这就是你想要的方向:

$('.filling-password').each(function(){

    var value = $(this).attr('value');
    var defaultvalue = 'password';


    $(this).blur(function() {

        if($(this).val() === '') $(this).value = defaultvalue;
    });


    $(this).focus(function() {

         if($(this).val() === defaultvalue) $(this).value = '';
    });
});

对于 HTML,defvalue 属性无效,我相信:

<input type="password" name="password" id="password" value="password" class="filling-password">

I don't know jQuery but judging your code, this is the direction you want to go:

$('.filling-password').each(function(){

    var value = $(this).attr('value');
    var defaultvalue = 'password';


    $(this).blur(function() {

        if($(this).val() === '') $(this).value = defaultvalue;
    });


    $(this).focus(function() {

         if($(this).val() === defaultvalue) $(this).value = '';
    });
});

And for the HTML, the defvalue attribute is not valid I believe:

<input type="password" name="password" id="password" value="password" class="filling-password">
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文