7

わかりました、エラーはわかりますが、一体なぜエラーが発生するのでしょうか?

これをローカルで実行するとエラーはまったく発生しませんが、プロジェクトをアップロードすると、この厄介な構文エラーが発生しました。すべてのソースを同じ行に配置したため、役に立たない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;
}
4

8 に答える 8

20

問題は、サーバー上のスクリプトが 1 行であり、その中にコメントがあることです。以降のコード//はコメントとみなされます。それが理由です。

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;}
于 2012-08-14T03:13:31.487 に答える
2

この問題は、コメントが縮小されている JavaScript コードが原因で発生する可能性があります。その場合、コメントを保持したい場合は、コメントを変更してみてください。たとえば、次のようにします。

// Reset the input box

...に...

/* Reset the input box */

于 2016-04-29T16:41:23.627 に答える
2

ここで分割統治法を適用できると思います。スクリプトの後半を削除して、エラーが発生するかどうかを確認してください。そうでない場合は、最初の部分を取り除いて確認してください。これは、このような問題が発生したときに私が従うテクニックです。エラーのある半分を見つけたら、その半分をさらに分割して、エラーの場所を特定します。

これは、エラーの実際のポイントを特定するのに役立ちます。

このスクリプトに問題はありません。

これはあなたが望む正確な解決策ではないかもしれませんが、問題を特定して修正する方法です。

于 2012-08-14T03:08:52.113 に答える
2

セミコロンがありません:

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!
于 2012-08-14T03:05:14.010 に答える
2

ここに画像の説明を入力してください

すべてが 1 行にあると解釈されているようです。Fiddler 2で同じ結果を参照してください。

于 2012-08-14T03:17:23.167 に答える
1

次のコードにも別のセミコロンを追加する必要があるようです:

// Start checking of messages every second
window.onload = function() {
    if(getUrlVars()['to'] != null) {
        setInterval(GetMessages(), 1000);
    }
};  <---- Semicolon 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;
}
于 2012-08-14T03:15:48.147 に答える
1

「うーん、手がかりを見つけたと思います...私はメモ帳++を使用しており、最近までcPanelファイルマネージャーを使用してファイルをアップロードしていました.FireZilla FTPクライアントを使用するまではすべて問題ありませんでした.FTPクライアントがJS および PHP ファイルのフォーマットまたはエンコーディング。 – "

これはあなたの問題だと思います(おそらくすでに解決しています)。この愚かなバグに遭遇した後、別の FTP クライアントを試したところ、問題なく動作しました。私が使用したコード (別の開発者によって作成されたもの) も、コメントを正しく閉じていないと思います。

于 2014-08-21T21:24:49.427 に答える