Случаи возникновения ошибки в IE: "Предполагается наличие идентификатора, строки или числа" (Expected identifier, string...)

Случаи возникновения ошибки в IE: "Предполагается наличие идентификатора, строки или числа" (Expected identifier, string...) Разбираемся отчего может возникать ошибка только в Internet Explorer:  "Предполагается наличие идентификатора, строки или числа" (Expected identifier, string or number).

Рассмотрим код в котором возникает ошибка. Причём ошибка только в браузере IE (у меня IE8), в остальных браузерах с этим нормально.

Неправильно:

...
delete : function() {   // delete в кавычках, чтобы работало в IE!
               if(confirm('Совсем-совсем удалить эту запись?')) {
...
                  delEvent(calEvent); // удаляем из БД при редактировании
                  $dialogContent.dialog("close");
                  }
},
cancel : function() {
$dialogContent.dialog("close");
}, // <-- здесь не должно быть запятой
}
	        }).show();

Это первый случай ошибки, который много где уже описан. Когда заканчивается перечисление переменных, то после последнего элемента не нужно ставить запятую. Internet Explorer считает это ошибкой и вообще не будет выполнять весь код, не откроет сайт (календарь FullCalendar в моём случае).

Но даже удалив запятую, ошибка не исчезнет. Именно этот случай у меня и возник (запятую ткнул для общности решения проблемы). При просмотре текста ошибки:

Error: Предполагается наличие идентификатора, строки или числа ( Expected identifier, string or number” )

Оказывается в браузере Internet Explorer слово delete - зарезервированное слово и просто так вводить переменную delete нельзя. Решение проблемы: заключить в одинарные кавычки, вот так - 'delete'.

Правильный код, который будет работать в IE:

...
'delete' : function() {   // delete в кавычках, чтобы работало в IE!
               if(confirm('Совсем-совсем удалить эту запись?')) {
...
                  delEvent(calEvent); // удаляем из БД при редактировании
                  $dialogContent.dialog("close");
                  }
},
cancel : function() {
$dialogContent.dialog("close");
}
}
       }).show();
Вот что сказал stackoverflow по поводу - Possible cases for Javascript error: “Expected identifier, string or number”
stackoverflow.com - это очень толковый и крупный ресурс, лично я решил с его помощью около 70-80% всех своих косяков, хотя сначала не верил в его силу; только придётся перевести проблему и сформулировать на английском.

----------------------

Using the word class as a key in a Javascript dictionary can also trigger the dreaded "Expected identifier, string or number" error because class is a reserved keyword in Internet Explorer.

BAD

{ class : 'overlay'} // ERROR: Expected identifier, string or number

GOOD

{'class': 'overlay'}

When using a reserved keyword as a key in a Javascript dictionary, enclose the key in quotes.

Hope this hint saves you a day of debugging hell.

------------------------

А здесь можно видеть список зарезервированных слов, чтобы уже не натыкаться (как видим save и close сюда не входят, поэтому их можем не брать в кавычки).

 

Список зарезервированных переменных для JavaScript, избегайте называть переменные зарезервированными словами!

abstract   else   instanceof   super  
boolean   enum   int   switch  
break   export   interface   synchronized  
byte   extends   let   this  
case   false   long   throw  
catch   final   native   throws  
char   finally   new   transient  
class   float   null   true  
const   for   package   try  
continue   function   private   typeof  
debugger   goto   protected   var  
default   if   public   void  
delete   implements   return   volatile  
do   import   short   while  
double   in   static   with  

 

Источник: loco.ru

almix
Разработчик Loco, автор статей по веб-разработке на Yii, CodeIgniter, MODx и прочих инструментах. Создатель Team Sense.

Вы можете почитать все статьи от almix'а.



Другие статьи по этой теме:

Комментарии (1)     Подпишитесь на RSS комментариев к этой статье.

1 комментарий

#907
Андрей говорит:
July 3, 2013 at 12:40 am

Такая же фигня в IE возникает со словом start. Причем тут еще смешнее: в половине случаев работает, а в половине нет.

В приведенном ниже коде при нажатии на строку текста все работает, а при нажитии на кнопку выдает ошибку "Предполагается наличие функции".

/-----------------------------------------

<!DOCTYPE HTML>
 <html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Java Script</title>
</head>

<body>
<b><p id="ajax" onclick='start("ajax", "Нажата строка")'>Нажми меня</p></b>
<input type='button' onclick='start("ajax", "Нажата кнопка")' value='Нажми меня'>

<script type="text/javascript">
function start(pName, sText) {
var el = document.getElementById(pName);
el.innerHTML = sText;
}
</script>
</body>
</html>

/-----------------------------------------

В firefox и chrom код этот исполняется без проблем. Замена имени функции start на start0 приводит к тому, что и в IE все начинает работать.