2013-11-23 42 views
-1

我有以下按鈕:當它在用戶點擊下面的JavaScript函數將啓動奇怪的JavaScript行爲 - JSON.parse:意外的字符

<button onclick='enroll(<?php echo $course['cs_id']; ?>)'>enroll</button> 

function enroll(id){ 
    $.post("<?php echo base_url().'courses/enroll/'; ?>"+id , function(data){ 
    obj = JSON.parse(data); 
    alert(obj.state); 
    }); 
    } 

其執行後請求php頁面回顯json數組像這樣:

$data = array("state"=>"done"); 
die(json_encode($data)); 

但不幸的是下面出現在控制檯錯誤:

JSON.parse:意外的字符

我檢查了頁面響應和它的外觀像這樣(這似乎罰款):

{"state":"done"} 

還當我改變報名()功能如下:

function enroll(id){ 
$.post("<?php echo base_url().'courses/enroll/'; ?>"+id , function(data){ 
alert(data); 
}); 
} 

其顯示如下正確的提醒信息:

{"state":"done"} 

那麼爲什麼它拒絕做解析的一切似乎好嗎?任何想法 ?

回答

1

我的猜測是你的代碼實際上比你想象的更好!我認爲jQuery從服務器接收到您的JSON並意識到它是JSON,即使您沒有這樣指定它。 (也許你的PHP發送一個Content-Type頭文件?)

所以data實際上已經是一個Javascript對象,jQuery已經從你的JSON中解碼出來了。當您在對象上調用JSON.parse時,它將轉換爲字符串[object Object],然後進行解析。 [object Object]顯然是無效的JSON,因此意外的字符錯誤。


由於串明顯有效的JSON,我的下一個猜測是,有以前是一些數據,這是造成解析器會不高興的字符串。最好的測試方法是String#charCodeAt,它顯示了字符串中給定點的精確字符。

所以,用下面的代碼,我們可以測試,看看有什麼字符串中的第一個字符是:

console.log(data.charCodeAt(0)); 

你說,這將返回65279,其中,在一個Unicode文件的開始,是一個byte order mark。你顯然是在你的服務器端代碼中輸出這個地方。你需要找出它的位置並將其刪除。

+0

所以它應該當我做這個警報(data.state)工作;而不解析數據,但是當我這樣做時,它會在警報消息中顯示「未定義」。 – OpEtMaR

+1

@OpEtMaR你可以在瀏覽器控制檯上檢查它,然後,而不是做'alert'? '控制檯。dir'會給你最多的信息。 – lonesomeday

+0

它顯示:undefined,沒有屬性 – OpEtMaR

1

不要再分析數據:

function enroll(id){ 
$.post("<?php echo base_url().'courses/enroll/'; ?>"+id , function(data){ 
    alert(data.state); 
}); 
} 
+0

當我這樣做時,警報消息顯示「未定義」 – OpEtMaR