2013-02-04 7 views
14

私はこれで1日を過ごして、グーグルで答えを探しましたが、それでも分かりませんでした。なぜ私はいつも「Uncaught SyntaxError:Unexpected token u」をChromeから取得していますか?

私のコードは少し長く、Firefoxではうまくいきますが、Chromeから「Uncaught SyntaxError:Unexpected token u」を取得します。

私が間違っている場所を誰かが指摘できますか?前もって感謝します!

// when the page loads, list all the current contacts 
$(document).ready(function(){ 

    // check if localStorage database exists 
    if(!localStorage.getItem("customerDatabase")){ 

     // define a JSON object to hold all current address 
     var contacts = { 
      "users":[ 
       { 
        "id":"1", 
        "name":"dennis", 
        "email":"[email protected]" 
       }, 
       { 
        "id":"2", 
        "name":"zoe", 
        "email":"[email protected]"    
       } 
      ] 
     } // end of contacts JSON object 

     // stringify the object 
     var stringObject = JSON.stringify(contacts);     

     // store it into localStorage database 
     var storedDatabase = localStorage.setItem("customerDatabase", stringObject);            

    } else { 
     // list all customers upon page loads 
     listJSONCustomers();   
    } 

    // list all current contacts from JSON object in localStorage 
    function listJSONCustomers(){ 

     var displayHTML = ""; 
     var i; 

     // get the data from localStorage 
     var storedDatabase = localStorage.getItem("customerDatabase"); 

     // parse the data from string to JSON object 
     var parseObject = JSON.parse(storedDatabase); 

     // access the users key of the JSON object 
     var userObject = parseObject.users; 

     // get the length of the object (how many customers the database has) 
     var contactsLength = userObject.length;  

     for(i=0; i<contactsLength; i++){ 
      var trElement = '<tr id="address' + (i+1) + '">'; 
      var tdId = '<td id="id' + (i+1) + '">' + userObject[i].id + '</td>'; 
      var tdName = '<td id="name' + (i+1) + '">' + userObject[i].name + '</td>'; 
      var tdEmail = '<td id="email' + (i+1) + '">' + userObject[i].email + '</td>'; 
      var tdButton = '<td id="button"><button id="editButton' + userObject[i].id + '">Edit</button> | <button id="deleteButton' + userObject[i].id + '">Delete</button></td>'; 

      displayHTML += trElement + tdId + tdName + tdEmail + tdButton + '</tr>'; 
     }  

     $('#address_list').html(displayHTML);   
    }  

    // add customer to database 
    $('#saveCustomer').click(function(){ 

     if($('#customerName').val() !== "" && $('#customerEmail').val() !== ""){ 

      var customerName = $('#customerName').val(); 
      var customerEmail = $('#customerEmail').val(); 

      // get the data from localStorage 
      var storedDatabase = localStorage.getItem("customerDatabase"); 

      // parse the data from string to JSON object 
      var parseObject = JSON.parse(storedDatabase);  

      // access the users key of the JSON object 
      var userObject = parseObject.users;  

      // get the new entry 
      var newCustomerObject = { 
            "id": userObject.length + 1, 
            "name": customerName, 
            "email": customerEmail 
            }; 

      // push the new entry into the object                
      userObject.push(newCustomerObject); 

      // convert the object into string for localStorage 
      var stringObject = JSON.stringify(parseObject);   

      // store the JSON object into localStorage 
      var storedDatabase = localStorage.setItem("customerDatabase", stringObject); 

      // list all customes again every time a database receives a new entry 
      listJSONCustomers();  

     } else { 
      alert("Please enter customer's name and email."); 
     } 

    }); // end of $('#saveCustomer').click(); 


}); 
+0

私はこのコードをコピーして通過するとクロムにそのエラーは発生しません。エラーがこのファイルに属していることを確認してください。拡張? –

+1

おそらく、以前からローカルストレージに破損しているものがありますか? 'parse()'を呼び出す前に文字列を出力すると、それは正しく見えますか?このエラーに基づいて、localstorageの値にはあなたの ''ユーザー ''キーの周りに引用符はありません。 – loganfsmyth

+0

@loganfsmyth、parse()を呼び出す前に文字列を表示しましたが、Firefoxは素敵な文字列を返しますが、Chromeは「未定義」を返します。しかし、どうしたの? – Dennisboys

答えて

18

ある時点で、そのキーのLocalStorageの値が破損していました。 LocalStorageは文字列を格納することしかできないので、何か他のものを渡すと文字列に変換されます。この場合

var value; 
localStorage.setItem('key', value); 

valueが文字列されていない、undefinedです。あなたの値は'undefined'あるので、それはあなたがおそらく事故でこのような何かをしたいくつかの点で、ということを意味しますこれが保存されると、変換されます。残念ながら、"undefined"は有効なJSONではありません。つまり、解析しようとすると例外がスローされます。

問題を解決するには、removeItemで間違った値をクリアする必要があります。

localStorage.removeItem("customerDatabase"); 
+1

しかし、なぜfirefoxは未定義の代わりに素敵な文字列を与えていたのですか?この問題はクロムのみで現れました。質問に記載されています。 Dennisboysは、クロムのみを印刷すると定義されないという質問にコメントしています。 – ALBI

+0

@ALBIこれはローカル記憶域を使用しているため、値は* before *からコードが正しく見えることがあります。おそらく、彼はChromeで開発していたのですが、ある時点でタイプミスがあったため、Chromeの値は正しくありませんでした。それがFirefoxにロードされるまでに、コードは正しいので、Firefoxは決して壊れた記憶値を得ませんでした。 – loganfsmyth

+0

よろしいです..ありがとうloganfsmyth。 – ALBI

関連する問題