【问题标题】:setTimeout and mouseout problemsetTimeout 和 mouseout 问题
【发布时间】:2010-07-26 01:57:16
【问题描述】:

我有这个代码:

function beforemouseout() {
  if ($(this).val() == '') {
    $(this).val($(this).attr('title'));

  } 
  else {

  }
  setTimeout('beforemouseout()',3000); 
}
$(".other").click(function() {
  $(this).val('');  
  $(".other").mouseout(beforemouseout);
});
<input id="hour" type="text" class="other" autocomplete="off" value="hour" title="hour" />
<input id="hour" type="text" class="other" autocomplete="off" value="minutes" title="minutes" />

但是 Firebug 给了我一个错误:没有定义 beforemouseout。 为什么? 我在 jsfiddle.net 上尝试过它并没有给出错误,但结果不是我所期望的。当我单击 #hour 隐藏文本以及触发 onmouseout 等待 5 秒然后 - 时,我期望做检查

【问题讨论】:

  • 您的代码真的是这样吗?因为如果是这样,我认为您不会收到该错误。 Firebug 说错误发生在哪一行代码?
  • 您可以将setTimeout('beforemouseout()',3000) 重写为setTimeout(beforemouseout,3000),这样效率更高,因为不必进行运行时评估。
  • 我在 jsfiddle.net 上尝试过,它没有给出错误,但结果不是我所期望的。当我点击 #hour 隐藏文本和触发 onmouseout 时,我期望等待 5 秒,然后 - 进行检查
  • @lam3r4370 - 这是你想要的吗?:jsfiddle.net/nick_craver/qKxjZ
  • @lam3r4370 - 好 :) 我在下面添加了这个作为示例,这与问题无关,但你永远不知道,它可能会帮助其他人。

标签: javascript jquery settimeout mouseout


【解决方案1】:

像这样改变你的 setTimeout:

setTimeout(beforemouseout ,3000); 

否则它会在 global 上下文中寻找beforemouseout,并且如果您的代码不在其中(它在内部/范围为任何类型的另一个闭包),它将找不到它.我在这里猜测它在 ready 处理程序中,因为您在它旁边发布了 HTML,这意味着您正在使用 sn-ps。

从整体的角度来看,如果可以避免的话,永远不要将字符串传递给setTimeout()setInterval(),它会导致许多不需要的副作用......就像这个一样。相反,像我上面那样传递一个直接引用,完全明确并且很好......让它工作:)


编辑(针对问题 cmets):看起来你实际上在写的内容与它写的有点不同。根据我收集的信息,您希望在将默认值恢复为&lt;input&gt; 之前延迟。有几种方法可以做到这一点,这里是一种:

function beforemouseout() {
  if ($(this).val() == '') {
    $(this).val($(this).attr('title'));
  }
}
$(".other").click(function() {
  $(this).val('').mouseout(function() {
    setTimeout($.proxy(beforemouseout, this), 3000);
  });
});

You can give it a try here。 ​

【讨论】:

  • 我相信beforemouseoutthis的值在从setTimeout()调用时会不正确。
  • @patrick - 这就是$.proxy() 的用途;) 试一试演示,看看它是否正常工作
【解决方案2】:

是的,不要将字符串作为 setTimeout 函数的参数传递,希望你能完成。 顺便说一句,我认为这里不需要 setTimeout。如果每次鼠标退出时它都是空的,则您正在用“标题”填充该字段。如果你同时使用 setTimeout 和 mouseout 会增加你的函数调用指数。我想你理解我的观点。
谢谢

【讨论】:

  • 我认为这根本不正确。编写代码的方式,该函数应该对任何引用它的人都是可见的。如果代码位于 document.ready 处理程序中,或者它只是全局范围内的代码,那将是正确的。
【解决方案3】:

$(".other").mouseout(beforemouseout); 更改为:

$(".other").mouseout(function(){ 
  beforemouseout();
});

【讨论】:

  • 这无济于事,破坏this 参考实际上会受到伤害,这将指向window 而不是您答案中的元素:) beforemouseout.apply(this); 会起作用.. .但是写已经有效的东西真的很长而且更昂贵:)
  • @Nick: 保留 .other 然后添加函数 sn-p 即可。
  • 我不关注你......无论如何,最好用代码更正你的答案,因为其他人稍后会发现这个:)
猜你喜欢
  • 2012-06-08
  • 2012-04-24
  • 1970-01-01
  • 1970-01-01
  • 2011-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多