2010-07-29 34 views
0

試圖學習json由於工作需要...我試圖添加和刪除記錄到json對象動態...可以有人告訴我爲什麼我不斷收到UNDEFINED消息....這裏是代碼..感謝您的幫助!Json in Javascript

<html> 
<head> 
<title>TEST</title> 
<script language="Javascript" type="text/javascript"> 
function addC(){ 


    var index = document.getElementById('type').selectedIndex; 
    var type = document.getElementById('type').options[index].value; 
    var name = document.getElementById('inpName').value; 
    var date = document.getElementById('inpDate').value; 

    processJson(type,name,date); 

    return false; 
} 

function processJson(type,name,date){ 

    var count = document.getElementById('counter').value*1; 
    var currentRecords = document.getElementById('holder').value; 
    var newRecordType = "{\"name\":\""+type+"\","; 
    var newRecordName = "\"type\":\""+name+"\","; 
    var newRecordDate = "\"date\":\""+date+"\"}"; 
    var newRecord = newRecordType + newRecordName + newRecordDate; 

    if(count > 0){ 
    newRecord = "," + newRecord; 
    } 
    var updatedRecord = currentRecords + newRecord; 


    var jsonObj = {"allrows" : "["+updatedRecord+"]"}; 
    document.getElementById('counter').value=(document.getElementById('counter').value *1)+ 1; 
    document.getElementById('holder').value=updatedRecord; 
} 

function deleteRow(){ 
    var toDel = document.getElementById('inpDel').value; 
    alert(toDel); 
    var current = "[" + document.getElementById('holder').value + "]"; 
    alert(current); 
    var jsonO = {"allRows" : current}; 
    alert(jsonO); 
    var t = jsonO.allRows[toDel].type; 
    alert("Deleting - " + t); 
    return false; 
} 

</script> 




</head> 

<body> 
<form name="frm" action=""> 
<table> 
<tr> 
    <td> 
    <select name="type" id="type"> 
    <option value="creator">Creator</option> 
    <option value="editor">Editor</option> 
    <option value="publisher">Publisher</option> 
    </select> 
    </td> 
    <td> 
    <input type="text" name="inpName" id="inpName" value=""> 
    </td> 
    <td> 
    <input type="text" name="inpDate" id="inpDate" value=""> 
    </td> 
    <td> 
    <input type="text" name="inpDel" id="inpDel" value=""> 
    </td> 
    <td> 
    <input type="button" name="cmdAdd" value="Add" onClick="return addC();"> 
    <input type="button" name="cmdAdd" value="Del" onClick="return deleteRow();"> 
    </td> 
</tr> 
<tr> 
    <td><input type="text" name="counter" id="counter" value="0"> 
</tr> 
<tr> 
    <td colspan="3"> 
    <textarea name="holder" id="holder" rows="20" cols="60"></textarea> 

    </td> 
</tr> 
</form> 
</body> 
</html> 
+3

你操縱JSON(串)。餿主意。只需使用實際的JavaScript對象。 – MvanGeest 2010-07-29 09:51:22

+0

雖然可能不是。你究竟想要做什麼?你需要什麼JSON? – MvanGeest 2010-07-29 09:56:34

+0

無論如何,在http://jsfiddle.net/jdGWM/上創建了一個jsFiddle。 'window.addC'只是一個解決方法。 – MvanGeest 2010-07-29 09:57:16

回答

0

這不是你正在玩的JSON。這是javascript對象。授予JSON代表「JavaScript對象符號」,但它通常指的是通過電線發送的序列化對象。

好了,介紹對象文本中的javascript:

  1. 對象的格式{鍵:值,鍵:值},其中的關鍵部分並不需要,如果它不被引用一個關鍵字。

  2. 數組的格式爲[value,value]。

  3. 數組實現爲對象。

  4. 要在對象訪問的值,使用以下表示法中的一種:

    object.key 
    object['key'] 
    

    注意的是,第二符號意味着你可以使用一個變量作爲鍵。

  5. 由於磁盤陣列只是對象,您可以訪問值陣列以同樣的方式:

    array[index] 
    

所以,做什麼,我認爲你正在試圖做的,我會做這樣的:

首先,一個簡單的函數把對象的字符串:

// WARNING! : simple toString function. You should probably 
// use a better one 
function toString (obj) { 
    if (!isNaN(obj))    return ''+obj; 
    if (obj === true)   return 'true'; 
    if (obj === false)   return 'false'; 
    if (obj === null)   return 'null'; 
    if (obj === undefined)  return 'undefined'; 
    if (typeof obj == 'string') return '"'+obj+'"'; 
    if (obj instanceof String) return '"'+obj+'"'; 
    var ret=""; 
    if (obj instanceof Array) { 
     ret += "["; 
     for (var i=0;i<obj.length;i++) { 
      ret += toString(obj[i]); 
     } 
     ret += "]"; 
    } 
    else { 
     ret += "{"; 
     for (var i in obj) { 
      if (obj.hasOwnProperty(i)) { 
       ret += toString(i); 
       ret += ':'; 
       ret += toString(obj[i]); 
      } 
     } 
     ret += "}"; 
    } 
    return ret; 
} 

現在,其餘代碼:

var counter_el = document.getElementById('counter'); 
var count = counter_el.value*1; 

// WARNING! : eval is a quick and dirty JSON deserializer 
// normally should not be used but is good enough for 
// this example: 
eval('var currentRecords = ' + document.getElementById('holder').value); 
var newRecord = { 
    name : type, 
    type : name, 
    date : date 
} 

if(count > 0){ 
    currentRecords.allrows.push(newRecord); 
} 
else{ 
    currentRecords = { allrows : [ newRecord ] }; 
} 

counter_el.value=(counter_el.value*1)+ 1; 
document.getElementById('holder').value=toString(currentRecords);