【问题标题】:Function setTimeout throws error函数 setTimeout 抛出错误
【发布时间】:2013-01-26 23:48:48
【问题描述】:

我的 setTimeout 函数有问题。这是代码:

1   var urlArray = ["pic1.gif"; "pic2.gif"]

2   function changeBackground(elementId, backgroundImage){
3       document.getElementById(elementId).style.background="url("+backgroundImage+")";
4   }

5   function mouseover_1(elementId){
6           changeBackground(elementId,urlArray[0]);
7           setTimeout("changeBackground(elementId,urlArray[1])",300);
8   }

在体内:

<area shape="rect" coords="0,0,95,91" onMouseOver="mouseover_1('navigator_1')">

现在,Javascript 代码中的第 6 行就像一个魅力(图片改变了!),但第 7 行不起作用(图片没有改变)。这是在 Firefox 中调试的错误:

elementId is not defined  line: 7

但由于第 6 行有效,我真的不知道问题出在哪里。你有什么建议吗?

【问题讨论】:

标签: javascript variables settimeout


【解决方案1】:

如果您将字符串传递给setTimeout,则不会在您的函数上下文中评估该字符串(因此elementId 不存在)。

您应该改用闭包:

setTimeout(function()
{
    changeBackground(elementId, urlArray[1]);

}, 300);

【讨论】:

  • 奇怪,但是这个洞的setTimeout函数对我来说没有意义,我想写setTimeout(changeBackground(elementId,urlArray[1]),300),但这也没有用.您是否解释了为什么其他解决方案不起作用?
  • setTimeout(changeBackground(... 会调用changeBackground 并将结果作为参数传递给setTimeout
  • 嗯,这对我来说似乎很奇怪,因为“setTimeout”应该只做一个暂停,然后调用传递的参数。由于 IE 需要它,我仍然可能会使用您的解决方案。谢谢。 (啊,我明白了: setTimeout(300,changeBackground(elementId,urlArray[1])) 将是完美的方法,但遗憾的是这是不可能的;)
【解决方案2】:

你可以试试这个形式给setTimeout函数传参数:

setTimeout(changeBackground, 300, elementId, urlArray[1]);

在这里你可以看到其他的形式来做同样的事情:

Passing parameters to a function called with setTimeout

【讨论】:

  • 这很好用,谢谢!你知道一个网站(某种“API”),我可以在其中找到这么酷的功能吗?还是您只是通过反复试验才找到的?
  • 这里有几种方法link
  • @elclanrs:比起那些庞大的教程,我更愿意寻找一个简单的库。所有可能的功能及其实现的简单列表。教程通常太有限,我也知道一些。 ;D
  • @Marcus:MDN 不是教程,是 JavaScript 的参考。把它想象成来自 Mozilla 的免费 JS 圣经。它是“以正确的方式”学习 JS 的最佳资源之一。
  • 这个链接也不错:stackoverflow.com/questions/555726/…
【解决方案3】:

阅读后:http://www.makemineatriple.com/2007/10/passing-parameters-to-a-function-called-with-settimeout

...我了解到需要一个“parameter = null”并最终实现了一个闭包:

setTimeout(function(){changeBackground(elementId,urlArray[1]);
    parameter = null},300);

但是 setTimeout() 函数必须始终包裹在一个 setInterval() 线程中,否则它不会顺利运行。

【讨论】:

  • parameter = null 由于 IE 中的垃圾收集问题需要,您将在上面链接的第一个评论中找到更多信息(由 jdurango 提供)。
猜你喜欢
  • 2012-08-23
  • 2016-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-21
  • 2023-03-12
  • 2020-03-01
  • 1970-01-01
相关资源
最近更新 更多