2013-09-25 6 views
0

У меня есть страница HTML, содержащая div с текстом прокрутки справа налево; следующий JavaScript находится между тегами HEAD документа.Ошибка JavaScript: ожидаемый объект

function scroll(oid, iid) { 
      this.oCont = document.getElementById(oid); 
      this.ele = document.getElementById(iid); 
      this.width = this.ele.clientWidth; 
      this.n = this.oCont.clientWidth; 
      this.move = function() { 
       this.ele.style.left=this.n + "px" 
       this.n-- 
       if(this.n<(-this.width)){this.n=this.oCont.clientWidth} 
      } 
     } 
     var vScroll 
     function setup() { 
      vScroll = new scroll("oScroll", "scroll"); 
      setInterval("vScroll.move()", 20); 
      }   
     onload = function(){ 
      setup() 
     } 

     $("scroll").hover(function() { 
      $("scroll").stop(true, false) 
     }, function(){ 
      scroll(); 
     }); 
     scroll(); 

Прокручиваемый текст отлично работает; однако я хотел, чтобы прокрутка останавливалась при наведении мыши. Хотя текст перестает прокручиваться, когда курсор мыши проходит над div, я получаю ошибку javascript «Object expected». Я новичок в javascript и понятия не имею, где я ошибаюсь.

Любая помощь была бы принята с благодарностью.

+2

, к какой строке относится ошибка? Похоже, вы пытаетесь ссылаться на «это» вне надлежащего контекста. –

+0

. Страница на самом деле отображается в элементе управления WebBrowser в простом приложении WPF; Я думаю, что это должен быть браузер IE; изменение браузера по умолчанию не влияет на работу сообщения об ошибке. –

+0

@ user1748443: «Ожидаемый объект» - ошибка IE. Все другие браузеры дают гораздо более описательное и полезное сообщение об ошибке. Например: Chrome говорит, что 'vScroll не определен'. –

ответ

1

Ваша проблема с вашим setInterval. Вы передаете ему строку! Это позволяет использовать eval! Это означает, что код запускается в глобальной области, поэтому vScroll не существует.

Вместо передать функцию setInterval:

setInterval(function(){ 
    vScroll.move(); 
}, 20); 

функция передается setInterval вызывается с «контекстом» (this значение), установленным в null, так что вы не можете передать vScroll.move непосредственно setTimeout. Вы можете, однако. do:

setInterval(vScroll.move.bind(vScroll), 20); 

но это не работает во всех браузерах.

P.S. Передача строки в setInterval - это плохая практика, вы должны всегда передать функцию.

Смежные вопросы