将字符串转换为变量java

时间:2011-03-15 08:14:14

标签: javascript string dhtmlx

我喜欢

字符串
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);
    }

2 个答案:

答案 0 :(得分:0)

如果你{1}}你的字符串s,你将获得一个具有3个拥有属性的普通对象。然后,您可以使用json_decode构造循环这些属性:

for..in

答案 1 :(得分:0)

你的问题有点不清楚,但是 - 我会试着猜猜你在说什么,涵盖所有情况并给予一些附加价值;)

我假设你在JSP页面中有一个服务器端字符串,其值是

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

是什么让它看起来像

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

现在你想把它写到文档中,以便稍后可以for使用客户端代码。

从这个意义上说 - 你需要区分几个案例。

虽然当服务器将其写入响应文档时,它是一个字符串 - 客户端代码可以以不同的方式获取此值。在所有这些中 - 服务器必须以特定方式写入数据,以便客户端可以访问它,但是,有效性规则是不同的。

写一个对象文字

实际上 - 我认为这就是你要做的事情。 客户端代码不会将其作为字符串 - 而是作为对象文字。

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

这种选择的限制是无论来自服务器代码(在<%%>内)和来自标记的任何内容(在<%%>之外)都必须作为有效的JavaScript对象文字一起工作。 有许多东西可以破坏这个Object文字的合法性 - 比如断字符串,缺少逗号,缺少冒号等等。虽然这是推荐的方式 - 你必须知道你在做什么,我建议你把这些知识搞定,你的榜样是一个好的开始。

在您的示例中 - 这将呈现为有效的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>

这部分将确保您从服务器获取所有数据到客户端,并且客户端可以访问它。从那里开始 - 这是您自己的协议,即在客户端上提供数据并解析它。

然而,并不总是建议这样做:如果您所提供的所有内容都可以表示为Object Literal - 它会更好 - 因为浏览器会在编译代码中处理您的解析,并为脚本代码做好准备制作对象。

除非你想解析你自己的字符串协议,否则它会得到与以下相同的结果,为什么还要费心呢?最好safeJs你的价值观。

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

将字符串写入TextArea的内容

这是在服务器和HTML客户端之间传递字符串的最强大方法 - 因为唯一可以破解的方法 - 是数据字符串是否包含TextArea的结束标记。

文本区域不受换行符的影响,它不会引用引号(单引号和双引号),它唯一的弱点是它自己的结束标记。

请注意将“”替换为“&lt; textarea&gt;”和“”与“&lt; textarea&gt;”。

为文本区域分配ID并将其放入style="display:none"确保它不会打扰用户界面,但仍然可以访问。

<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 您可以这样做而不是document.write - 使用容器标记来标记select的位置,并在DOM完成加载后将其注入其中。

它与第一种方式相同,只有一个区别:相反document.write(HTML); - 放一个容器,说<span id="oSelectPlace"></span>你想要的选择,然后使用 document.getElementById("oSelectPlace").innerHTML = HMTL;