Javascript 如果对象内容是用户生成的,如何正确转义对象的JSON字符串?

Javascript 如果对象内容是用户生成的,如何正确转义对象的JSON字符串?,javascript,html,json,escaping,user-input,Javascript,Html,Json,Escaping,User Input,我想使用vars作为选项元素的值字段。如何正确地转义以包含用于键和值的用户输入 var key='highway'; var value='track'; var s = JSON.stringfy({ [key]:value }, undefined,''); s = s.replace(/'/g,'\\\'').replace(/"/g,'\\"'); var h = '<option type="text" value="' + s + '">'+key+'</optio

我想使用var
s
作为选项元素的值字段。如何正确地转义以包含用于键和值的用户输入

var key='highway'; var value='track';
var s = JSON.stringfy({ [key]:value }, undefined,'');
s = s.replace(/'/g,'\\\'').replace(/"/g,'\\"');
var h = '<option type="text" value="' + s + '">'+key+'</option>';
// ...
document.getElementById('aSelectElement').innerHTML = h;
var key='highway';var值='track';
var s=JSON.stringfy({[key]:value},未定义,');
s=s.replace(/“/g,\\\”)。replace(/“/g,\\\”);
var h=“”+键+“”;
// ...
document.getElementById('aSelectElement')。innerHTML=h;
Edit:实际上,我将其用于option元素,而不是前面提到的input元素

如果我在浏览器中选择结果,并让它显示生成的html,它会显示如下内容:

<option value="{\" highway\":\"track\"}"="">highway track</option>
公路轨道

这就增加了一个问题,为什么在高速公路前面有空白

不需要将HTML构建为字符串;可以通过编程方式创建输入元素并设置其值:

// ...
var inputElem = document.createElement('input');
inputElem.type = 'text';
inputElem.value = s;
// ..
document.getElementById('aDiv').appendChild(inputElem);

请注意,这并不完全相同,因为设置
innerHTML
会从div中删除所有现有内容,但调用
appendChild
则不会。如果确实需要替换现有内容,可以先替换。

我还建议使用DOM元素进行编译,而不是像另一个答案那样将HTML构建为字符串。但是如果您真的不想这样做,您可以将JSON中的任何双引号转换为HTML实体
,这样它们就不会终止
value
属性

var键='first';
var值=‘测试’;
var s=JSON.stringify({
[键]:值
},未定义“”)。替换(/“/g,”);
var h='';
document.getElementById('aDiv')。innerHTML=h;

我不太喜欢appendChild语法。最糟糕的是它触发了Firefox(我相信是30版左右)让http地址旁边顶部的加载动画运行。人们会认为该程序会连接到internet,而它是一个100%离线应用程序。好吧,如果出于某种原因您绝对必须避免
appendChild
,您可以将输入元素创建为一个带有空值的HTML字符串,但给它一些这样您就可以执行
document.getElementById('the_input')).value=s
。解决方案仍然是以编程方式设置
.value
。另一个问题:您建议或正在使用哪个html、javascript和php编辑器?var声明
var-value:'test';
语法无效。应为
var-value='test';
代码
{[key]:value}
应为
{key:value}
。你不能在Javascript对象或JSON对象中使用数组作为键。当你使用非字符串的键时,Javascript会默默地将其转换为字符串。@kaya3从ES6开始这是可行的:哦,你是对的。我记得以前见过这种语法,但我自己并不是为ES6编写的。使用
”“
在替换中,而不是我首先使用的”“\\\”“,它确实有效。Ty!很自然。HTML不使用反斜杠进行转义。现在你这么说了,这很明显。:)另一个问题:你建议或正在使用哪个HTML、javascript和php编辑器?