JavaScript: синтаксическая ошибка отсутствует} после тела функции

Итак, вы знаете ошибку, но с какой стати я ее получаю? Я не получаю ошибок вообще, когда это выполняется локально, но когда я загрузил свой проект, я получил эту досадную синтаксическую ошибку. Я проверил консоль ошибок Firebug, которая не помогает, потому что она поместила весь мой источник в одну строку, и я проанализировал ее через Lint, которая, похоже, тоже не обнаружила проблему - я просто закончил форматирование скобок иначе, чем я ненавижу; на той же строке, что и заявление, блеф.

function ToServer(cmd, data) {
    var xmlObj = new XMLHttpRequest();
    xmlObj.open('POST', 'handler.php', true);
    xmlObj.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
    xmlObj.send(cmd + data);
    xmlObj.onreadystatechange = function() {
        if(xmlObj.readyState === 4 && xmlObj.status === 200) {
            if(cmd == 'cmd=push') {
                document.getElementById('pushResponse').innerHTML = xmlObj.responseText;
            }
            if(cmd == 'cmd=pop') {
                document.getElementById('messages').innerHTML += xmlObj.responseText;
            }
            if(cmd == 'cmd=login') {
                if(xmlObj.responseText == 'OK') {
                    self.location = 'index.php';
                }
                else {
                    document.getElementById('response').innerHTML = xmlObj.responseText;
                }
            }           
        }
    }
}

function Login() {
    // Grab username and password for login
    var uName = document.getElementById('uNameBox').value;
    var pWord = document.getElementById('pWordBox').value;
    ToServer('cmd=login', '&uName=' + uName + '&pWord=' + pWord);
}


// Start checking of messages every second
window.onload = function() {
    if(getUrlVars()['to'] != null) {
        setInterval(GetMessages(), 1000);
    }
}

function Chat() {
    // Get username from recipient box
    var user = document.getElementById('recipient').value;
    self.location = 'index.php?to=' + user;
}

function SendMessage() {
    // Grab message from text box
    var from = readCookie('privateChat');
    var to = getUrlVars()['to'];
    var msg = document.getElementById('msgBox').value;
    ToServer('cmd=push','&from=' + from + '&to=' + to + '&msg=' + msg);
    // Reset the input box
    document.getElementById('msgBox').value = "";
}

function GetMessages() {
    // Grab account hash from auth cookie
    var aHash = readCookie('privateChat');
    var to = getUrlVars()['to'];
    ToServer('cmd=pop','&account=' + aHash + '&to=' + to);
    var textArea = document.getElementById('messages');
    textArea.scrollTop = textArea.scrollHeight;
}

function readCookie(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for(var i=0;i < ca.length;i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1,c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
    }
    return null;
}

function getUrlVars() {
    var vars = {};
    var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) {
        vars[key] = value;
    });
    return vars;
}

Одна золотая интернет-медаль тому, кто сможет это решить.

Приветствия.

8 ответов

Решение

Проблема в том, что ваш скрипт на вашем сервере находится в одной строке, и у вас есть комментарии к нему. код после // будет рассматриваться как комментарий. Вот в чем причина.

