2016-08-07 2 views
2

Я получаю этуAjax синтаксис: Uncaught SyntaxError: Неожиданный идентификатор

Uncaught SyntaxError: Unexpected identifier error

, почему? Я думаю, что я правильно использовал синтаксис?

// I've revised it 
var json; 
json = '{"1438905600":0,"1438992000":0}'; 
setTimeout($('#example-heatmap').each(function() { 
    if(json != null){ 
    var obj = $.parseJSON(json); 
    var now = new Date(); 
    new CalHeatMap().init({ 
     data: obj, 
     start: new Date(2016, 0), 
     cellSize: 11, 
     range: 9, 
     domain: 'month', 
     domainLabelFormat: '%Y-%m', 
     itemSelector: '#example-heatmap', 
     legend: [1, 3, 5, 7], 
     legendColors: { 
     min: '#efefef', 
     max: 'steelblue', 
     empty: '#efefef' 
     }, 
      tooltip: true 
     //start: new Date(now.getFullYear(), now.getMonth() - 9) 
    }); 
    } else { 
     setTimeout(arguments.callee, 100); 
    } 
})); 
+0

У вас это в теге 'script' в вашем HTML-файле, правильно? Не в отдельном файле JavaScript? –

+4

Несомненно, ошибка указывает, в какую строку включена ошибка, потому что код, который вы отправили, вообще не вызывает эту ошибку –

+0

Извините, я пересмотрел его. – syui

ответ

0

Вы передаете вызов jQuery#each в setTimeout, но setTimeout ожидает функцию или строку, содержащую блок кода JavaScript. jQuery#each не возвращается.

Возвращаемое значение преобразуется в строку [object Object], и это то, что вызывает синтаксическую ошибку.

Чтобы исправить это, создайте функцию лямбда, чтобы содержать ваш вызов jQuery#each:

setTimeout(function() { 
    $('#example-heatmap').each(function() { 
     if (json != null) { 
      var obj = $.parseJSON(json); 
      var now = new Date(); 
      new CalHeatMap().init({ 
       data: obj, 
       start: new Date(2016, 0), 
       cellSize: 11, 
       range: 9, 
       domain: 'month', 
       domainLabelFormat: '%Y-%m', 
       itemSelector: '#example-heatmap', 
       legend: [1, 3, 5, 7], 
       legendColors: { 
        min: '#efefef', 
        max: 'steelblue', 
        empty: '#efefef' 
       }, 
       tooltip: true 
        //start: new Date(now.getFullYear(), now.getMonth() - 9) 
      }); 
     } else { 
      setTimeout(arguments.callee, 100); 
     } 
    }); 
}); 

Я должен сказать, однако, что то, что вы делаете выглядит очень Hacky. Вы используете arguments.callee, который теперь устарел, видимо, в попытке «подождать» при асинхронной операции. Вы должны правильно обрабатывать асинхронность, используя обратные вызовы или обещания.

+0

Большое спасибо за подробные объяснения. – syui

1

Я думаю, что ваш .replace() не подходит.

var tmp = content.replace('<![CDATA[').replace(']]>'); 

.replace() ожидает searchvalue и newvalue, как указано на W3Schools

string.replace(searchvalue,newvalue) 
+0

Это, вероятно, проблема, но отсутствие второго аргумента не приведет к синтаксической ошибке. – JLRishe

+0

@JLRishe yes ... это не будет, но я не могу найти никакой другой проблемы с этим кодом. – jaysingkar

+0

Извините, я пересмотрел его. – syui

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