2013-02-04 85 views
14

我已经花了整整一天的时间,使用Google搜索并寻找答案,但仍然无法弄清楚。为什么我总是从Chrome中获得“Uncaught SyntaxError:Unexpected token u”?

我的代码有点长,它在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()'之前打印字符串,它看起来是否正确?根据错误,本地存储值不会在你的''用户“键上引用引号。 – loganfsmyth

+0

@loganfsmyth,我在调用parse()之前打印了字符串,Firefox返回一个不错的字符串,但Chrome返回'undefined'。但那是怎么回事? – Dennisboys

回答

18

在某些情况下,您确实损坏了LocalStorage对该密钥的价值。 LocalStorage只能存储字符串,所以如果你传递任何东西给它,它会将它转换为一个字符串。因为你的价值是'undefined',这意味着,在某些时候,你可能没有事故是这样的:

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

在这种情况下,valueundefined,这不是一个字符串。当它被保存时,它将被转换。不幸的是,"undefined"是无效的JSON。这意味着当它试图解析时,它会抛出异常。

要解决您的问题,您应该清除与removeItem出错的值。

localStorage.removeItem("customerDatabase"); 
+1

但是,为什么Firefox给一个不错的字符串,而不是未定义的。这个问题只出现在Chrome上,不是?如问题中所述。正如Dennisboys所评论的那样,只有在打印时才会出现未定义的问题。 – ALBI

+0

@ALBI由于这是使用本地存储,因此值可能来自*之前*代码看起来正确。也许他是在Chrome中开发的,并且曾经有过一个错字,所以Chrome的价值不正确。当它在Firefox中加载时,代码是正确的,所以Firefox永远不会有损坏的存储值。 – loganfsmyth

+0

好的,谢谢loganfsmyth。 – ALBI

相关问题