为什么我的jquery .each()函数不能正常工作?

3
我写了这个函数:
jQuery(document).ready(function() {
    jQuery('input[type=text]').each( function(i) {
        thisval = jQuery(this).val();

        jQuery(this).blur( function() {
            if (jQuery(this).val() == '') {
                jQuery(this).val(thisval);
            }
        }); // end blur function
        jQuery(this).focus( function() {
            if (jQuery(this).val() == thisval) {
                jQuery(this).val('');
            };
        });// end focus function
    }); //END each function
}); // END document ready function

这个功能旨在获取输入框的值,如果用户没有输入新值就离开了输入框,那么旧值将被保留。在页面上的一个输入框上,该功能可以正常工作,但是在其他输入框上却不能正常工作。然而,当我删除.blur和.focus函数,只使用alert(thisval)时,它会弹出每个输入框的名称,因此我的函数存在问题,但我无法找出问题所在。需要帮助。


谢谢大家!我还在学习如何使用jQuery,希望随着时间的推移我的代码能变得更加清晰和智能化。 - Joseph
通常情况下,您可以使用 $ 代替 jQuery,除非它与另一个库发生冲突。否则,您可以将 jQuery 作为名为 $ 的参数传递到闭包中。 - James Westgate
@James - 或者,在document.ready的情况下,第一个参数已经是$,所以你可以使用jQuery(function($) {来使用$ - Nick Craver
2个回答

5

在声明变量时,需要使用var关键字,这样就不会创建一个全局变量被共享,示例代码如下:

var thisval = jQuery(this).val();

由于你只需要处理文本输入,因此可以直接使用DOM属性.value,如下所示:

jQuery(function() {
  jQuery('input[type=text]').each(function(i) {
    var thisval = this.value;
    jQuery(this).blur( function() {
        if (this.value == '') this.value = thisval;
    }).focus( function() {
        if (this.value == thisval) this.value = '';
    });
  });
});

1

这个变量是全局的,所以它会在每次循环中被替换。将其变成局部变量[在前面加上var],它就会像魔术一样工作。

你不应该一遍又一遍地创建jQuery(this)。那非常低效。jQuery(this)很昂贵。你应该将一个副本存储在变量中并使用该变量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接