проблема setTimeout и mouseout - PullRequest
2 голосов
/ 25 июля 2010

У меня есть этот код:

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 секунд, а затем - для сделать чеки

Ответы [ 3 ]

3 голосов
/ 25 июля 2010

Измените ваш setTimeout следующим образом:

setTimeout(beforemouseout ,3000); 

В противном случае он ищет beforemouseout в глобальном контексте, и если ваш код там отсутствует (он внутри / ограничен)к другому закрытию любого вида), это не найдет это.Здесь я предполагаю, что это обработчик ready, потому что вы размещаете HTML прямо рядом с ним, то есть вы берете фрагменты.

С общей точки зрения, никогда не передавайте строку в setTimeout() илиsetInterval() Если вы можете избежать этого, это приведет ко многим нежелательным побочным эффектам ... как этот.Вместо этого передайте прямую ссылку, как у меня выше, чтобы быть полностью явной и понятной ... заставить ее работать:)


Изменить (для комментариев к вопросу) : кажется, чтовы на самом деле после этого все еще немного отличается от того, что написано.Из того, что я понял, вы хотите отложить до восстановления значения по умолчанию <input>.Есть несколько способов сделать это, вот один:

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

Вы можете попробовать это здесь .

1 голос
/ 25 июля 2010

Да, не передавайте строку в качестве параметра функции setTimeout, надеюсь, вы все сделаете. Кстати, я думаю, что setTimeout здесь не требуется. Вы заполняете поле 'title', если оно пустое каждый раз, когда отсутствует мышь. если вы используете setTimeout и mouseout вместе, это увеличит ваш вызов функции в геометрической прогрессии. Я думаю, вы понимаете мою точку зрения. Спасибо

0 голосов
/ 25 июля 2010

Измените $(".other").mouseout(beforemouseout); на это:

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