【问题标题】:Using jQuery's .live/.bind to affect input created by a for loop使用 jQuery 的 .live/.bind 来影响由 for 循环创建的输入
【发布时间】:2011-06-08 17:19:50
【问题描述】:

我有两个数组,一个带有输入名称,一个带有每个输入的值。有 7 个输入,所以我做了一个循环来用它的值填充每个输入,然后让它在输入焦点时文本会消失,如果没有输入任何内容,则恢复原始值文本。这可以通过 jQuery 循环来实现吗?在我看来 .live 和 .bind 不适用于此目的。我是否必须在每个输入事件 focus&blur 事件中进行硬核?

for (var i=0;i<7;i++) {

    $('#user_' + input_names[i]).attr('value', default_values[i]);

    $('#user_' + input_names[i]).live("blur", function(){
        if(this.value == '')this.value=default_values[i];
    });

    $('#user_' + input_names[i]).live("focus", function(){
        if(this.value == default_values[i])this.value='';
    });

}

在此处更新,按照 Eric 的要求释放数组:

var input_names = ['username', 'password'];
var default_values = ['Username', 'Password'];

for (var i=0;i<2;i++) {    
    $('#user_' + input_names[i]).attr('value', default_values[i]);

    $('#user_' + input_names[i]).blur(function(){
        if(this.value == '')this.value=default_values[i];
    });

    $('#user_' + input_names[i]).focus(function(){
        if(this.value == default_values[i])this.value='';
    });
}

【问题讨论】:

  • #user_... 元素是动态生成的吗?我们能看到生成它们的代码吗?
  • #user_ 是输入名称的前缀。它们是这样的:#user_username、#user_... 等等。不是整数。
  • 这不能回答我的问题。如果您向我们展示生成它们的代码,事情可以大大简化。为什么在生成处理程序时不能附加处理程序?
  • 抱歉,inputs 不是由 for 循环创建的,只是事件绑定?这就是我读标题的方式。

标签: javascript jquery events for-loop delegation


【解决方案1】:

看起来您正在寻找 HTML5 placeholder 属性。只需将您的 HTML 更改为:

<input id="user_username" placeholder="Username" />
<input id="user_password" placeholder="Password" />

如果您想要向后兼容,there's a jQuery plugin for that。引用插件后,只需执行以下操作:

$('input[placeholder]').placeholder();

至于你的初始代码有什么问题,我怀疑存在闭包问题,i 保留了 7 的值。你最好改写成这样:

var inputDefaults = {username: 'Username', password: 'Password'};

$.each(inputDefaults, function(field, defaultValue) {
    $('#user_' + field)
        .attr('value', defaultValue);
        .blur(function() {
            if($(this).val() == '')
                $(this).val(defaultValue);
        })
        .focus(function(){
            if($(this).val() == defaultValue)
                $(this).val('');
        });
});

【讨论】:

  • 谢谢,好建议。然而,由于 HTML5 与旧浏览器不太兼容,我仍然认为我需要使用 jQuery。让他们来吧。
  • @Melanie:这就是 jQuery 插件的用途!
  • @Melanie:已更新。我强烈建议您向我们展示生成这些输入的代码。以及default_values 的来源。如果我有这些,还有比这个更好的解决方案。
猜你喜欢
  • 2014-03-31
  • 1970-01-01
  • 1970-01-01
  • 2013-05-09
  • 2014-10-20
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 2013-08-28
相关资源
最近更新 更多