проблема setTimeout в Firefox - PullRequest
       6

проблема setTimeout в Firefox

5 голосов
/ 09 декабря 2010

Система меню должна расширяться и сворачиваться в соответствии с заданной задержкой, используя следующие операторы (o_item.getprop('hide_delay') возвращает 200 и o_item.getprop('expd_delay') возвращает 0):

this.o_showtimer = setTimeout('A_MENUS['+ this.n_id +'].expand(' + n_id + ');',
  o_item.getprop('expd_delay'));

и

this.o_hidetimer = setTimeout('A_MENUS['+ this.n_id +'].collapse();',
  o_item.getprop('hide_delay'));

Я попытался поместить код для первого аргумента в отдельные функции и вызвать эти функции в качестве первого аргумента для setTimeout следующим образом:

this.o_showtimer = setTimeout( expandItem(this.n_id, n_id),
      o_item.getprop('expd_delay'));

Firebug выдал следующее сообщение об ошибке:

useless setTimeout call (missing quotes around argument?)

И в обвале не было никаких задержек.

Я поместил аргумент в кавычки (хотя рекомендуется против здесь ), например:

this.o_showtimer = setTimeout( "expandItem(this.n_id, n_id)",
  o_item.getprop('expd_delay'));

, ноэто не сработало.Оказалось, что ничего не происходит, и некоторые сообщения console.log () в код подтверждают это.

Я пытался использовать анонимный вызов функции, как рекомендовано здесь и здесь вот так:

this.o_showtimer = setTimeout( function() { expandItem(this.n_id, n_id); },
  o_item.getprop('expd_delay'));

но это тоже не сработало.Это привело к нежелательным результатам в IE (элементы не сворачивались так же, как раньше), и ничего не происходило в Firefox (размещение операторов console.log () в функциях expandItem и collapseItem подтвердило, что они не вызывались).

Я даже попытался сделать следующее:

this.o_hidetimer = setTimeout( function() { alert('test'); },
  o_item.getprop('hide_delay'));

, и это даже не сработало!Кажется, что-то не так с вызовом анонимной функции.

Обнаружено, что присвоение значения setTimeout переменной , отличной , чем this.o_showtimer, вызвало левый аргумент setTimeout fire.Должно быть что-то делать с назначением чего-либо для этого.

Если я сделаю это:

var o_showtimer = setTimeout( function() { expandItem(this.n_id, n_id); },
  o_item.getprop('expd_delay'));

, будет вызываться expandItem.Однако, если я сделаю это:

var o_showtimer = setTimeout( function() { expandItem(this.n_id, n_id); },
  o_item.getprop('expd_delay'));

 this.o_showtimer = o_showtimer;

Как будто setTimeout может предсказать будущее!(expd_delay равно 0!).

1 Ответ

5 голосов
/ 09 декабря 2010

Я думаю, что проблема в уникальном подходе Javascript к «этому».Когда вы вызываете «expandItem» в вашей анонимной функции, вы не вызываете его как метод, поэтому «this» устанавливается в фундаментальную область (окно).

Я бы предложил использовать локальную переменную

var that = this;
this.o_showtimer = setTimeout( function() { expandItem(that.n_id, n_id); },
  o_item.getprop('expd_delay'));
...