2011-03-15 91 views
0

我有我的字符串像字符串轉換爲可變的Java

5: "White", 6: "Yellow", 7: "Pink" 

我需要這樣的

s={5: "White", 6: "Yellow", 7: "Pink"}; 

爲它附加該字符串以期形式選擇

for (var a in myOpts) 
    { 
     var t = document.createElement("OPTION"); 
     t.value = a; 
     t.appendChild(document.createTextNode(myOpts[a])); 
     selectObj.appendChild(t); 
    } 
+5

你確定你的意思是**的Java **而不是** JavaScript **? – Gabe 2011-03-15 08:16:32

回答

0

如果你json_decode你的字符串s,你會得到一個擁有3個屬性的普通對象。然後你可以在與for..in構建這些屬性的循環:

var myOpts, s='{5: "White", 6: "Yellow", 7: "Pink"}'; 
eval('myOpts='+s); // or better, a json parser 
for(var a in myOpts) { 
    if(myOpts.hasOwnProperty(a)) { 
     // your dom code here 
    } 
} 
0

你的問題有點不清楚,但是 - 我會嘗試猜你在說什麼,涵蓋所有情況,並給予一點點附加值; )

我假定你有一個JSP頁面的服務器側弦,誰的價值是

5: "White", 6: "Yellow", 7: "Pink" 

是什麼使得它看起來像

<% 
String data = "5: \"White\", 6: \"Yellow\", 7: \"Pink\""; 
%> 

現在你想寫它到文檔,所以你可以for它稍後在客戶端代碼。

從這個意義上說 - 你需要區分少數情況。

儘管當服務器將它寫入響應文檔時,它是一個字符串 - 客戶端代碼可以通過不同的方式獲取此值。在所有這些服務器中 - 服務器必須以特定的方式寫入數據,以便客戶端可以訪問它,但是,有效性規則是不同的。

寫對象文本

其實 - 我認爲這是你想要做什麼。 客戶端代碼不會將其作爲字符串獲取 - 而是作爲對象字面值。

<script> 
var sObjData = {<%= safeJs(data) %>}; 
</script> 

這種選擇的限制是,無論從服務器代碼(<%%>內)來和任何來自標記(所述<%%>外)必須作爲一個有效的JavaScript一起工作對象常量。 有很多事情可以打破這個對象文字的合法性 - 就像破碎的字符串,丟失的逗號,缺少冒號等等。雖然這是推薦的方法 - 你必須知道你在做什麼,並且我建議你將這些知識分開,你的例子是一個好的開始。

在你的例子中 - 這呈現爲一個有效的JavaScript Object-Literal,並且問題不在那裏。

<script> 
var sObjData = {5: "White", 6: "Yellow", 7: "Pink"}; 
</script> 

這是一個完全合法的對象字面可以在for使用 - 只要你的方式。

這可能是你的例子是簡化你的情況,你使用的字符串可能會破壞你的執行。以下是如何處理來自服務器字符串客戶代碼:

寫JavaString串

在這種情況下的極限 - 是在data字符串的字符可能會破壞JavaSctipt strinbngs - 必須進行轉義爲javascript

這裏我只是看待整個data的值,但請記住,您可能希望對您在此data中放入的每個值都做同樣的處理。

這裏有一個解釋,就是逃避JavaScript的Java字符串最簡單的實現:

<%! 
    String safeJs(String data){ 
     return data.replace("\"","\\\"") //why three? two emit a sigle \ and the third escape the " 
        .replace("'","\\'") 
        .replace("\n","\\n") //why two? you're not escaping n, your're emitting \ and n 
        .replace("\r","\\r"); // that will render as escaping for the client code 
    } 
%> 
<script> 
var sObjData = '<%= safeJs(data) %>'; 
<script> 

這部分將確保你從服務器到客戶端獲取所有數據,而這將是訪問客戶端。從那裏 - 這是你自己的協議,在客戶端傳遞數據並解析它。

但是,並不總是建議這樣做:如果您所提供的所有內容都可以制定爲對象文字 - 它會更好 - 因爲瀏覽器會在您編寫的代碼中處理您的解析並給出腳本代碼現成的物體。

除非你想解析你自己的字符串協議,看起來 - 它得到了相同的結果以下,所以爲什麼要麻煩?更好地爲safeJs您的價值觀。

<script> 
var sObjData = '<%= safeJs(data) %>'; 
var oObjData = eval("{" + oObjData + "}"); 
<script> 

寫入字符串到文本區的內容

這是通過服務器和HTML客戶端之間串的最可靠的方法 - 因爲這可以打破的唯一的事情 - 就是如果數據字符串包含TextArea的結束標記。

文本區域不受換行符的影響,引號是單引號(雙引號),它唯一的弱點是它自己的結束標籤。

請注意,將「」替換爲「< textarea>」和「」替換爲「< textarea>」。

爲文本區域分配一個ID並將其放入style="display:none"可確保它不會打擾UI,但仍可訪問。

<textarea style="display:none" id="txtData"><%=data.replace("</","&lt;/")%></textarea> 
<script> 
    var s = document.getElementById("txtData"); 
</script> 

createElement作品選擇

的DHTML竅門建築選擇,但是,我很少使用它,因爲它的麻煩,而且性能非常低。 但是 - 如果您設法正確編寫了對象文字 - 它應該可以工作。

注入HTML

而不是創造一個選擇,並試圖填充它 - 它是更快,更可靠,完全把它注射到DOM。

我用下面的工具爲:

function getStringBuffer(){ 
    var bfr = []; 
    bfr.add = function() { 
     for(var i=0;i<arguments.length;i++) { 
      this[this.length] = arguments[i]; 
     } 
    } 
    bfr.toString = function() { return this.join("") } 
    return bfr; 
} 

(function(){})()的包裹創建一個匿名函數,並立即執行它 - 即確保不被聲明爲這項工作的變量將影響全局範圍。

第一種方式 - 使用document.write

<script> 
(function(){ 
    var HTML = getStringBuffer(); 
    var k; 

    HTML.add("<select id='selectObj'>"); 
    for (k in myOpts) { 
     HTML.add("<option value='", k, "'>", myOpts[k],"</option>"); 
    } 
    HTML[HTML.length] = "</select>"; 

    document.write(HTML); //note the overriden toString method that will be called here 
})(); 
</script> 

第二種方法 - 使用的innerHTML 你可以做同樣的,而是文件撰寫 - 使用容器標籤來標記選擇的地方,有它注入即使在DOM完成加載之後。

是一樣的第一種方式,在一個區別:不是document.write(HTML); - 放一個容器,說<span id="oSelectPlace"></span>您要選擇是,然後用 document.getElementById("oSelectPlace").innerHTML = HMTL;