function ToServer(cmd, data) {  var xmlObj = new XMLHttpRequest();  xmlObj.open('POST', 'handler.php', true);   xmlObj.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');   xmlObj.send(cmd + data);    xmlObj.onreadystatechange = function() {        if(xmlObj.readyState === 4 && xmlObj.status === 200) {          if(cmd == 'cmd=push') {             document.getElementById('pushResponse').innerHTML = xmlObj.responseText;            }           if(cmd == 'cmd=pop') {              document.getElementById('messages').innerHTML += xmlObj.responseText;           }           if(cmd == 'cmd=login') {                if(xmlObj.responseText == 'OK') {                   self.location = 'index.php';                }               else {                  document.getElementById('response').innerHTML = xmlObj.responseText;                }           }                   }   };}function Login() {   // Grab username and password for login var uName = document.getElementById('uNameBox').value;  var pWord = document.getElementById('pWordBox').value;  ToServer('cmd=login', '&uName=' + uName + '&pWord=' + pWord);}// Start checking of messages every secondwindow.onload = function() {    if(getUrlVars()['to'] != null) {        setInterval(GetMessages(), 1000);   }}function Chat() { // Get username from recipient box  var user = document.getElementById('recipient').value;  self.location = 'index.php?to=' + user;}function SendMessage() {    // Grab message from text box   var from = readCookie('privateChat');   var to = getUrlVars()['to'];    var msg = document.getElementById('msgBox').value;  ToServer('cmd=push','&from=' + from + '&to=' + to + '&msg=' + msg); // Reset the input box  document.getElementById('msgBox').value = "";}function GetMessages() {  // Grab account hash from auth cookie   var aHash = readCookie('privateChat');  var to = getUrlVars()['to'];    ToServer('cmd=pop','&account=' + aHash + '&to=' + to);  var textArea = document.getElementById('messages'); textArea.scrollTop = textArea.scrollHeight;}function readCookie(name) {    var nameEQ = name + "=";    var ca = document.cookie.split(';');    for(var i=0;i < ca.length;i++) {        var c = ca[i];        while (c.charAt(0)==' ') c = c.substring(1,c.length);        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);    }    return null;}function getUrlVars() {    var vars = {};    var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) {        vars[key] = value;    });    return vars;}

Похоже, это интерпретируется как все в одной строке. Смотрите те же результаты в fiddler2.

Я думаю, что вы можете адаптировать методологию " разделяй и властвуй" здесь. Удалите последнюю половину вашего скрипта и посмотрите, не придет ли ошибка, если не удалите первую часть и посмотрите. Это техника, которой я следую, когда у меня возникает такая проблема. Как только вы найдете половину с ошибкой, разделите эту половину дальше, пока не укажете место ошибки.

Это поможет нам определить фактическую точку ошибки.

Я не вижу никаких проблем с этим скриптом.

Возможно, это не точное решение, которое вы хотите, а способ найти и решить вашу проблему.

Вы пропустили точку с запятой:

function ToServer(cmd, data) {
    var xmlObj = new XMLHttpRequest();
    xmlObj.open('POST', 'handler.php', true);
    xmlObj.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
    xmlObj.send(cmd + data);
    xmlObj.onreadystatechange = function() {
        if(xmlObj.readyState === 4 && xmlObj.status === 200) {
            if(cmd == 'cmd=push') {
                document.getElementById('pushResponse').innerHTML = xmlObj.responseText;
            }
            if(cmd == 'cmd=pop') {
                document.getElementById('messages').innerHTML += xmlObj.responseText;
            }
            if(cmd == 'cmd=login') {
                if(xmlObj.responseText == 'OK') {
                    self.location = 'index.php';
                }
                else {
                    document.getElementById('response').innerHTML = xmlObj.responseText;
                }
            }           
        }
    }; //<-- Love the semi
}

Дополнительная пропущенная точка с запятой:

// Start checking of messages every second
window.onload = function() {
    if (getUrlVars()['to'] != null) {
        setInterval(GetMessages(), 1000);
    }
}; //<-- Love this semi too!

Эта проблема может возникнуть из-за того, что в вашем коде JS комментарии минимизированы. Если это так, и вы хотите оставить свои комментарии, попробуйте изменить свои комментарии - например, из этого:

// Reset the input box

... до...

/* Reset the input box */

Добавление примечания: очень странно, эта ошибка была очень случайной, все работало нормально.

Syntax error missing } after function body | At line 0 of index.html

Похоже, что я использую /**/ а также // с некоторыми причудливыми символами юникода в разных частях моих скриптов для разных комментариев.

Это полезно для меня, для ясности и для разбора.

Но если этот символ Unicode и, возможно, некоторые другие используются в файле js в комментариях перед выполнением js, ошибка возникала случайно.

Это может быть связано с тем фактом, что js-файлы не являются UTF8 перед вызовом и чтением родительской страницей, это utf8, когда DOM готов. Не могу сказать.

Если это может помочь!

Кажется, в следующем коде тоже нужно добавить еще одну половину

// Start checking of messages every second
window.onload = function() {
    if(getUrlVars()['to'] != null) {
        setInterval(GetMessages(), 1000);
    }
};  <---- Semi added

Также здесь, в этом коде, определите var верхняя часть функции

function readCookie(name) {
    var i;
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for(i=0;i < ca.length;i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1,c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
    }
    return null;
}

Надеюсь, что это поможет вам

"Хм, я думаю, что нашел ключ... Я использую notepad++ и до недавнего времени использовал мой файловый менеджер cpanel для загрузки своих файлов. Все было хорошо, пока я не использовал FTP-клиент FireZilla. Я предполагаю, что FTP-клиент меняет формат или кодирование моих файлов JS и PHP. - "

Я считаю, что это была ваша проблема (вы, вероятно, уже решили ее). Я только что попробовал другой FTP-клиент после столкновения с этой глупой ошибкой, и она работала без нареканий. Я предполагаю, что код, который я использовал (который был написан другим разработчиком), также неправильно закрывает комментарии.

Другие вопросы по тегам