0

好的,所以这里有一个关于 Firefox 没有响应 window.event 的问题,这里经常被问到,你需要在函数中添加一个额外的参数。我对此没有任何问题;我的问题是,如果我想从不同的 Javascript 函数中分配事件侦听器,我该怎么做?

基本上,我想要做的是一个常见的效果,当你可以有一个带有灰色文本的表单框,例如,“你的名字......”然后当你单击框时,文本消失并且颜色变为黑色;unfocus 框仍然为空,提示文本将返回。

现在,我没有直接为我想要使用它的每个页面编写代码,而是尝试创建一个可以使用表单 ID 调用的函数,它会自动将其应用于每个输入元素。这是代码:

function fadingForm(formElementID, endColor)
{
  var form = document.getElementById(formElementID);

  for(var i = 0; i < form.elements.length; i++)
  {
    form.elements[i].originalValue = form.elements[i].value;
    form.elements[i].originalColor = form.elements[i].style.color;
    form.elements[i].changedColor  = endColor;

    // Somehow I need to get that event parameter in here I guess?
    // I tried just putting the variable event in as a parameter,
    //   but as you'd expect, that doesn't work.
    form.elements[i].onfocus = function() { focused(); };
    form.elements[i].onblur  = function() { blurred(); };
  }
}

function focused(e)
{
  evt = e || window.event;
  element = evt.target;

  if(element.value == "" || element.value == element.originalValue)
  {
    element.value = "";
    element.style.color = element.changedColor;
  }
}

function blurred(e)
{
  evt = e || window.event;
  element = evt.target;

  if(element.value == "" || element.value == element.originalValue)
  {
    element.value = element.originalValue;
    element.style.color = element.originalColor;
  }
}

当然,这在 Chrome、Safari 等中非常有效……只是在 Firefox 中不行。

4

1 回答 1

1

您的事件侦听器focusedblurred接受事件对象e,但您从不提供事件对象。提供给匿名包装函数的事件对象从不使用也不传递给focused/ blurred。因此,e始终未定义。

相反,当您设置侦听器时,请执行以下操作:

form.elements[i].onfocus = function(e) { focused(e); };
form.elements[i].onblur  = function(e) { blurred(e); };

甚至:

form.elements[i].onfocus = focused;
form.elements[i].onblur  = blurred;

以便将事件对象直接传递到您的侦听器函数中。

于 2012-12-13T01:19:20.197 回答