2012-06-10 2 views
-2

Я только что проверил, что мой код javascript отлично работает во всех браузерах, кроме IE. Как возможно, что скрипт правильно читается и выполняется в Chrome, Safari ... но IE обнаруживает необъяснимую ошибку и отказывается запускать код?Код Javascript не работает только в IE

$(document).ready(function() { 
     var NewsNavigator = { 

      init: function(config) { 
       this.news = config.news; 
       this.newsNum = this.news.length; 
       this.navbuttons = config.navbuttons; 
       this.prevButton = config.prevButton; 
       this.nextButton = config.nextButton; 
       this.displayatonce = config.displayatonce; 
       this.maxSteps = Math.ceil(this.newsNum/this.displayatonce); 
       this.counter = 0; 
       this.navigateNews(); 
       this.enableNav(); 
       this.checkButtonsVisibility(); 

      }, 

      showNews: function() { 
       var start = this.counter * this.displayatonce; 
       var end = this.counter * this.displayatonce + (this.displayatonce - 1); 
       for (i=start; i<=end; i++) { 
        this.news.eq(i).show(); 
       } 

      }, 

      hideAllNews: function() { 
       console.log("hiding news"); 
       this.news.hide(); 
      }, 

      navigateNews: function() { 
       this.hideAllNews(); 
       this.showNews(); 
      }, 

      checkButtonsVisibility: function() { 
       if (this.counter <= 0) 
       { 
        this.prevButton.css('visibility', 'hidden'); 
       } 
       else 
       { 
        this.prevButton.css('visibility', 'visible'); 
       } 

       if (this.counter >= this.maxSteps - 1) 
       { 
        this.nextButton.css('visibility', 'hidden'); 
       } 
       else 
       { 
        this.nextButton.css('visibility', 'visible'); 
       } 
      }, 

      enableNav: function() { 
       self = this; 
       this.navbuttons.on('click', function(event) { 
        if (($(this).data('dir') === 'prev') && (self.counter > 0)) { 
         self.counter--; 
         self.navigateNews(); 
        } else if (($(this).data('dir') === 'next') && (self.counter < self.maxSteps - 1)) { 
         self.counter++; 
         self.navigateNews(); 
        } 
       self.checkButtonsVisibility(); 
       event.preventDefault(); 
       }); 
      } 
     }; 

     NewsNavigator.init({ 
      news: $('div#cat-news').find('div.oneCol'), 
      displayatonce: 3, 
      navbuttons: $('div#nav').find('a'), 
      prevButton: $('div#nav a.prec'), 
      nextButton: $('div#nav a.succ') 
     }); 
}); 

Сообщение об ошибке в IE9

SCRIPT438: The object doesn't support the 'checkButtonsVisibility' property or method. 
NewsNavigator.js, Row 69 Character 5 
+2

Мы не можем помочь, не видя ваш javascript. – Aidanc

+0

@ haunted85 Все браузеры имеют свои тонкие отличия в том, как JavaScript взаимодействует с документами, а также о том, какая версия ECMAScript (и какая версия) реализована. Вам нужно будет показать нам свой код для дальнейшей помощи. – Sampson

+0

Также убедитесь, что у вас нет объектных литералов с запятыми прямо перед закрытием '}' – Pointy

ответ

2

Используйте яваскрипт инструмент для проверки, таких как JSLint, чтобы обеспечить максимальную Compability. Это, поскольку один пропущенный символ (например, ;, ' и т. Д.) Может привести к тому, что ваш сценарий не будет запущен в определенных браузерах.

JSLint также предоставит различные советы о том, что делать и не делать, чтобы обеспечить еще большую совместимость.

+2

JSLint не гарантирует максимальную совместимость. Некоторые вещи просто принципиально разные, особенно в отношении обработки событий, таких как 'attachEvent' /' addEventListener' или 'event.srcElement' /' event.target' –

+0

@FelixKling, в то время как вы абсолютно правы - это, безусловно, повышает совместимость по крайней мере , хотя он не гарантирует, что он будет работать во всех браузерах. Если вы не согласны с моим ответом, не стесняйтесь редактировать его (тем более, что английский не является моим родным языком - мои слова могут иногда быть немного неуместными) или проголосовать за него. – Zar

1

Хорошо, что сводится к истории JavaScript.

JavaScript был реализован на основе ECMAScript:

http://en.wikipedia.org/wiki/ECMAScript

Каждый поставщик один веб-браузер (Mozilla, Google, Microsoft) решили, что они не хотят, чтобы стандартизировать JavaScript и каждый из них придумал их собственная реализация ECMAScript и, следовательно, их собственный механизм JavaScript.

Таким образом, у программистов возникает головная боль, пытающаяся написать JavaScript, совместимый со всеми этими разными механизмами JavaScript, потому что каждый из них читает JavaScript по-своему (что отвечает на ваш вопрос о том, почему IE обнаруживает какую-то необъяснимую ошибку, а остальная часть 't)

Веселый факт. Только реализация Mozilla ECMAScript на самом деле называется «JavaScript».

Вы должны найти, как писать JavaScript, который является кросс-совместимым для разных движков JavaScript.

+0

На самом деле, если мы педантичны, ECMAScript был основан на оригинальном JavaScript Netscape; то есть JavaScript был выпущен для общественности, прежде чем работа над этой спецификацией была даже начата. – Pointy

+0

Проблемы имеют очень мало общего с разницей между JScript и JavaScript. Большинство из них доходят до различий с API-интерфейсами DOM и браузерами, которые не реализовали функции в новых версиях JavaScript (1.6 и более поздних). – Quentin

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