我喜欢
字符串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);
}
答案 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("</","</")%></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;