对于FireFox中的循环问题

时间:2010-02-02 16:11:58

标签: javascript prototypejs

我正在编写一个脚本,该脚本使用Prototype和LightView删除表单元素中的默认值。这些脚本在Safari中运行良好,但在FireFox(3.5.5)中完全没有。

触发光照时会触发。

document.observe('lightview:opened', function() {
            if($('contact_form')) {
                var defaults = new Array();
                var ins = $('contact_form').getElements();
                var inlen = ins.length;
                for(i=0; i < inlen; i++) {
                    alert(i)
                    if($(ins[i]).readAttribute('type') != 'image') {
                        defaults[ins[i].name] = $(ins[i]).value;
                        $(ins[i]).observe('focus', checkDefault.bind(event, ins[i]));

                    }

                }

                function checkDefault(name, event) {
                    alert(name.name)
                    if($(name).value == defaults[name.name]) {
                        alert(defaults[name.name])
                        $(name).value = '';
                    }
                }
        }
        });

奇怪的是,当我检查inlen的长度时,会提示正确的号码,但是当我提醒'i'时,只会提醒第一个号码。我无法弄清楚为什么会这样。

这里有什么想法吗?

以下是问题的地址: http://bearing.krd-design.net/

由于 富

3 个答案:

答案 0 :(得分:2)

我不确定这是否会导致该问题,但您遗漏了var

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

此外,在alert() s之后没有分号。

尝试纠正这些问题,看看它是否有所作为。

修改

正如Matt所指出的,在评论中:忽略var在全局范围内创建变量。如果prototypejs也使用全局变量i(但我真诚地怀疑),这可能会导致问题。

编辑2:

另一种可能性是通过输入名称访问数组:

defaults[ins[i].name] = $(ins[i]).value;

尝试将defaults声明为对象:

var defaults = {};

答案 1 :(得分:1)

这听起来像是时间问题;警报会将执行速度降低到代码在FF中运行的程度。你使用FireBug吗?

答案 2 :(得分:0)

首先,我认为只有i = 0可能是因为JS在第一次迭代中破坏了。要进行故障排除,我会在行之间放置alert()并查看哪条线正在破坏它。

我对这个问题的猜测应该在一行:

$(ins[i]).observe('focus', checkDefault.bind(event, ins[i]));

'bind'函数的第一个参数应该是context,你传入'event'。 'event'没有定义,它应该是上下文或范围。

在您的情况下,我认为您可以使用:

$(ins[i]).observe('focus', checkDefault(ins[i]));