2016-08-07 17 views
2

Ich erhalte dieseAjax Syntax: Uncaught Syntaxerror: Unerwartete Kennung

Uncaught SyntaxError: Unexpected identifier error

, Warum? Ich denke, ich habe die Syntax richtig verwendet?

// 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

Sie haben dies in Ihrem HTML ein 'Skript'-Tag, oder? Nicht in einer separaten JavaScript-Datei? –

+4

Sicherlich zeigt der Fehler an, in welcher Zeile der Fehler liegt - weil der von Ihnen gepostete Code überhaupt keinen Fehler erzeugt –

+0

Entschuldigung, ich habe ihn überarbeitet. – syui

Antwort

0

Sie passieren einen Aufruf an jQuery#each in setTimeout, aber setTimeout erwartet eine Funktion oder einen String einen JavaScript-Code-Block enthält. jQuery#each gibt keine zurück.

Der zurückgegebene Wert wird in die Zeichenfolge [object Object] konvertiert, und dies verursacht den Syntaxfehler.

Um dies zu beheben, eine Lambda-Funktion erstellen Ihren Anruf jQuery#each enthalten:

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); 
     } 
    }); 
}); 

Ich muss allerdings sagen, dass das, was man sieht sehr hacky tun. Sie verwenden arguments.callee, das jetzt veraltet ist, anscheinend in einem Versuch, auf eine asynchrone Operation zu warten. Sie sollten stattdessen die Asynchronität ordnungsgemäß behandeln, indem Sie Rückrufe oder Versprechen verwenden.

+0

Vielen Dank für die detaillierten Erklärungen. – syui

1

Ich denke, Ihre .replace() ist nicht korrekt.

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

.replace() erwartet searchvalue und newvalue als auf bestimmten W3Schools

string.replace(searchvalue,newvalue) 
+0

Das ist wahrscheinlich ein Problem, aber das zweite Argument würde nicht zu einem Syntaxfehler führen. – JLRishe

+0

@JLRishe ja ... es wird nicht, aber ich kann kein anderes Problem mit diesem Code finden. – jaysingkar

+0

Sorry, ich habe es überarbeitet. – syui